Redis应用 | 青训营笔记

67 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第14天。青训营的第十七次课程中对Redis的相关知识进行了讲解,下面是我对本次课程内容的一些总结。

为什么要用Redis

  • 随着业务量级上升,数据库读写压力越来越大;
  • Redis可以将热数据存储在内存中,从而提高系统的吞吐量。

Redis基本原理

  • 数据从内存中读写,从而具备较高的吞吐率;
  • 所有操作均使用单线程进行排队执行;
  • 数据保存到硬盘上,防止重启数据丢失;

Redis应用

  • 连续签到:用户每日有一次签到的机会,如果断签,连续签到计数归零;使用过期时间字段,使得字段在后天的0点时过期;

  • 消息通知:使用list作为消息队列,当需要发送消息时将消息发送到list。同时,使用监听器监听list,当消息插入到list即可感知到消息。

  • 计数:一个用户有多项计数需求,可以通过hash结构存储;

  • 排行榜:当积分变化时,排名要实时变更;使用zset数据结构,其由跳表和哈希表所实现,哈希表存储了参与排名的键到排行榜权重的映射,并通过在跳表中查找对应的权重,从而知道具体的排名;

  • 限流:当请求到来时,对当前时间戳所组成的键进行递增,并当其超过一定值后禁止访问;

  • 分布式锁:使用setnx实现,其运用了Redis是单线程执行命令的特性实现;

Redis注意事项

  • 大Key:

    • 大Key的危害:有读取成本高、容易造成慢查询、主从复制异常,阻塞服务
    • 解决大Key方法:1.将大Key拆分为小Key;2.使用压缩算法对数据进行压缩;3.对于集合类数据结构,可以使用拆分key,或冷热分离(仅存储最常用的N个数据).
  • 热Key

    • 用户访问一个Key的频率很高,使得Server出现负载突增;
    • 解决方案:1.使用本地缓存;2.将一份热Key复制写入多份;3.使用Redis代理
  • 慢查询

    • 传入数据单批次不要超过100个,使得性能下降;
    • 避免使用大key
    • zset过大时,会导致慢查询;
  • 缓存穿透

    • 热点数据查询绕过缓存,直接查询数据库
    • 解决方案:1.使用布隆过滤器,检查对应key是否存在;2.在缓存中存储不存在键对应值为空值;
  • 缓存雪崩

    • 大量缓存同时过期
    • 1.将缓存失效时间分散开;2.使用Redis集群;