Redis数据库学习笔记
更新于:A.D.2023.03.05
什么是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慢查询的操作
- 批量操作一次性传入过多的key/value,如mset/hmset/sadd/zadd等O(n)操作,建议单批次不要超过100,超过100之后性能下降明显
- zset大部分命令都是O(log(n)),当大小超过5k以上时,简单的zadd/zrem也可能导致慢查询
- 操作的单个value过大,超过10KB。也即,避免使用大Key
- 对大Key的delete/expire操作也可能导致慢查询,Redis4.0之前不支持异步删除unlink,大Key删除会阻塞Redis
本文由 落影汐雾 原创,采用 保留署名-非商业性使用-禁止演绎 4.0-国际许可协议
本文链接:https://x.lyxw.xyz/2022/redis/