Redis 知识概览
Redis笔记
一.8种数据类型
1.String (SDS)动态字符串实现 解决的扩容和缩减每次的内容空间分配,预防了C语言数组的因未重新分配内存空间导致的内存溢出问题
2.Hash (ziplist,字典),用的链接法解决hash冲突问题,与java里hashmap相似。扩容和缩减是根据前一个hash表的容量取最接近的2^n的整数。
3.List (quicklist,链表)quicklist是表头加压缩链表实现的,表头加双向链表实现的。表头里有头尾节点的指针,表的长度等。
4.Set (intset,字典)intset节约内存资源,字典,hash表保证不重复。
5.SortedSet (ziplist,skiplist)skiplist实现了跳跃查数据,有点像二分查找,利用层级基于概率一层一层遍历查找,时间复杂度未O(logn)
6.Hyperloglog 基数统计,内存大小并不随数据增大而线性增大,2^64数据,维持12kb大小,可去重,不能获取元素信息,常做uv统计。
7.bitmap 位图统计,通过bit位记录信息,利于统计,同时减少内存使用。
8.geo 地理位置记录,可记录地点经纬度位置,计算两点距离等。
二.Redis数据持久化
1.RDB (快照,存数据文件,性能好,存在数据丢失)
2.AOF (写指令文件,可每秒记一次,数据完整性高,性能较差)
三.Redis事务
1.不支持回滚
2.五大命令
四.Redis数据淘汰机制
1.淘汰时机:1)请求时,过期key,删除
2 ) CPU空闲时,定时任务,serverCron,定期删除部分
3 )每次循环事件(即等待用户期间)执行时,会删除部分
2.6个策略
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数 据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据 淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
五.Redis消息队列
生产者消费者模式(Blpop):生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有;
发布者订阅者模式(Pub/Sub):发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的;
六.主从复制
读写分离,主master负责写,从salve负责读。主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
七.哨兵
实现监控主节点是否怠机,然后自动选举从节点顶替主节点。如果被标识的是主节点,他还会选择和其他Sentinel节点进行“协商”,当大多数的Sentinel节点都认为主节点不可达时,他们会选举出一个Sentinel节点来完成自动故障转移工作,同时将这个变化通知给Redis应用方。如果之前主节点重新连上会被当做从节点。