一个机构化的数据库,建立在关系模型基础上,通常面向于记录
包括oracle、mysql、sqlserver、db2mysql
除了主流的关系型数据库意外的数据库,都人为是非关系型的
包括redis、mongdb、hbase、couhdbc++
- 对数据库高并发读写需求
- 对海量数据高效存储与访问需求
- 对数据库高可扩展性与高可用需求
Redis基于内存运行并支持持久化redis
采用key-value(键值对)的存储形式算法
- 具备极高的数据读写速度
- 支持丰富的数据类型
- 支持数据的持久化
- 原子性
- 支持数据备份
[root@localhost ~]# yum install gcc gcc-c++ make -y ##安装环境组件 [root@localhost ~]# mkdir /mnt/tools [root@localhost ~]# mount.cifs //192.168.100.100/tools /mnt/tools/ ##挂载 Password for root@//192.168.100.100/tools: [root@localhost ~]# cd /mnt/tools/redis/ [root@localhost redis]# ls redis-5.0.7.tar.gz [root@localhost redis]# tar xf redis-5.0.7.tar.gz -C /opt/ ##解压 [root@localhost redis]# cd /opt/ [root@localhost opt]# ls redis-5.0.7 rh [root@localhost opt]# cd redis-5.0.7/ [root@localhost redis-5.0.7]# make #编译 ..........//省略过程 [root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis/ install ##安装 ..........//省略过程
[root@localhost redis-5.0.7]# cd utils/ [root@localhost utils]# ./install_server.sh ##执行脚本进行配置 Welcome to the redis service installer This script will help you easily set up a running redis server Please select the redis port for this instance: [6379] ##默认端口 Selecting default: 6379 Please select the redis config file name [/etc/redis/6379.conf] ##配置文件 Selected default - /etc/redis/6379.conf Please select the redis log file name [/var/log/redis_6379.log] ##日志文件 Selected default - /var/log/redis_6379.log Please select the data directory for this instance [/var/lib/redis/6379] ##数据文件 Selected default - /var/lib/redis/6379 Please select the redis executable path [] /usr/local/redis/bin/redis-server ##可执行文件路径 Selected config: Port : 6379 Config file : /etc/redis/6379.conf Log file : /var/log/redis_6379.log Data dir : /var/lib/redis/6379 Executable : /usr/local/redis/bin/redis-server Cli Executable : /usr/local/redis/bin/redis-cli Is this ok? Then press ENTER to go on or Ctrl-C to abort. Copied /tmp/6379.conf => /etc/init.d/redis_6379 Installing service... Successfully added to chkconfig! Successfully added to runlevels 345! Starting Redis server... Installation successful! [root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/ ##便于系统识别 [root@localhost utils]# netstat -ntap | grep 6379 ##查看监听端口 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 18004/redis-server [root@localhost utils]# /etc/init.d/redis_6379 stop ##关闭redis Stopping ... Redis stopped [root@localhost utils]# netstat -ntap | grep 6379 ##查看监听端口 tcp 0 0 127.0.0.1:6379 127.0.0.1:33970 TIME_WAIT - [root@localhost utils]# /etc/init.d/redis_6379 start ##开启redis Starting Redis server... [root@localhost utils]# netstat -ntap | grep 6379 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 18091/redis-server tcp 0 0 127.0.0.1:6379 127.0.0.1:33970 TIME_WAIT - [root@localhost utils]# [root@localhost utils]# vim /etc/redis/6379.conf ##修改配置文件 bind 127.0.0.1 192.168.52.149 ##设置监听地址 [root@localhost utils]# /etc/init.d/redis_6379 restart ##重启redis服务 Stopping ... Redis stopped Starting Redis server... ###Redis数据库基础操做 [root@localhost utils]# redis-cli -h 192.168.52.149 -p 6379 ##登陆redis 192.168.52.149:6379> help @list ##获取帮助列表 BLPOP key [key ...] timeout summary: Remove and get the first element in a list, or block until one is available since: 2.0.0 ...............................//省略部份内容 RPUSHX key value summary: Append a value to a list, only if the list exists since: 2.2.0 192.168.52.149:6379> help set ##help帮助 SET key value [expiration EX seconds|PX milliseconds] [NX|XX] summary: Set the string value of a key since: 1.0.0 group: string 192.168.52.149:6379> set name zhangsan ##设置键值对 OK 192.168.52.149:6379> set net www OK 192.168.52.149:6379> KEYS * ##查看全部的键 1) "name" 2) "net" 192.168.52.149:6379> KEYS n?? ##查看键是n开头后面是两个字符的 1) "net" 192.168.52.149:6379> KEYS n* ##查看键是n开头的 1) "name" 2) "net" 192.168.52.149:6379> GET net ##查看键的值 "www" 192.168.52.149:6379> EXISTS net ##查看键是否存在 (integer) 1 ##1是存在,0是不存在 192.168.52.149:6379> EXISTS nat (integer) 0 192.168.52.149:6379> del net ##删除键 (integer) 1 192.168.52.149:6379> KEYS * 1) "name" 192.168.52.149:6379> type name ##查看键的类型 string 192.168.52.149:6379> rename name n1 ##给键重命名 OK 192.168.52.149:6379> KEYS * 1) "n1" 192.168.52.149:6379> get n1 "zhangsan" 192.168.52.149:6379> hset person score 80 ##用hash方式创建键值对 (integer) 1 192.168.52.149:6379> hset person name zhangsan ##用hash方式创建键值对 (integer) 1 192.168.52.149:6379> hset person age 30 ##用hash方式创建键值对 (integer) 1 192.168.52.1490:6379> KEYS * 1) "person" 192.168.52.149:6379> hget person name ##获取键的值 "zhangsan" 192.168.52.149:6379> hget person age ##获取键的值 "30" 192.168.52.149:6379> set name lisi ##获取键的值 OK 192.168.52.149:6379> KEYS * 1) "name" 2) "person" 192.168.52.149:6379> EXPIRE name 10 ##设置键的自动删除时间10s (integer) 1 192.168.52.149:6379> KEYS * ##10s内查看全部键 1) "name" 2) "person" 192.168.52.149:6379> KEYS * ##10s后查看全部键 1) "person" 192.168.52.149:6379> exit ##退出
[root@localhost utils]# redis-benchmark -h 192.168.52.149 -p 6379 -c 100 -n 100000 ##并发100,100000个请求 ====== SET ====== 100000 requests completed in 1.14 seconds ##请求花费的时间 100 parallel clients 3 bytes payload keep alive: 1 84.66% <= 1 milliseconds 98.48% <= 2 milliseconds 99.69% <= 3 milliseconds 99.90% <= 18 milliseconds 100.00% <= 18 milliseconds 87642.41 requests per second ====== GET ====== 100000 requests completed in 1.13 seconds 100 parallel clients 3 bytes payload keep alive: 1 [root@localhost utils]# redis-benchmark -h 192.168.52.149 -p 6379 -q -d 100 ##以字节形式指定set/get值的数据大小 SET: 90497.73 requests per second GET: 90991.81 requests per second
[root@localhost utils]# redis-cli -h 192.168.52.149 -p 6379 ##进入Redis 192.168.52.149:6379> KEYS * 1) "mylist" 2) "counter:__rand_int__" 3) "n1" 4) "key:__rand_int__" 5) "myset:__rand_int__" 192.168.52.149:6379> SELECT 10 ##进入第11个库 OK 192.168.52.149:6379[10]> KEYS * (empty list or set) 192.168.52.149:6379[10]> SELECT 0 ##进入第1个库 OK 192.168.52.149:6379> MOVE n1 10 ##移动键值对到第11个库 (integer) 1 192.168.52.149:6379> KEYS * 1) "mylist" 2) "counter:__rand_int__" 3) "key:__rand_int__" 4) "myset:__rand_int__" 192.168.52.149:6379> SELECT 10 ##进入第11个库 OK 192.168.52.149:6379[10]> KEYS * ## 查看键 1) "n1" 192.168.52.149:6379[10]> GET n1 "zhangsan" 192.168.52.149:6379[10]> FLUSHDB ##清除库中数据 OK 192.168.52.149:6379[10]> KEYS * ##查看全部键 (empty list or set) 192.168.52.149:6379[10]> SELECT 0 ##切换到第一个库 OK 192.168.52.149:6379>KEYS * ##查看全部的键 1) "myset:__rand_int__" 2) "mylist" 3) "key:__rand_int__" 4) "counter:__rand_int__" 192.168.52.149:6379> exit [root@localhost utils]#
Redis是运行在内存中,内存中的数据断电丢失
为了能后重用Redis数据,或者防止系统故障,咱们须要将Redis中的数据写入到磁盘空间中,即持久化sql
- RDB方式:建立快照的方式获取某一时刻Redis中全部数据的副本
- AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
Redis的默认持久化方式
默认文件名dump.rdb数据库
- 在指定的时间间隔内,执行指定次数的写操做(配置文件控制)
- 执行save或者是bgsave(异步)命令
- 执行flushall命令,清空数据库全部数据
- 执行shutdown命令,保证服务器正常关闭且不丢失任何数据
- 适合大规模的数据恢复
- 若是业务对数据完整性和一致性要求不高,RDB是很好的选择
- 数据的完整性和一致性不高
- 备份时占用内存
将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务便可vim
[root@localhost utils]# vim /etc/redis/6379.conf #900秒以内至少一次写操做 save 900 1 #300秒以内至少发生10次写操做 save 300 10 #60秒以内发生至少10000次写操做 save 60 10000 #只要知足其一都会触发快照操做,注释全部的save项表示关闭RDB #RDB文件名称 dbfilename dump.rdb #RDB文件路径 dir /var/lib/redis/6379 #开启压缩功能 rdbcompression yes
Redis默认不开启
弥补RDB的不足(数据的不一致性)
采用日志的形式来记录每一个写操做,并追加到文件中
Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工做缓存
将appendonly.aof文件拷贝到redis安装目录的bin目录下,重启redis服务便可服务器
[root@localhost utils]# vim /etc/redis/6379.conf #开启AOF持久化 appendonly yes #AOF文件名称 appendfilename "appendonly.aof" #always:同步持久化,每次发生数据变化会马上写入磁盘 # appendfsync always #everysec:默认推荐,每秒异步记录次(默认值) appendfsync everysec #no:不一样步,交给操做系统决定如何同步 # appendfsync no #忽略最后一条可能存在问题的指令 aof-load-truncated yes
AOF的工做原理是将写操做追加到文件中,文件的冗余内容会愈来愈多
当AOF文件的大小超过所设定的阀值时,Redis就会对AOF文件的内容压缩数据结构
Redis会fork出一条新进程,读取内存中的数据(并无读取旧文件),并从新写到一个临时文件中,最后替换旧的aof文件
[root@localhost utils]# vim /etc/redis/6379.conf #在日志进行BGREWRITEAOF时, 若是设置为yes表示新写操做不进行同步fsync, #只暂存在缓冲区里,避免形成磁盘I0操做冲突,等重写完成后在写入。redis中默认为no no-appendfsync-on-rewrite no #当前AOF文件大小是上第二天志重写时AOF文件大小两倍时,发生BGREWRITEAOF操做 auto-aof-rewrite-percentage 100 #当前AOF文件执行BGREWRITEAOF命令的最小值, #避免刚开始启动Reids时因为文件尺寸较小致使频繁的BGREWRITEAOF auto-aof-rewrite-min-size 64mb
##查看redis内存使用 [root@localhost utils]# /usr/local/redis/bin/redis-cli 127.0.0.1:6379> info memory
●操系统分配的内存值used_ memory rss除以redis使用的内存值
used _memory计算得出
●内存碎片是由操做系统低效的分配/回收物理内存致使的
不连续的物理内存分配
●跟踪内存碎片率对理解redis实例的资源性能是很是重要的
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
内存碎片率超过1.5,说明redis消耗了实际须要物理内存的150%,其中50%是内存碎片率
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操做系统正在进行内存交换
●redis实例的内存使用率超过可用最大内存,操做系统将开始进行
内存与swap空间交换
●避免内存交换
针对缓存数据大小选择
尽量的使用Hash数据结构
设置key的过时时间
●保证合理分配redis有限的内存资源
●当内存使用达到设置的最大阀值时,须要选择一种key的回收策略
默认状况下回收策略是禁止删除
redis.conf配置文件中修改maxmemory-policy属性值
- volatile-lru:使用LRU算法从已设置过时时间的数据集合中淘汰数据
- volatile-ttl:从已设置过时时间的数据集合中挑选即将过时的数据淘汰(建议使用)
- volatile-random:从已设置过时时间的数据集合中随机挑选数据淘汰
- allkeys-lru:使用LRU算法从全部数据集合中淘汰数据
- allkeys-random:从数据集合中任意选择数据淘汰
- no-enviction:禁止淘汰数据