96SEO 2026-02-20 08:23 0
利用Redis的内存淘汰策略当内存不足时自动进行淘汰部分数据下次查询时更新缓存一致性差无维护成本。

因为Redis是基于内存的如果内存超过限定值(Redis配置文件的maxmemory参数决定Redis最大内存使用量)导致新的数据存不进去此时Redis会根据淘汰策略删除一些数据。
淘汰策略由Redis配置文件的maxmemory-policy参数决定设置默认为noeviction模式。
执行写请求时Redis会检查内存使用情况内存使用超过限定值按照淘汰策略删除key。
Redis写入新数据。
具体的淘汰策略redis.windows-service.conf中可以查到
noeviction默认策略当写入新数据后的内存超过限定值时写请求直接返回错误只读请求可以正常执行。
allkeys-lru当写入新数据后的内存超过限定值时从所有key中使用LRU算法最近最少使用算法淘汰最久没有使用过的key。
volatile-lru当写入新数据后的内存超过限定值时从设置了过期时间的key中使用LRU算法淘汰最久没有使用过的key。
allkeys-random当写入新数据后的内存超过限定值时从所有key中随机淘汰key。
volatile-random当写入新数据后的内存超过限定值时从设置了过期时间的key中随机淘汰key。
volatile-ttl当写入新数据后的内存超过限定值时从设置了过期时间的key中根据过期时间淘汰key越快过期越早淘汰。
allkeys-lfu当写入新数据后的内存超过限定值时从所有key中使用LFU算法最少频率访问算法淘汰使用频率最低的key。
volatile-lfu当写入新数据后的内存超过限定值时从设置了过期时间的key中使用LFU算法淘汰使用频率最低的key。
缓存添加过期时间到期后根据过期删除策略自动进行删除缓存下次查询时更新缓存一致性一般维护成本低。
优点key一旦过期就会立即删除不会占用内存。
缺点过期key较多时删除key会占用CPU时间影响服务器的响应时间吞吐量性能。
惰性删除过期key不会马上被删除而是继续保存在内存中当key被访问时检查key的过期时间若已过期则删除。
优点只在访问时才会对检查key的过期时间没使用的key不会占用CPU的时间去检查过期时间不会影响服务器的响应时间吞吐量性能。
缺点没有被访问的过期key继续保存在内存中导致内存不会被释放消耗内存资源。
定期删除每隔一段时间(时间可以自行设置Redis配置文件的hz参数表示1s执行多少次定期删除策略默认值10)随机抽取设置了过期时间的key检查它们的过期时间删除已过期的key。
优点可以指定频率来减少删除操作对CPU性能的影响定期删除也能释放没有被访问的过期key占用的内存。
缺点频率高影响CPU的性能频率低过期key占用的内存不会及时释放。
Pattern即旁路缓存模式旁路路由策略最经典常用的缓存策略。
由应用程序负责缓存和DB的读写。
读写操作步骤
读操作时先读缓存缓存存在直接返回缓存不存在则读DB然后把读的DB数据存入缓存返回。
写操作时先更新DB再删除缓存。
Pattern即读写穿透模式该模式下应用程序只与缓存管理组件交互缓存管理组件负责缓存和DB的读写。
Through读操作时缓存管理组件先读缓存缓存存在直接返回缓存不存在则读DB然后把读的DB数据存入缓存返回。
Write
Pattern即异步缓存写入该模式下应用程序只与缓存管理组件交互操作缓存管理组件负责缓存和DB的读写通过定时或阈值的异步方式将数据同步到DB保证最终一致。
该模式和Read/Write模式相似不同点在于Read/Write模式更新DB和更新缓存是同步的而Write
优点减少了更新DB的频率读写响应非常快吞吐量也会有明显的提升。
缺点不能实时同步数据同步DB过程服务不可用导致数据丢失。
Pattern应用程序负责缓存和DB的读写使用简单直接操作缓存和DB需要编写对缓存和DB读写的代码Read/Write
Pattern应用程序只与缓存管理组件交互缓存管理组件负责缓存和DB的读写使代码更简洁缓存管理组件需要提供对DB和缓存读写的方法Write
Pattern应用程序只与缓存管理组件交互缓存管理组件负责缓存和DB的读写性能最好在高并发场景下可以降低数据库的压力缓存管理组件需要提供对DB和缓存读写的方法
策略说明一致性维护成本内存淘汰使用Redis的内存淘汰策略当内存不足时自动进行淘汰部分数据下次查询时更新缓存差无过期删除缓存添加过期时间到期后根据过期删除策略自动进行删除缓存下次查询时进行更新缓存低低主动更新修改数据库时也修改缓存使用硬编码方式或者硬编码中间件方式在修改数据库时同步或异步的修改缓存好高
删除缓存更新DB时删除缓存查询时再从DB中读取数据并更新到缓存。
更新缓存更新DB时更新缓存频繁更新缓存开销大且并发时可能导致请求读取的缓存数据是旧数据。
所有线程都是先更新DB再更新缓存在某个写线程更新DB后继续更新缓存时可能因为网络原因出现延迟这时其他写线程也更新了DB和缓存导致缓存和DB数据不一致。
理论上先更新DB的线程理应也会先更新缓存但是并发场景下线程的执行顺序无法保证
先线程2再线程1此时缓存是线程1的数据DB是线程2的数据导致缓存和DB数据不一致。
在写线程更新DB和更新缓存之间读线程可以获取到旧数据但最终会一致。
所有线程都是先更新DB再删除缓存无论哪个线程先更新DB再删除缓存缓存都会被删除不会导致缓存和DB数据不一致。
无论哪个线程先更新DB再删除缓存缓存都会被删除不会导致缓存和DB数据不一致。
在写线程更新DB再删除缓存之间读线程可以获取到旧数据但最终会一致。
所有线程都是先更新缓存再更新DB在某个写线程更新缓存和更新DB之间其他写线程也更新了缓存和DB导致缓存和DB数据不一致。
总结理论上先更新缓存的线程也会先更新DB但是并发场景下线程的执行顺序无法保证
线程2再线程1此时缓存是线程2的数据DB是线程1的数据导致缓存和DB数据不一致。
在写线程更新缓存和更新DB之间读线程也可以获取到最新的缓存不会导致缓存和DB数据不一致。
可以保证缓存和DB数据一致虽然线程1更新DB的操作还没有完成但是更新缓存的操作已经完成了读请求可以获取到最新的缓存。
所有线程都是先删除缓存再更新DB无论哪个线程先删除缓存再更新DB缓存都会被删除不会导致缓存和DB数据不一致。
无论哪个线程先删除缓存再更新DB缓存都会被删除不会导致缓存和DB数据不一致。
在写线程删除缓存和更新DB之间读线程根据查询的DB结果更新了缓存导致缓存和DB数据不一致。
线程1删除缓存线程2查询未命中线程2查询DB线程2根据查询的DB结果更新缓存线程1更新DB
线程1删除缓存和更新DB之间线程2根据查询的DB结果更新了缓存导致缓存和DB数据不一致。
延迟双删是基于先删除缓存再更新DB的基础上的改进在更新DB后延迟一定时间再次删除缓存。
延迟是为了保证第二次删除缓存前能完成更新DB操作延迟时间根据系统的查询性能而定。
第二次删除缓存是为了保证后续请求查询DB(此时数据库中的数据已是更新后的数据)重新写入缓存保证数据一致性。
线程1删除缓存线程2删除缓存线程2更新DB线程1更新DB线程1延时删除缓存线程2延时删除缓存
线程1删除缓存线程2查询未命中线程2查询DB线程2根据查询的DB结果更新缓存线程1更新DB线程1延时删除缓存
线程1第一次删除缓存之后线程2根据查询的DB结果更新缓存此时查询得到的结果是旧数据线程1延迟第二次删除缓存之后后续查询DB(此时数据库中的数据已是更新后的数据)重新写入缓存不会导致缓存和DB数据不一致。
需要延时低延时场景不合适如秒杀等需要低延时需要强一致高频繁修改数据场景。
不能保证强一致性在更新DB之前查询线程查询得到的结果是旧数据可但可以减轻缓存和DB数据不一致的问题。
延时的时间是一个不可评估的值延时越久能规避一致性的概率越大。
在并发写场景不会导致数据不一致但是在并发读写场景会短暂的导致数据不一致但是由于删除缓存失败不会重试并发写场景、并发读写场景都可能长时间导致数据不一致。
异步删除缓存是对先更新DB后删除缓存的改进更新DB之后基于消费队列异步删除缓存。
无论哪个线程先更新DB再删除缓存缓存都会被删除不会导致缓存和DB数据不一致。
线程1更新DB线程2更新DB线程2把删除缓存放入消息队列线程1把删除缓存放入消息队列异步消息队列消费删除缓存
无论哪个线程先更新DB再删除缓存缓存都会被删除不会导致缓存和DB数据不一致。
异步删除缓存期间读线程获取的缓存是旧数据短暂出现数据不一致异步删除缓存后最终会一致。
线程1更新DB线程2查询缓存命中返回线程1把删除缓存放入消息队列异步消息队列消费删除缓存
异步删除缓存期间读线程获取的缓存是旧数据短暂出现数据不一致异步删除缓存后最终会一致。
log日志收集中间件发送日志消息到消息队列异步消息队列消费删除缓存
无论哪个线程先更新DB再删除缓存缓存都会被删除不会导致缓存和DB数据不一致。
log日志收集中间件发送日志消息到消息队列异步消息队列消费删除缓存
异步删除缓存期间读线程获取的缓存是旧数据短暂出现数据不一致异步删除缓存后最终会一致。
删除缓存的操作与主流程代码解耦。
中间件自带重试机制增加了操作缓存的成功率。
canal是阿里开发的基于数据库增量日志解析提供增量数据的订阅和消费目前主要支持MySQL的bin
log解析。
基于canal的实现方案完全避免了对业务代码的侵入核心业务代码只管更新数据库其他的不用care。
canal地址https://github.com/alibaba/canal
log日志中通过canal去监听数据库日志二进制文件解析bin
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback