`

缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性

阅读更多

缓存淘汰

为什么需要缓存淘汰?你需要缓存30G的数据,但是Redis本身只能使用10G的内存,那你就得做个取舍了,毕竟鱼与熊掌不可兼得。为了利益最大化肯定要保留最重要的10个G。

Redis本身提供了6中缓存淘汰策略,以下属性表示允许使用的最大内存

1
server.maxmemory

当使用的内存超过限制内存时,Redis会根据配置的以下6中淘汰策略选择数据淘汰

  • volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
  • allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集中任意选择数据淘汰
  • no-enviction:内存不足时添加数据会报错(没人用这个吧?)
    其他相关配置:
1
2
3
4
#指定数据淘汰算法
maxmemory-policy allkeys-lru
#LRU和最小TTL算法的样本个数
maxmemory-samples 5

缓存穿透

大量的请求瞬时涌入系统,而这个数据在Redis中不存在,从而所有的请求都落到了数据库上从而把数据库打死。造成这种情况的原因如下:

  • 系统设计不合理,缓存数据更新不及时
  • 爬虫等恶意攻击

解决方案:

  • 如果key在数据库中也不存在,那么就写一个空值到Redis中,并设置一个过期时间,避免一直占用内存
  • 查询缓存之前使用布隆过滤器拦截

缓存击穿

缓存击穿,就是常说的热点key问题,当一个正有非常巨大的访问量访问的key 在失效的瞬间,大量的请求击穿了缓存,直接落到了数据库上,然后所有从数据获取到数据的线程又都并发的想要把数据缓存到redis中。

解决方案:

  • 使用互斥锁,同一时刻只允许一个线程去构建缓存,其他线程等待构建完毕后去缓存取
  • 定时更新,假如缓存过期时间为60分钟,则单独设置一个线程每59分钟去负责更新缓存

缓存雪崩

由于Redis是基于内存的应用,可以很容易做到高性能、高并发从而起到保护数据库的作用。如果缓存意外挂了、所有的请求落到了数据上就形成了缓存雪崩。

解决方案:

数据库缓存双写一致性

当一个数据需要更新时因为不可能做到同时更新数据库和缓存、那么此时读取数据的时候就一定会发生数据不一致问题,而数据不一致问题在金融交易领域的系统中是肯定不允许的。

解决方案:

  • 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
  • 更新的时候,先更新数据库,然后再删除缓存。

参考自公众号:石杉的架构笔记

推荐阅读

  1. SpringCloud学习系列汇总
  2. 多线程面试必备基础知识汇总
  3. Java集合源码分析汇总-JDK1.8
  4. Linux常用命令速查-汇总篇

博客所有文章首发于公众号《Java学习录》转载请保留
扫码关注公众号即可领取2000GJava学习资源

1

0
0
分享到:
评论

相关推荐

    springboot缓存一致性解决

    9. **缓存穿透、缓存雪崩和缓存击穿**: 这是缓存系统中常见的三种问题,需要通过合理的配置和设计来预防。例如,设置合理的缓存过期时间、使用随机盐值防止缓存穿透、以及使用互斥锁防止缓存雪崩和击穿。 10. **...

    分布式数据库缓存系统设计与实现

    4. **缓存穿透、缓存雪崩和缓存击穿**:需要设计有效的策略来防止这三种问题,如设置合理的过期时间、使用随机哈希等。 三、核心技术 1. **分区策略**:如哈希分区、一致性哈希,确保数据均匀分布在各个节点上,...

    Java缓存技术深入了解

    4. **缓存一致性** - 缓存和数据库的一致性是设计缓存系统时需要考虑的重要问题。常见的解决方案有强一致性和最终一致性。 - 强一致性:每次更新都确保所有节点同步,如分布式事务。 - 最终一致性:允许短暂的不...

    处理缓存基本知识

    4. **缓存一致性**: 在分布式系统中,多台机器可能都有缓存,需要保证缓存的一致性。常见的协议有:强一致性的ACID(原子性、一致性、隔离性、持久性)和最终一致性的BASE(基本可用、软状态、最终一致)。 5. **...

    缓存技术浅谈.zip

    此外,缓存一致性是另一个需要注意的问题。当数据在源头被更新时,如何确保缓存中的数据与源头保持一致?这可以通过强一致性(如读写锁)或弱一致性(如事件驱动的更新)来实现,具体选择取决于业务需求和性能权衡。...

    亿级流量电商缓存课程

    5. **缓存一致性**: 如何保证缓存与数据库数据的一致性是电商缓存设计中的关键问题,包括强一致性和最终一致性模型。 6. **缓存更新策略**: - **写穿**:数据更新时直接写入数据库并清除缓存,之后的读请求会...

    java面试题_缓存(10题)

    8. **缓存一致性** 为了保证缓存和数据库的一致性,有几种常见的协议,如**强一致性**(所有节点同时看到相同的数据),**最终一致性**(经过一段时间,所有节点最终达到一致),以及**读写一致性**(读操作总是...

    Go-一个简单高效用于go的LRU缓存包

    - **缓存击穿与缓存雪崩**:确保在高并发场景下,正确处理缓存失效可能导致的大规模数据库请求,防止缓存击穿和缓存雪崩问题。 - **缓存同步**:在多线程环境下,需要考虑缓存的并发安全问题,可能需要使用互斥锁或...

    Web应用服务器缓存浅谈PPT

    缓存一致性是另一个重要的话题。当多个客户端同时访问同一数据时,如何保证他们看到的数据是最新的?强一致性和最终一致性是两种主要的解决方案。前者要求所有客户端都能立即看到更新,而后者允许短暂的延迟,以换取...

    优化增强的缓存机制(SimpleCache).zip

    4. **数据一致性**:在分布式系统中,要考虑缓存与数据库的一致性问题,如使用双写策略或读写穿透等方法来保证数据正确性。 5. **缓存淘汰算法**:根据不同的业务需求,选择合适的缓存淘汰策略,以保证缓存空间的...

    缓存练习2

    4. **缓存一致性**:缓存和数据库之间的数据一致性是关键问题。常见的缓存更新策略有: - Write-through:写直达,数据写入缓存的同时同步更新到数据库。 - Write-behind(Write-back):写回策略,数据先写入缓存...

    java中的缓存技术

    6. 缓存穿透、缓存雪崩和缓存击穿:这三种是缓存使用中可能出现的问题。缓存穿透是指请求的数据既不在缓存中也不在数据库中,可能导致大量请求直接打到数据库;缓存雪崩是指缓存系统在同一时间失效,导致所有请求都...

    分布式缓存

    - 数据一致性:在分布式环境中,如何保证数据的一致性是关键挑战,常见的一致性模型有强一致性、最终一致性等。 - 缓存失效策略:LRU(最近最少使用)、LFU(最不经常使用)、TTL(时间戳过期)等策略用于决定何时...

    大数据时代性能与缓存的优化

    - 缓存一致性:如MESI协议用于多核处理器中的缓存一致性,保证共享数据的正确性。 - 分级缓存:如CPU缓存(L1、L2、L3),内存缓存和分布式缓存,构成层次化的缓存体系,逐层缓存数据,减少访问时间。 5. 分布式...

    缓存优秀实践

    三、缓存一致性 1.强一致性:读写操作总是返回最新数据,实现起来复杂且性能较低。 2.弱一致性:不保证每次读取都能得到最新数据,但最终会达到一致。 3.最终一致性:在一段时间后,所有副本都会更新为最新值,...

    缓存_策略表(整理doc文档)

    四、缓存击穿、缓存穿透与缓存雪崩 这三种情况是缓存系统中常见的问题,需要针对性地设计策略来避免: 1. 缓存击穿:某个热点key失效时,所有请求都会直接落到后端,可能导致后端压力骤增。 2. 缓存穿透:恶意或...

    开放平台资源控制缓存体系的优化.pdf

    另外,缓存击穿、缓存雪崩和缓存穿透也是需要考虑的问题。缓存击穿是指大量请求同时命中缓存中不存在的数据,导致数据库压力增大;缓存雪崩是整个缓存系统失效,所有请求直接落到数据库上;缓存穿透则是恶意用户连续...

    缓存组件的实现.zip

    4. **缓存一致性**:在分布式环境中,如何保证缓存与数据库的一致性是一大挑战。常见的解决方案有: - **强一致性**:每次读写操作都确保数据立即同步,但可能影响性能。 - **最终一致性**:允许短暂的数据不一致...

    Redis缓存设计与性能优化精要

    4. **缓存与数据库双写一致性**:当同时更新缓存和数据库时,可能会出现数据一致性问题。常见的解决方案包括**Write Behind(写后)**策略,将更新操作先写入缓存,稍后再异步写入数据库,或者使用**Compare and ...

    JAVA缓存技术深入了解

    此外,我们还需要考虑缓存的并发控制,如`ReadWriteLock`、`StampedLock`等,以及缓存穿透、缓存雪崩和缓存击穿等问题,这些问题在设计缓存时都需要进行预防和处理。 最后,对于大型系统,监控和度量缓存性能也至关...

Global site tag (gtag.js) - Google Analytics