redis总结

分类:知识要点 日期:2022-03-21 作者:yxy 浏览:955

database 非cluster模式下默认是16个,cluster模式下只能是1个

存储效率 压缩内存和减少内存碎片
响应时间 例如rehash
单线程 异步io与pipelining(流水线)

程序员使用对象

String  redisobject sds
list  ziplist quicklist
set   ziplist quicklist
hash   ziplist dict
sortset  skiplist, dict和ziplist基础上构建起来的。

内部实现对象

redisObject  基础对象
dict   拉链法 rehash (在操作中rehash)
sds        string   sdsheader ’\0’   5种type
ziplist    <zlbytes><zltail><zllen><entry>...<entry><zlend>  
    zlbytes表示ziplist占用的字节总数(也包括<zlbytes>本身占用的4个字节)
    zltail最后一项(entry)在ziplist中的偏移字节数 32bit
    zllen: 16bit  2^16-2, 事实上,hash-max-ziplist-entries 512 这个配置,影响
    entry  <prevrawlen><len><data>  
     zlendziplist最后1个字节,是一个结束标记,值固定等于255
     hash-max-ziplist-value 64     # ziplist每个节点最大体积(字节),下同

quickList  双向链表    A doubly linked list of ziplists  连续内存的zipList    压缩算法,  linklist 改进版本 
list-max-ziplist-size -2
-5: 每个quicklist节点上的ziplist大小不能超过64 Kb。(注:1kb => 1024 bytes)
-4: 每个quicklist节点上的ziplist大小不能超过32 Kb。
-3: 每个quicklist节点上的ziplist大小不能超过16 Kb。
-2: 每个quicklist节点上的ziplist大小不能超过8 Kb。(-2是Redis给出的默认值)
-1: 每个quicklist节点上的ziplist大小不能超过4 Kb。

list-compress-depth 0
0: 是个特殊值,表示都不压缩。这是Redis的默认值。
1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。
2: 表示quicklist两端各有2个节点不压缩,中间的节点压缩。
3: 表示quicklist两端各有3个节点不压缩,中间的节点压缩。
skipList 跳表

zset-max-ziplist-entries 128
zset-max-ziplist-value 64

redis 优化

1 key 的值要小
2 keys * 不要出现 若是需要 用scan 每次返回值不大,可以定 游标查询,可能返回重复的值
3,提前压缩数据
4,回收策略必须设置
5,设置aof rdb 在持久化和性能之间保持平衡
6,多次数据操作用管道,减少io
7,设置内存大小,不要用到swap内存,禁用 thp
8 使用 slowlog 优化耗时命令,建议在分布式日志系统中记录
9,提高redis缓存命中率, 业务处理优化

细化缓存的粒度 
热加载,预热
防止缓存击穿和穿透(可以使用布隆过滤器先判断key是否存在)
及时调整缓存容量 和缓存失效策略maxmemory-policy allkeys-lru

redis 集群

Redis Replication

一种简单、易用的主从模式(master-slave)的复制机制
从机重启 以前是“全量同步+命令传播”
现在是 全量同步、部分同步、命令传播。 多了offset

主机重启

过期key处理
从机禁用主动key过期机制,主机在执行key过期后,会以DEL指令的方式向所有从机传播指令
从机所以针对读操作,从机将会按照自己的时钟向客户端返回key不存在。
Lua脚本执行期间key过期,Lua脚本将会传播给从机执行。

min-replica机制

至少有多少个从机在运行,写入时候,保证读写一直,必须等到从机写入成功 可配置
min-replicas-to-write

尽可能为master节点开启持久化

优点, 简单,主从,读写分离,良好的分担的读的压力

缺点

Redis不具备自动容错和恢复功能 master 挂了 ,得人工操作,或者自动重启
master 挂了 会丢数据
扩容很难,
数据会不一致

Sentinel(哨兵)模式

自动版的主从复制 在主机宕机后,可以自动把从机 切换成主机 ,

通过发送命令,让 Redis 服务器返回监控其运行状态,包括主服务器和从服务器;
当哨兵监测到 master 宕机,会自动将 slave 切换成 master ,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机;

多哨兵模式。

一个哨兵不稳定,哨兵之间就会进行一次投票

Cluster 集群模式

包含 Redis 集群的主从复制模型

所有的 redis 节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
节点的 fail 是通过集群中超过半数的节点检测失效时才生效。
客户端与 Redis 节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

集群中重要的概念 哈希槽(Hash Slot) 16384个
CRC16(key)/16384 简单 按照槽来进行分片,通过为每个节点指派不同数量的槽

其他问题

分布式锁
自增字段
事务
管道 批量执行
lua 脚本
流量控制

评论 (已有 3 条评论)

    Cc 2023-07-03 23:11回复

    [email protected]

    Cc 2023-07-03 23:11回复

    [email protected]

    Cc 2023-07-03 23:11回复

    [email protected]

发表评论

昵称:  
邮箱:  
网址: