redis缓存击穿怎么办


本文摘自PHP中文网,作者步履不停,侵删。

分布式缓存是网站服务端经常用到的一种技术,在读多写少的业务场景中,通过使用缓存可以有效地支撑高并发的访问量,对后端的数据库等数据源做到很好地保护。现在市面上有很多分布式缓存,比如Redis、Memcached以及阿里的Tair等,不管我们使用的哪种缓存产品,基本上都会遇到缓存击穿、缓存失效以及热点key的问题。如何有效地防止这些问题,也是我们在享受缓存带来的红利地同时,必须要解决地难题。

通常我们在使用缓存时候都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回

缓存击穿:

描述

查询一个数据库中不存在的数据,比如商品详情,查询一个不存在的ID,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成过大地压力。

解决方案:

当通过某一个key去查询数据的时候,如果对应在数据库中的数据都不存在,我们将此key对应的value设置为一个默认的值,比如“NULL”,并设置一个缓存的失效时间,这时在缓存失效之前,所有通过此key的访问都被缓存挡住了。后面如果此key对应的数据在DB中存在时,缓存失效之后,通过此key再去访问数据,就能拿到新的value了。

缓存失效:

描述

在高并发的环境下,如果此时key对应的缓存失效,此时有多个进程就会去同时去查询DB,然后再去同时设置缓存。这个时候如果这个key是系统中的热点key或者同时失效的数量比较多时,DB访问量会瞬间增大,造成过大的压力。

解决方案:

将系统中key的缓存失效时间均匀地错开,防止统一时间点有大量的key对应的缓存失效;
重新设计缓存的使用方式,当我们通过key去查询数据时,首先查询缓存,如果此时缓存中查询不到,就通过分布式锁进行加锁,取得锁的进程查DB并设置缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回缓存数据或者再次查询DB。

热点key:

描述

缓存中的某些Key(可能对应用与某个促销商品)对应的value存储在集群中一台机器,使得所有流量涌向同一机器,成为系统的瓶颈,该问题的挑战在于它无法通过增加机器容量来解决。

解决方案:

客户端热点key缓存:将热点key对应value并缓存在客户端本地,并且设置一个失效时间。对于每次读请求,将首先检查key是否存在于本地缓存中,如果存在则直接返回,如果不存在再去访问分布式缓存的机器。
将热点key分散为多个子key,然后存储到缓存集群的不同机器上,这些子key对应的value都和热点key是一样的。当通过热点key去查询数据时,通过某种hash算法随机选择一个子key,然后再去访问缓存机器,将热点分散到了多个子key上。

更多Redis相关技术文章,请访问Redis教程栏目进行学习!

以上就是redis缓存击穿怎么办的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

Redis日志篇:快速恢复的绝招

Redis高并发处理介绍

详解Redis rdb方式数据备份与恢复

Redis雪崩和穿透如何解决

什么功能需要使用Redis

使用Redis完成聊天室功能

Redis默认持久化是否开启

Redis将数据存储在哪里

Redis info命令介绍

为什么Redis是单线程、及高并发快原因详解

更多相关阅读请进入《Redis》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...