Redis 缓存数据库 | 青训营笔记

86 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 5 天。

什么是Redis

为什么需要Redis

  • 数据从单表,演进除了分库分表
  • MySQL从单机演进出了集群

数据量增长

读写数据压力的不断增加

  • 数据分冷热

热数据:经常被访问到的数据

  • 将热数据存储到内存中

Redis基本工作原理

  • 数据从内存中读写
  • 数据保存到硬盘上防止重启数据丢失

增量数据保存到AOF文件

全量数据RBD文件

  • 单线程处理所有操作命令

Redis应用案例

连续签到

String数据结构

  • 可以存储字符串、数字、二进制数据
  • 通常和expire配合使用
  • 场景:存储计数、Session

消息通知

用List作为消息队列

  • QuickList由一个双向链表和listpack实现

计数

一个用户有多项计数需求,可通过Hash结构存储

  • Hash数据结构dict
  • rehash
  • 渐进式rehash

排行榜

zset数据结构 zskiplist

限流

分布式锁

可以使用Redis的setnx实现

  • Redis是单线程执行命令
  • setnx只有未设置过才能执行成功

Redis使用注意事项

大Key、热Key

数据类型大Key标准
String类型value的字节数大于10KB即为大Key
Hash/Set/Zset/List等复杂数据结构类型元素个数大于5000个或总value字节数大于10MB即为大Key

大Key的危害

  • 读取成本高
  • 容易导致慢查询(过期、删除)
  • 主从复制异常、服务阻塞无法正常响应请求

业务侧使用大Key的表现

  • 请求Redis超时报错

慢查询场景

容易导致Redis慢查询的操作

  1. 批量操作一次性传入过多的key/value,如mset/hmset/sadd/zadd等O(n)操作,建议单批次不要超过100,超过100之后性能下降明显
  2. zset大部分命令都是O(log(n)),当大小超过5k以上时,简单的zadd/zrem也可能导致慢查询
  3. 操作的单个value过大,超过10KB。也即,避免使用大Key
  4. 对大Key的delete/expire操作也可能导致慢查询,Redis4.0之前不支持异步删除unlink,大Key删除会阻塞Redis