Redis | 青训营笔记

48 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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