Redis知识总结
看完《redis设计与实现》后,结合自己实际开发中的经验,做些知识点的总结:
-redis为什么快
内存操作
单线程,要么失败,要么成功
- redis 5大对象
1、String对象
2、List对象:双向列表
3、HashMap对象:rehash问题,双hashTable,hash计数
4、set对象:集合
5、sort_set:有序集合对象,hash表和跳跃表的结合,指针指向真实对象,hash保证查询的速度,跳跃表用来排序
详见:https://blog.youkuaiyun.com/zhangyufeijiangxi/article/details/78814587
https://blog.youkuaiyun.com/zhangyufeijiangxi/article/details/78814587 - redis-单线程
redis是单线程的,SAVE会阻塞线程进行内存快照dump,BGSAVE,会fock子线程进行快照dump,非阻塞 - redis-磁盘保存
redis提供两种方式进行内存到磁盘的保存,防止宕机后数据丢失:
RDB:内存对象的快照,默认设置9000秒修改过一次,300s至少修改两次
时间 | 至少执行redis命令次数 |
---|---|
9000 | 1 |
300 | 10 |
60 | 1000 |
RDB这种方式会造成短暂性的服务失联,因为dump对CPU和内存都要求较高
详见:https://blog.youkuaiyun.com/zhangyufeijiangxi/article/details/78863303
AOF:
aof_buffer同步到磁盘的频率:默认是1s钟一次,每隔1秒将新增命令同步至磁盘aof文件
aof重写:
默认aof文件大于1M,或增长的部分大小增长了1倍进行aof重写
详见:https://blog.youkuaiyun.com/zhangyufeijiangxi/article/details/78866038
-redis分布式锁
分四步:
第一步:setnx:成功则说明获取了锁,没有则说明被别人占用着或未被正确释放
第二步:get:获取过期时间,只有获取到时间并且时间过期了,才能认为获取到了这个锁
第三步:getSet:只有获取到旧的数据确实是刚刚查找的过期数据,才能确定没有被其他现场修改占用
第四步:delete业务处理完后,进行锁释放
- redis使用场景
A、session回话保存
:(key,value,expireTime)普通String键值对即可
B、FPC:全页缓存(FPC)如淘宝首页的数据,生产上如手机号限制10分钟内发送短信次数
C、队列:
正是因为list的底层实现的是双向列表,使得我们可以用lpush,rpush,lpop,rpop实现FIFO,或FILO双向队列
4、发布/订阅
适合小型数据量
5、计数/排行榜
利用有序集合对象实现
-redis分布式
主从模式:master-slave01-slave02
master挂掉,slave马上起,不要一对多,
哨兵模式:
一个哨兵配置监控一个master,会自动监控这个master的slave。当master挂了。从slave中选出一个当做master,修改剩余slave跟踪选择的那个slave, 也就是新的master
集群:内存分片,当一个master过小,需要将数据分成多个地方存储,这个时候可以建立分片,将数据hash到不同的slot上
-redis和memchaed的优势区别
1、redis支持多种对象,特别是list,hash,set,sortSet,可以支持多种业务
2、redis支持持久化,memecha不支持,了数据就丢失
3、redis还可以主从配置进行备份
4、redis支持单个对象的value达1G,memch只有1M
-redis数据回收策略
1、lru:设置了过期键集合,删除最近最少使用的键值对
2、ttl:设置了过期对象集合,删除将要过期的键值对
3、random:设置了过期的集合对象,随机删除
4、allkeys-lru:全部集合中,最近最少
5、allkeys-random:全部集合,随机
6、no-:禁止驱逐
-redis一些注意事项
1、master不要持久化,持久化让slave做
Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
2、尽量做AOF持久化,不用RDB,太耗内存了
3、master和slave最好在一个局域网内
-单线程为什么快
1、内存操作
2、单线程无CPU切换开销
3、多路I/O复用模型:epoll,先注册socket链接至selector,然后不断轮询selectkey,等相应后再去处理