Redis数据库学习笔记

Author Avatar
落影汐雾 9月 27, 2022
  • 在其它设备中阅读本文章

更新于: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慢查询的操作

  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

本文由 落影汐雾 原创,采用 保留署名-非商业性使用-禁止演绎 4.0-国际许可协议
本文链接:https://x.lyxw.xyz/2022/redis/