Reids相关梳理

数据结构

RedisK/V 数据库,通过类似于哈希表结构的字典表DictEntry 通过指针分别指向了 KeyValue 的实际存储结构。除此之外,字典表还存储了下一个K/V 的指针。

String

截图

Hash

截图

List

截图

Set

截图

Zset

截图

BitMap 位图,通过多次Hash(key)来定位数组的偏移量,数组由0/1二进制组成。例如:步隆过滤器

HyperLogLog 用于统计基数的利器(基数:求集合中去重后的元素个数)

GeoSpatial 专门用于对经纬度,地理位置的一些操作

线程模型

Redis 基于 Reactor(响应式)模型开发的文件事件处理器,单线程。

截图

NIO

同步非阻塞IO,对于Redis接收到的请求是同步的,对于客户端来说是非阻塞的

核心组件

  • Buffer 缓冲区,在堆内存用来缓冲客户端的请求事件
  • Channel 通道,可靠性传输;接收 Buffer 请求通知Selector ,每个Channel 都对应一个Buffer
  • Selector 选择器又称多路复用器,释放服务器资源;监听多个 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

截图

posted @ 2022-05-13 12:43  柒徳咙咚呛  阅读(58)  评论(0)    收藏  举报