redis
第一章
1.初识Redis
rezhangdis是一个速度非常快的非关系型数据库,它可以存储键与5种不同类型值直接的映射,可以将存储在内存的键值对数据持久化到硬盘
2.Redis 数据结构
5种结构
String 字符串
List 列表
Set 集合
Hash 散列
ZSet 有序集合
字符串
可以是字符串,整数,浮点数
命令 get,set,del
List 链表
一个链表,链表上的每个节点都包含了一个字符串
RPUSH: 将给定值推入列表的右端,用法:RPUSH list-key item
LRANGE: 获取列表在给定范围上的所有值
LINDEX: 获取列表在给定位置的单个元素
LPOP:从列表的左端弹出一个值,并返回被弹出的值
Set
包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二,各不相同的
SADD:将戈丁元添加到集合,用法: SADD key item
SMEMBERS:返回集合包含的所有元素,SEMEBERS key
SISMEMBER:检查给定元素是否存在于集合中
SREM:如果给定的元素存在于集合中,那么移除这个元素
HASH
包含键值对的无序散列表
HSET:在散列里面关联起给定的键值对, 用法:HSET key1 sub-key value
HGET:获取指定散列键的值
HGETALL:获取散列包含的所有键值对, 用法:HGETALL key1
HDEL:如果给定键存在于散列里面,那么移除这个键
ZSET(有序集合)
有序集合的键被称为成员(member),每个成员都是各不相同的,而有序集合的值则被称为分值(score),分值必须为浮点数,有序集合是Redis里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排列顺序来访问元素的机构
字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分支的大小决定
ZADD:将一个带有给定分支的成员添加到有序集合里面
ZRANG:根据元素在有序排列中所处的位置,从有序集合里面获取多个元素
ZRANGBYSCORE:获取有序集合在给定分值范围内的所有元素 ZREM:如果给定成员存在于有序集合,那么移除这个成员
用法:ZADD zset-key 123 member1
ZRANGE zset-key 0 -1 withscores
ZRANGEBYSCORE zset-key 0 470 withscores
数据安全与性能保障
将数据持久化至硬盘
1.redis 提供两种不同的持久化方法,快照(snapshotting)和只追加文件(append-only file)
- 1.快照: 存储某一个时刻的所有数据都写入硬盘里面
- 2.AOF:在执行写命令时,将被执行的写命令复制到硬盘里面,两种方法即可同时用也可以同时不用
2.save 60 1000 表示 60内写了1000次触发
快照命令
save 60 1000
stop-writes-on-bysave-error no 创建快照失败后继续执行写命令
rdbconpression yes
dbfilename dump.rdb
AOF命令
appendonly on
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100 多久同步
auto-aof-rewrite-min-size 64mb
保存目录(共享选项)
dir ./
快照
用户可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本,还可以将快照留在原地以便重启服务器时使用
创建快照的办法:
1.向redis 发送bgsave命令来创建一个快照,redis会调用fork来创建一个子进程,然后子进程复制将快照写入硬盘,而父进程则继续处理命令来请求
2.向redis 发送save命令来创建一个快照,接到save命令的Redis服务器在快照创建完毕之前将不再相应任何其他命令,这命令不常用
3.用户设置save配置选项 ,如 save 60 1000 ,当60秒内有1000次写入,这个条件被触发,Redis会自动触发bgsave命令,如果设置了多个这种配置选项,则人一个条件被满足时,就会触发一次bgsave
4.通过shutdown命令接收到关闭服务器的请求是,或者接收到标准term信号是,会执行一个save命令,阻塞所有客户端,不再执行客户端发送的任何命令,并在save命令执行完毕后关闭服务器
5.当一个Redis服务器连接另一个Redis服务器,并向对方发送sync命令来开始一次复制操作的时候,主服务器没有执行bgsave命令,或者并非刚刚执行完bgsave,那么主服务器会执行bgsave命令
6.系统真的发送崩溃,用户将丢失最近一次生成快照之后更改的所有数据,快照持久化只适合哪些即使丢失一部分数据也不会造成问题的应用程序.
7.当redis 存储的数据量只有几个GB时,生成快照的时间很快.
8.执行bgsave可能导致系统长时间停顿,也可能引发系统大量的使用虚拟内存,从而导致redis的性能降低至无法使用
9.redis 进程每占用一个GB的内存,创建该进程的子进程所需要的时间增加10-20ms,对于虚拟机要200-300ms
10.如果我们redis 占用20GB的内存,那么标准硬件上运行BGSAVE所创建的子进程导致Redis停顿200-400ms,虚拟机4-6秒
11.为了防止Redis创建自建成出现停顿,可以关闭自动保存,进行手动发送BGSAVE或save进行持久化
AOF
AOF 持久化会将被执行的写命令写到AOF文件的末尾,以此来记录数据发生的变化,Redis只要从头到尾重新执行以此AOF文件包含的所有写命令,就可以恢复AOF文件所记录的数据集.
1.appendfsync
always:每个redis写命令都要同步写入硬盘,这样做会严重降低redis的速度,会导致硬盘寿命急剧减少.
everysec:每秒执行以此同步,显示将多个写命令同步到硬盘.
no:让操作系统来觉得应该合适进行同步.
2. redis会不断的将被执行的谢明丽记录到AOF文件里面,所以随着redis不断运行,AOF文件的体积也会不断增长,极端情况下,体积不断增大的AOF文件,甚至会用完硬盘的所有空间,如果AOF文件的体积非常大,那么还原操作执行的时间可能会非常长.
3.redis为了解决AOF文件体积不断增大的问题,用户可以向redis发送BGREWRITEAOF命令,这个命令会移除AOF文件中的冗余命令来重写AOF文件,使它的体积尽可能小
4.BGREWRITEAOF原理和BGSAVE创建快照的工作原理非常相似,redis会创建一个子进程,然后由子进程负责对AOF文件进行重写.
5.无论是使用AOF持久化还是快照持久化,将数据持久化到硬盘上都是非常有必要的,而且还需要对持久化所得的文件进行背负,复制到不同的服务器上面
6.
将数据复制到其他机器
复制可以让其他服务器拥有一个不断地更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的读请求
1.使用一个主服务器(master)向多个从服务器(slave)发送更新,并使用从服务器来处理所有的读请求
2.客户端每次想主服务器进行写入时,从服务器都会实时的得到更新
3.客户端通常会睡觉的选择使用哪个从服务器,从而将负载平均分配到各个从服务器上
4.从服务器连接一个主服务器的时候,主服务器会创建一个快照文件并将其发送至从服务器
5.在实际中最好还是让主服务器只使用50%-65%的内存,留下30%-45%的内存用于执行BGSAVE命令和创建记录写命令的缓冲区
6.如果用户使用的是SLAVEOF命令,那么redis会立即尝试连接主服务器,并在连接成功后进行文件复制
7.从服务器在与主服务器进行初始连接时,数据库中原有的所有数据都将都是,并被替换成主服务器发来的数据.
8.redis不支持主主复制,因为你去设置对方为主服务器时,会持续占用大量处理器资源并且连续不断的尝试
主从链
1.redis的主服务器和从服务器并没有特别不同的地方,所以从服务器也可以拥有自己的从服务器,并由此形成主从链
2.随着负载不断上升,主服务器可能会无法快速的更新所有从服务器,用户可以创建一个由redis主从节点组成的中间层来分担主服务器的复制工作
3.如:
graph TD
A[主服务器] --> 从服务(B)
从服务 --> 从服务1{test}
从服务 --> 从服务2{test}
从服务 --> 从服务3{test}
从服务1 --> |从服务4|
从服务1 --> |从服务5|
从服务1 --> |从服务6|
4.为了将数据保存到多台机器上面,用户首先需要为主服务器设置多个从服务器,然后对每个从服务器设置appendonly yes 选项和appendfsync everysec 选项
检验硬盘写入
通过检查info replication命令的输出来查看
设置主从服务器
处理系统故障
1.验证快照文件和AOF文件
2.redis提供了两个命令行程序redis-check-aof 和redis-check-dump,它们可以在系统故障发生之后,检查AOF文件和快照文件的状态,并在有需要的情况下对文件进行修复.
3.如果redis-check-aof fix则表示修复,aof修复是将出错命令之后的所有命令都删除
4.目前没有办法可以修复出错的快照文件,只能多备份几个文件防止出现丢失
5.a,b两台redis主从服务器,a主服务器挂了,则向b服务器发送save命令,将创建的快照文件发送到c服务器.启动c服务器redis,init,让b服务器成为c的从服务器.
Redis 事务
非事务型流水线
诊断性能文投
缓存策略
1.消极方法:读取的时候如果发现失效了就进行删除他
2.积极方法:利用redis的时间事件来实现,每隔一段时间去检查并删除失效主键
3.redis也可以配置LRU机制来回收空间
4.redis都是master进行主键删除,在通知slaveof,从服务器不会删除,过期只会返回空
Memcached删除主键方式
memcache删除主键是采用消极方法.memcache内部不会见识主键是否失效,而是通过get方法主键是才会检查其是否已经失效,其次memcache与redis在主键失效机制上的最大不同是,memcache不会像redis那样真正的去删除失效的主键,而是简单的将失效主键占用的空间回收,当有新的数据写入系统时,memcache会有限使用那些失效的主键空间,如果失效的主键空间用光了,memcache还可以通过LRU机制来回收那些长期得不到访问的空间.
redis
我们知道虽然 Redis 会定期地检查设置了失效时间的主键并删除已经失效的主键,但是通过对每次**处理数据库个数**的限制、**activeExpireCycle** 函数在一秒钟内执行次数的限制、**分配给 activeExpireCycle 函数CPU时间的限制**、继续删除主键的**失效主键数百分比的限制**,Redis 已经大大降低了主键失效机制对系统整体性能的影响,但是如果在实际应用中出现大量主键在短时间内同时失效的情况还是会使得系统的响应能力降低,所以这种情况无疑应该避免。