Reids相关梳理
数据结构
Redis是K/V数据库,通过类似于哈希表结构的字典表DictEntry通过指针分别指向了Key与Value的实际存储结构。除此之外,字典表还存储了下一个K/V的指针。
String

Hash

List

Set

Zset

BitMap位图,通过多次Hash(key)来定位数组的偏移量,数组由0/1二进制组成。例如:步隆过滤器
HyperLogLog用于统计基数的利器(基数:求集合中去重后的元素个数)
GeoSpatial专门用于对经纬度,地理位置的一些操作
线程模型
Redis基于Reactor(响应式)模型开发的文件事件处理器,单线程。

NIO
同步非阻塞IO,对于Redis接收到的请求是同步的,对于客户端来说是非阻塞的
核心组件
Buffer缓冲区,在堆内存用来缓冲客户端的请求事件Channel通道,可靠性传输;接收Buffer请求通知Selector,每个Channel都对应一个BufferSelector选择器又称多路复用器,释放服务器资源;监听多个Channel中的请求事件,交给单线程来处理
select poll epoll多路复用器Selector上会维护的FD集合存放的IO通道,从用户空间 复制到 内核空间来激活Socket
Select(1984),FD_list是数组结构,需要遍历扫描FD_list,连接数也受限,IO效率一般。Poll(1997),FD_list是链表结构,也是遍历扫描,连接数无上限,IO效率一般。Epoll(2002),不在扫面FD_list,只将监听的FD事件存到内核的事件表中,通过事件回调来激活Socket,避免了用户空间与内核空间的拷贝操作。底层使用红黑树,连接无上限,IO效率极高。
Redis速度快的原因
- 纯内存操作
- 存储结构好性能高,时间复杂度基本上是常量级,对于Hash碰撞也有很好的处理机制
- NIO多路复用,避免了多线程上下文频繁切换带来的开销
持久化
RDB
基于快照完成的,也是默认开启的方式。触发快照条件 生成文件
dump.rdb文件save 3600 1 //1小时内有1个key发生变化触发持久化 save 300 100 //5分钟内有100个key发生变化触发持久化 save 60 10000 //1分钟内有10000个key发生变化触发持久化根据配置
save <seconds> <changes>可自行设置
AOF
采用日志的方式完成的,默认不开启
appendonly no,可以设置开启并配置同步磁盘的方式appendfsync always //实时同步 appendfsync everysec //每秒同步,可能会丢失数据 appendfsync no //交给操作系统完成日志文件会越来越大,通过
rewrite操作把无效指令压缩调,重新生成新的aof文件,覆盖老文件
缓存穿透、击穿、雪崩

分布式锁
注重问题
- 过期时间与加锁,需要原子操作
- 业务超时,锁释放但任务未完成,需要缓存续命
- 释放锁时,需要释放自己的锁,切记不要张冠李戴
- 释放锁时,保证原子操作。lua脚本
Redission
- tryLock(),加锁,默认30秒
- watchdog,看门狗,缓存续命,每10秒续命一次
- unLock(),解锁,最好确定锁状态以及是否当前线程持有
键过期了是否立刻被删除?
不是,这涉及到三种不同的删除策略
- 定时删除(对CPU不友好,处理器性能换取存储空间)
- 惰性删除(到达过期时间不处理,等下次访问的时候再删除。占空间,对内存不友好)
- 定期删除,这种方式(不定期抽查,会有漏网之鱼)
另外还存在内存淘汰机制,以下两种方式生成8中淘汰机制
- LRU:最近最少使用
- LFU:频率上最少使用
- 常用的是 allKeys-lru,可配置
集群
主从复制

哨兵

cluster

本文来自博客园,作者:柒徳咙咚呛,转载请注明原文链接:https://www.cnblogs.com/JustDoIt-1221/p/16266303.html

浙公网安备 33010602011771号