专栏首页me的随笔Redis 缓存设计原则

Redis 缓存设计原则

基本原则

  • 只应将热数据放到缓存中
  • 所有缓存信息都应设置过期时间
  • 缓存过期时间应当分散以避免集中过期
  • 缓存key应具备可读性
  • 应避免不同业务出现同名缓存key
  • 可对key进行适当的缩写以节省内存空间
  • 选择合适的数据结构
  • 确保写入缓存中的数据是完整且正确的
  • 避免使用耗时较长的操作命令,如:keys *
    • Redis默认配置中操作耗时超过10ms即视为慢查询
  • 一个key对应的数据不应过大
    • 对于string类型,一个key对应的value大小应控制在10K以内,1K左右更优
    • hash类型,不应超过5000行
  • 避免缓存穿透
    • 数据库中未查询到的数据,可在Redis中设置特殊标识,以避免因缓存中无数据而导致每次请求均达到数据库
  • 缓存层不应抛出异常
    • 缓存应有降级处理方案,缓存出了问题要能回源到数据库进行处理
  • 可以进行适当的缓存预热
    • 对于上线后可能会有大量读请求的应用,在上线之前可预先将数据写入缓存中
  • 读的顺序是先缓存,后数据库;写的顺序是先数据库,后缓存
  • 数据一致性问题
    • 数据源发生变更时可能导致缓存中数据与数据源中数据不一致,应根据实际业务需求来选择适当的缓存更新策略:
      • 主动更新:在数据源发生变更时同步更新缓存数据或将缓存数据过期。一致性高,维护成本较高。
      • 被动删除:根据缓存设置的过期时间有Redis负责数据的过期删除。一致性较低,维护成本较低。

缓存过期算法

  • LRU
    • 淘汰最后使用时间距当前时间较长的数据
  • LFU
    • 淘汰某段时间内的使用频次较低的数据
  • FIFO
    • 淘汰先写入的数据

版权声明

本文为作者原创,版权归作者雪飞鸿所有。 转载必须保留文章的完整性,且在页面明显位置处标明原文链接

如有问题, 请发送邮件和作者联系。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从系统性能优化谈对象相等性

    公司系统中有一接口访问量大,内部计算逻辑较为复杂。在优化时打算把Request中的参数做为Key,Response做为Value放到进程内缓存中,以降低服务器压...

    雪飞鸿
  • C#异步编程

    上面这段代码中,Main方法中的代码是按照自上而下的顺序执行的。网络状况不佳时,Start()方法是比较耗时(注意,这里在Start方法中调用了异步方法GetS...

    雪飞鸿
  • Python import 与 __all__

    使用from <module> import *导入模块时,若显式定义了__all__,则只导入__all__中的name,否则会导入除以下划线开头的所有nam...

    雪飞鸿
  • 缓存在高并发场景下的常见问题

    当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策...

    烟草的香味
  • Redis系列 | 缓存穿透、击穿、雪崩、预热、更新、降级

    Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透、缓存击穿、缓存雪崩、缓存预热、缓存更新、...

    王知无
  • 关于Redis缓存的三个一定要知道的问题哟!

    二哈最近都没看Redis,现在回来温习下,现在从Redis的三大缓存开始重新探一探有多深有多浅(*^▽^*)

    java乐园
  • 后端服务慢成狗?试试这 7 招!

    优化代码实现是第一位的,特别是一些不合理的复杂实现。如果结合需求能从代码实现的角度,使用更高效的算法或方案实现,进而解决问题,那是最简单有效的。

    Java技术栈
  • Guava 源码分析(Cache 原理)

    我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。

    爱撸猫的杰
  • Google 出的 Guava 是个什么鬼?

    我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。

    纯洁的微笑
  • 缓存穿透、缓存击穿和缓存雪崩

    什么是缓存穿透呢?它是指当用户在查询一条数据的时候,而此时数据库和缓存却没有关于这条数据的任何记录,而这条数据在缓存中没找到就会向数据库请求获取数据。它拿不到数...

    JAVA日知录

扫码关注云+社区

领取腾讯云代金券