【Redis —进阶】缓存设计
SegmentFault
共 5157字,需浏览 11分钟
· 2021-07-05
作者:与昊
来源:SegmentFault 思否社区
缓存的收益和成本
收益
加速读写:因为缓存通常都是全内存的(例如Redis、Memcache),而存储层通常读写性能不够强悍(例如MySQL),通过缓存的使用可以有效地加速读写,优化用户体验。
降低后端负载:帮助后端减少访问量和复杂计算(例如很复杂的SQL语句),在很大程度降低了后端的负载。
成本
数据不一致性:缓存层和存储层的数据存在着一定时间窗口的不一致性,时间窗口跟更新策略有关。
代码维护成本:加入缓存后,需要同时处理缓存层和存储层的逻辑,增大了开发者维护代码的成本。
运维成本:以Redis Cluster为例,加入后无形中增加了运维成本。
开销大的复杂计算:以MySQL为例,一些复杂的操作或者计算(例如大量联表操作、一些分组计算),如果不加缓存,不但无法满足高并发量,同时也会给MySQL带来巨大的负担。
加速请求响应:即使查询单条后端数据足够快,那么依然可以使用缓存,以Redis为例,每秒可以完成数万次读写,并且提供的批量操作可以优化整个IO链的响应时间。
缓存更新策略
LRU/LFU/FIFO算法剔除
超时剔除
主动更新
最佳实践
缓存粒度控制
全部数据会造成内存的浪费。
全部数据可能每次传输产生的网络流量会比较大,耗时相对较大,在极端情况下会阻塞网络。
全部数据的序列化和反序列化的CPU开销更大。
缓存穿透
缓存空对象
空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间(如果是攻击,问题更严重),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。 缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。
布隆过滤器拦截
缓存空对象和布隆过滤器方案对比
缓存无底洞
客户端一次批量操作会涉及多次网络操作,也就意味着批量操作会随着节点的增多,耗时会不断增大。 网络连接数变多,对节点的性能也有一定影响。
命令本身的优化,例如优化SQL语句等。
减少网络通信次数。
降低接入成本,例如客户端使用长连/连接池、NIO等。
串行命令
现起来比较简单。
串行IO
并行IO
hash_tag实现
方案对比
缓存雪崩
保证缓存层服务高可用性
依赖隔离组件为后端限流并降级
提前演练
热点key重建
当前key是一个热点key,并发量非常大。 重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的SQL、多次IO、多个依赖等。
减少重建缓存的次数。 数据尽可能一致。 较少的潜在危险。
互斥锁
永远不过期
从缓存层面来看,确实没有设置过期时间,所以不会出现热点key过期后产生的问题,也就是“物理”不过期。 从功能层面来看,为每个value设置一个逻辑过期时间,当发现超过逻辑过期时间后,会使用单独的线程去构建缓存。
总结
评论
微服务与领域驱动设计,架构实践总结
来源:知了一笑👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新
小哈学Java
0
面试官:电商库存扣减如何设计?如何防止超卖?
来源:my.oschina.net/xiaolyuh/blog/1615639👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示
小哈学Java
0
漫游CPU缓存效应,让你的程序性能飙升!
推荐一个原创技术号-非科班大厂码农,号主是机械专业转行进入腾讯的后端程序员!大多数读者都知道cache是一种快速小型的内存,用以存储最近访问内存位置。这种描述合理而准确,但是更多地了解一些处理器缓存工作中的“烦人”细节对于理解程序运行性能有很大帮助。在这篇博客中,我将运用代码示例来详解 cache工
码农有道公众号
1
Redis 是怎么从单体架构发展到分布式缓存的?
图解学习网站:https://xiaolincoding.comRedis 架构是如何一步一步发展到今天的样子的?2010 年 - 单体 RedisRedis 1.0 于 2010 年发布,当时的架构非常简单。它通常用作业务应用程序的缓存。不过,Redis 将数据存储在内存中。当我们重启 Redis
小林coding
10
得物面试:Redis 内存碎片是什么?如何清理?
JavaGuide官方网站:javaguide.cn这是一道不是特别高频但很重要的 Redis 面试题,属于 Redis 性能优化的范畴。Redis 内存碎片相关的问题在得物、美团、阿里、字节、携程等公司的后端面试中都曾出现过,还是建议认真准备一下。即使不是准备面试,日常开发也是能够用到的!什么是内
JavaGuide
0
公司新来一个同事,把风控系统设计得炉火纯青,万能通用,稳的一批!
点击关注公众号,Java 干货及时推送↓推荐阅读:铜三铁四,怒拿 35K * 14 薪!作者:wingli链接:https://juejin.cn/post/7182774381448282172一、背景1.为什么要做风控? 这不得拜产品大佬所赐目前我们业务有使用到非常多的AI能力,如oc
Java技术栈
0
【Nucleic Acids Research】利用生成式深度学习模型设计蓝藻细菌的合成启动子
题目:Design of synthetic promoters for cyanobacteria with generative deep-learning model期刊:Nucleic Acids Research影响因子:19.16发表时间:2023.5.29原文作者:Euijin Seo
生信宝典
0
为人类造福,而不是作恶—负责任的 AI x 蛋白质设计丨再创
引言 /Introduction蛋白质设计领域知名学者 David Baker 和来自 20 个国家的 90 多位顶尖科学家共同签署了一份包含十个可执行承诺的保证书。该承诺旨在最大化人工智能在蛋白质设计领域的益处,同时最小化潜在风险。该社区声明源自 2023 年 10 月 25 日华盛顿大学蛋白质设
生信宝典
0