这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
Redis
将数据分为冷热 热数据放入内存中
数据从内存中读写
数据保存到硬盘上防止重启数据丢失
- 增量数据保存到aof文件
- 全量数据rdb文件
redis单线程处理所有操作命令(顺序执行)
Redis 的 string 数据结构
设计目标:节省空间、快速读取、快速变更
二进制存储 可以存字符串、数字、二进制数据
通常和 expire(有效期) 配合使用
消息通知(推送到ES引擎)
使用list作为消息队列
监听队列头是否有数据可以取出来
Quicklist:双向链表 + listpack(在一个节点存储很多数据)
使用Hash结构(dict)缓存计数
使用pipeline打包命令,一次 set\get 多个key
可以一次取多个数据,其中每个数据项可以单独变更
Hash结构 = 槽位 + 单向链表拉链
当拉链变得很长时,需要增加槽位
渐进式rehash:将迁移过程平摊到每一次用户访问中(不会阻塞用户请求)
zset实现实时排序
跳跃表skiplist(多层链)
结合dict后,实现通过key操作跳表
通过时间戳生成key 实现限流
redis key作为限流计数(Incr实现递增)
分布式锁
使用redis的 setnx(利用redis的单线程性质)
存在的问题:
- 业务超时解锁
- 主备切换临界点(锁可能还未同步)
- 集群脑裂,出现多个主节点时
消除大Key
- 拆分成小key 如将一个String拆分成多个String(需要额外解析工作)
- 将value压缩后写入redis
- 对于集合类结构hash、list、set,可以:
- 拆分:用hash取余,位掩码决定放在哪个key中
- 区分冷热:如榜单场景使用zset,只缓存前十页,后续放在DB里
解决热Key
- 业务服务侧设置localcache
- 拆分 更新时需要更新多个key,存在数据不一致的风险
redis访问代理负责热key发现和localcache