本文将详细说明如何解决Redis缓存中的异常问题。边肖觉得很实用,分享给大家参考。希望你看完这篇文章能有所收获。
00-1010缓存雪崩指的是大面积缓存同时失效,因此后续的请求会落在数据库上,导致数据库在短时间内承受大量请求而崩溃。
解决方案
1.缓存数据的过期时间是随机设置的,以防止大量数据同时过期。
2.当一般并发不是特别大时,最常用的解决方案是锁定和排队。
3.为每个缓存的数据添加相应的缓存标签,记录缓存是否无效,如果缓存标签无效,则更新数据缓存。
缓存雪崩
缓存穿透是指不在缓存或数据库中的数据,导致所有请求都落在数据库上,导致数据库在短时间内因大量请求而崩溃。
解决方案
1.接口层增加检查,如用户认证检查、id为基本检查、id=0的直接拦截;
2.无法从缓存中提取的数据也不会在数据库中提取。此时,键值对也可以写成key-null,缓存有效时间可以设置得短一些,例如30秒(设置太长会使其在正常情况下无法使用)。这样可以防止攻击者反复使用同一个id进行暴力攻击;
3.使用Bloom filter,将所有可能的数据哈希成一个足够大的位图,某个不存在的数据就会被这个位图截获,从而避免了底层存储系统的查询压力。
附加
空间的利用已经到了极致,那就是位图和布隆过滤器。
Bitmap:哈希表就是一个典型的例子。
缺点是位图只能为每个元素记录1位信息。想要完成额外的功能,恐怕只能牺牲更多的空间和时间了。
布隆过滤器(推荐)
即引入k(k1)k(k1)个独立的哈希函数,保证元素权重确定的过程在给定的空间和误判率下完成。
其优点是空间效率和查询时间远超一般算法,缺点是有一定的误识率和删除难度。
布隆过滤器算法的核心思想是使用几种不同的哈希函数来解决“冲突”。
Hash存在冲突(碰撞)问题,同一Hash得到的两个URL的值可能是相同的。为了减少冲突,我们可以引入更多的散列。如果其中一个散列显示一个元素不在集合中,那么这个元素肯定不在集合中。只有当所有Hash函数都告诉我们元素在集合中时,我们才能确定元素存在于集合中。这是布隆过滤器的基本思想。
布隆过滤器通常用于确定一个元素是否存在于一个大数据集中。
00-1010缓存细分是指不在缓存中但存在于数据库中的数据(通常缓存时间到期)。此时由于大量并发用户,在不同时读取数据的情况下读取缓存,同时去数据库获取数据,导致数据库压力瞬间增大,造成压力过大。与缓存雪崩不同,缓存崩溃指的是对同一条数据的并发查询。缓存雪崩指的是对数据库的查询,因为不同的数据已经过时,很多数据找不到。
解决方案
1.设置热点数据永远不会过期。
2.添加互斥,互斥
00-1010缓存预热是指系统上线后,相关缓存数据直接加载到缓存系统中。这样就可以避免用户请求数据时,先查询数据库再缓存数据的问题!用户可以直接查询预先预热的缓存数据!
解决方案
1.直接写一个缓存刷新页面,在线时手动操作;
2.数据量小,可以在项目启动时自动加载;
3.定期刷新缓存;
00-1010当访问次数急剧增加、服务问题(如响应时间缓慢或无响应)或非核心服务影响核心流程的性能时,仍然需要确保服务仍然可用,即使它们对服务有害。系统可以根据一些关键数据自动降级,也可以配置开关实现手动降级。
缓存降级的最终目标是确保核心服务的可用性,即使核心服务已经损坏。而且有些服务是不能降级的(比如加入购物车和结算)。
降级前要梳理一下制度,看能不能用来保帅。从而理清哪些必须保护到死,哪些可以降级;例如,您可以参考日志级别来设置计划:
1.一般:例如,某些服务偶尔会因网络抖动或服务在线而超时,这可能会自动降级;
2.警告:某些服务的成功率在一定时间内波动(例如在95%到100%之间),可以自动或手动降级,并发出警报;
3.错误:比如可用性率低于90%,或者数据库连接池被炸,或者访问次数突然增加到系统能够承受的最大阈值,那么可以根据情况自动降级或者手动降级;
4.严重错误:如因特殊原因数据有误,此时需要紧急手动降级。
服务降级的目的是防止Redis服务失效,导致数据库雪崩问题。因此,对于不重要的缓存数据,您可以
服务降级策略,例如一个比较常见的做法就是,Redis出现问题,不去数据库查询,而是直接返回默认值给用户。
缓存热点key
缓存中的一个Key(比如一个促销商品),在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
解决方案
对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询
关于“如何解决Redis缓存异常的问题”这篇文章就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/149944.html