做网站好的网站建设公司哪家好,钦北区网站建设,html5编程入门自学,wordpress广告从哪获取背景
高并发接口#xff0c;引入redis作为缓存之后#xff0c;运行一段时间发现redis各个节点在高峰时段的访问量严重不均衡#xff0c;有的节点访问量7000次/s#xff0c;有的节点访问量500次/s
此种现象虽然暂时不影响系统使用#xff0c;但是始终是个安全隐患#x…背景
高并发接口引入redis作为缓存之后运行一段时间发现redis各个节点在高峰时段的访问量严重不均衡有的节点访问量7000次/s有的节点访问量500次/s
此种现象虽然暂时不影响系统使用但是始终是个安全隐患随着业务量逐年上涨风险留给未来并非一个合格码农的职业操守。必须得看看究竟是何种情况。
思考
想要优化得现有一番思考先得想想究竟有哪些情况会产生这种现象才能去逐步排查而不能盲目就去动手。
可能的原因
数据倾斜如果某些键的访问频率较高而这些键又恰好分布在某几个节点上就会导致节点的访问不均衡。这可能是因为数据分布不均匀或者业务逻辑导致某些键的访问频率较高。网络问题网络延迟或带宽限制可能导致某些节点的访问速度较慢从而使访问不均衡。客户端连接问题如果某些客户端连接到了某个特定节点而其他节点上的客户端较少就会导致节点的访问不均衡.业务逻辑问题是否是因为业务逻辑原因导致的频繁访问同一批数据是否存在热key
验证
有了上述思考就要开始去逐一排查可能的原因
1.数据倾斜排查检查数据在节点之间的分布情况通过查看Redis的CPU、内存指标并未发现某个节点的负载明显高于其他节点
2.网络问题通过监测网络延迟或带宽限制相关情况并未发现有此种情况
3.客户端连接问题检查客户端连接到Redis节点的方式如果发现某些节点受到过多的请求压力可以考虑采用负载均衡策略将请求均匀分散到不同的节点上通过相关检查并未发现此类问题
4.业务逻辑问题分析Redis访问相关业务代码及定时任务并未发现有重复访问的逻辑存在
5.是否存在热key通过运维获取高峰时段的访问日志进行统计分析
(1) 热key有两类网点映射以业务账号维度的数据
(2)redis访问不均衡的原因不同客户下单高峰分布在一天不同时间段高频访问在不同时间分布在不同节点上
方案
通过三种策略来确保redis各节点的访问均衡
1.本地缓存策略
将将要缓存的数据根据业务形态分为两类
(1)网点类的常用数据直接缓存在本地
(2)对于高峰时期高频访问的数据引入缓存组件Caffeine,设置相关的策略
设置大小为1M
EXPIRE_AFTER_WRITE_TIME(60s)
EXPIRE_AFTER_ACCESS_TIME(10s)
2.节点一致性策略
使用发布-订阅模式Pub-Sub来实现更新通知机制; 当 Redis 中的数据更新时Redis 可以发布一个更新通知各节点的本地缓存订阅这个通知并根据通知更新本地缓存
3.异常解决方案
1异常日志记录
2间隔2min重试机制
3重试后异常告警机制
4数据定时同步兜底 DB-redis、redis-本地缓存 下图为存储与访问缓存的逻辑图 效果
经过上述方案的实施最终实现了
1.redis各节点的访问量在全时段实现了均衡态
2.redis的各节点的整体QPS也下降了10%
3.像双十一双十二高峰时段接口也是稳稳的 本地缓存原理及方案选取原因
本地缓存是指将数据存储在应用程序的本地内存中以提高数据的读取速度和访问效率。本地缓存的本质是通过将常用或热点数据保存在内存中避免了每次访问都需要从远程或磁盘存储中读取数据的开销。
本地缓存的工作原理如下 1.数据加载当应用程序第一次访问某个数据时如果该数据还未被缓存则从远程或磁盘存储中加载数据并将其保存在本地缓存中。 2.数据访问当应用程序再次访问同样的数据时首先从本地缓存中查找数据。如果数据存在于缓存中则直接返回缓存的数据避免了从远程或磁盘存储中读取的开销。 3.缓存更新当数据发生变化时需要更新缓存中的数据以保持缓存和存储中的数据一致性。可以通过手动或自动的方式更新缓存例如定时刷新缓存、监听数据变更事件等。 本地缓存的优势包括快速访问、低延迟、减轻了远程或磁盘存储的负载等。它适用于那些访问频率较高、数据相对稳定的场景可以大大提高应用程序的性能和响应速度。
但是需要注意的是本地缓存也存在一些问题如缓存过期、缓存一致性、内存管理等。开发者需要根据具体的应用场景和需求合理配置和管理本地缓存以充分发挥其优势同时避免潜在的问题。
传统缓存组件方案
FIFO按照数据最早进入缓存的顺序进行替换。即先进入缓存的数据先被替换掉。FIFO策略简单直观但可能导致缓存命中率较低因为最早进入缓存的数据可能不一定是最常用的数据。
LRU根据数据最近被访问的时间进行替换。即最长时间未被访问的数据会被替换掉。LRU策略基于“时间局部性”原理认为最近被访问的数据更有可能在将来被访问因此替换最久未被访问的数据。但实现LRU策略需要维护访问数据的顺序可能带来一定的开销。
LFU根据数据被访问的频率进行替换。即最不经常被访问的数据会被替换掉。LFU策略基于“访问局部性”原理认为最常被访问的数据更有可能在将来继续被访问因此替换最不经常被访问的数据。但实现LFU策略需要维护数据的访问频率可能带来更大的开销。 Caffeine 一个高性能、高命中率、接近最优的本地缓存被称为”新一代缓存“或”现代缓存之王。
脱胎于Guava Cache , 结合LRULFU的优势使用一种W-TinyLFU的算法结构
从Spring5开始Caffeine将取代Guava Cache成为Spring默认的缓存组件
Caffeine是一个基于Java的内存缓存库与其他缓存组件相比它具有以下几个优势
高性能Caffeine被设计成高性能的缓存库它使用了多种优化技术来提供快速的缓存访问包括使用本地内存和原生数据结构避免了不必要的开销。低延迟Caffeine的设计目标之一是提供低延迟的缓存访问。它采用了基于时间戳的缓存失效策略和预先加载机制以减少对外部资源的依赖和等待时间。强大的功能Caffeine提供了丰富的功能包括缓存过期、缓存加载、缓存刷新、缓存移除等。它支持异步加载和自定义缓存策略可以根据具体需求进行灵活配置。内存管理Caffeine提供了细粒度的内存管理功能可以设置缓存的最大大小、最大条目数、过期时间等。它还支持缓存的自动回收和大小基于权重的淘汰策略可以有效地管理内存。易于使用Caffeine提供了简单易用的API可以方便地创建和管理缓存。它还提供了详细的文档和示例代码以帮助开发者快速上手和集成。
Caffeine在性能、延迟、功能和内存管理等方面都具有优势适用于对缓存性能要求较高的场景。它可以作为Java应用程序的缓存解决方案提供快速、可靠和灵活的缓存支持。