百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

轻松理解redis做缓存的流程

nanshan 2024-12-10 18:56 11 浏览 0 评论

1.redis的缓存过期处理

a.(主动)定时删除

Redis会定时的抽查一些随机的key,默认1秒钟抽查10次(可配置),一旦抽查到某一个key是过期的,Redis就会删除这个key。


# 默认每秒钟10次,把这个设置的越大意味着占用的CPU也就越多。范围在1到500之间,但是超过100的值通常

# 不是好主意。大多数用户应该使用默认值10并将其提高到仅在需要非常低延迟的环境中。hz 10


b.(被动)惰性删除

客户端在请求的时候,有可能会请求到一个已经过期的key,这种时候就是删除这个key的时候。用户在请求查询某一个key的时候,那么 redis 会检查这个 key 是否过期,如果过期则删除,返回一个 nil,这种策略对 CPU 比较友好,不会有太多的损耗,但缺点是过期的key无法及时删除。


2.redis的内存淘汰机制

内存如果占满了,可以使用硬盘,但是没有意义,因为硬盘没有内存块,会严重影响 redis 的性能,所以,当内存占用满了之后,redis 提供了一套缓存淘汰机制,即 memory management


# 当内存已使用值达到 maxmemory,开始清理缓存
# 单位:bytes(字节),123000000Byte ≈ 117.3M
maxmemory 123000000

maxmemory-policy 缓存淘汰策略值枚举:

# volatile开头的策略针对设置了过期时间的key
# allkeys开头的策略针对内存中所有的key

# volatile-lru:在使用 expire 设置了过期时间的 key 中,删除最近最少使用的缓存,然后保存新的缓存

# allkeys-lru:删除最近最少使用的缓存,然后保存新的缓存(推荐使用)

# volatile-lfu:在使用 expire 设置了过期时间的 key 中,删除最不经常使用的缓存,然后保存新的缓存

# allkeys-lfu:删除最不经常使用的缓存,然后保存新的缓存(推荐使用)

# volatile-random:在使用 expire 设置了过期时间的 key 中,随机删除一个 key

# allkeys-random:在所有 key 中,随机删除一个 key

# volatile-ttl:在使用 expire 设置了过期时间的 key 中,删除最快要过期的 key,即删除 TTL 最小的 key

# noeviction:不删除任何数据,报出写操作异常(默认值)


如果没有设置maxmemory,将导致Redis在达到堆限制时以内存不足异常终止。


在设置了maxmemory之后,当内存使用达到maxmemory时,Redis将使用maxmemory-policy指定的策略对缓存进行删除。


3.redis缓存击穿的原因

key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。让数据库承压


4.redis缓存雪崩的原因

主要是对于redis集群来说的,大量的缓存失效,由数据库承压,叫做雪崩

5.redis缓存穿透的原因

key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

通俗理解:用户发起的请求,缓存中没有数据,数据库中也没有响应的数据,短时间发起大量的假请求都走了数据库,让数据库承压了,并且数据库中还不存在这些数据


三,缓存穿透解决方案

一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。


有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。


四,缓存击穿解决方案

key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题。

使用互斥锁(mutex key)


业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。


SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。


五,缓存雪崩解决方案

与缓存击穿的区别在于这里针对很多key缓存,前者则是某一个key。


缓存正常从Redis中获取,示意图如下:


缓存失效时的雪崩效应对底层系统的冲击非常可怕!大多数系统设计者考虑用加锁或者队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。还有一个简单方案就是将缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。


加锁排队只是为了减轻数据库的压力,并没有提高系统吞吐量。假设在高并发下,缓存重建期间key是锁着的,这是过来1000个请求999个都在阻塞的。同样会导致用户等待超时,这是个治标不治本的方法!


注意:加锁排队的解决方式解决的是分布式环境的并发问题,有可能还要解决分布式锁的问题;线程还会被阻塞,用户体验很差!因此,在真正的高并发场景下很少使用!


缓存标记:记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际key的缓存;

缓存数据:它的过期时间比缓存标记的时间延长1倍,例:标记缓存时间30分钟,数据缓存设置为60分钟。这样,当缓存标记key过期后,实际缓存还能把旧数据返回给调用端,直到另外的线程在后台更新完成后,才会返回新缓存。

关于缓存崩溃的解决方法,这里提出了三种方案:使用锁或队列、设置过期标志更新缓存、为key设置不同的缓存失效时间,还有一种被称为“二级缓存”的解决方法。

相关推荐

服务器温度监控--lm-sensors(服务器温度怎么看)

lm-sensors是一款linux的硬件监控的软件,可以帮助我们来监控主板,CPU的工作电压,风扇转速、温度等数据。这些数据我们通常在主板的BIOS也可以看到。当我们可以在机器运行的时候通过...

MySQL版本区别及管理(mysql版本最新版本)

MySQL版本区别及管理一.MySQL5.6与MySQL5.7安装的区别1、cmake的时候加入了bostorg2、初始化时使用mysqld--initialize替代mysql_install...

Linux技术问答系列-NO4(linux必知必会)

一.绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令?绝对路径:如/etc/init.d当前目录和上层目录:./../主目录:~/切换目录:cd二...

猫盘原版系统开启ssh教程(猫盘原版系统怎么样)

猫盘是之前网上流传许久的矿渣,默认其系统不支持SSH功能,为了能打开其SSH功能,我特意制作操作教程如下:1、到网盘下载相关软件,利用猫盘系统自带功能,将assets放入个人存储目录下,并牢记对应的...

一探究竟——天融信网闸TopRules7000

网闸即:安全隔离与信息交换系统,常用作企业内外网隔离与业务互访用途。相比给服务器加多块网卡跨多个网段来说,网闸提供了更加安全的方式。探究背景:某次,网闸配置新业务,重启设备查看是否生效,结果发现刚重启...

操作系统加固通用Linux篇(linux系统加固常见操作)

1检查是否配置登陆超时时间设置编辑vi/etc/profile文件,配置TMOUT将值设置为低于300.TMOUT=3002检查是否禁止root用户登录FTP设置如下将对应配置文件中,设置roo...

zabbix agent的安装与配置(zabbix-agent安装)

Agent安装rpm-ivhzabbix-agent-3.2.4-1.el6.x86_64.rpm安装完成后,zabbixagent端已经安装完成了,zabbixagent端的配置目录位于/e...

Linux基础命令之计划任务(linux计划任务crontab)

一、计划任务1、at只能执行一次语法:at时间服务:atd必须开启123[root@xuegod163~]#/etc/init.d/atdstatus#查看服务状态atd(pid2...

Secure Delivery Center (SDC)安装指南二:Delivery Hub

免费下载SecureDeliveryCenter2015>7月23日软件分发管理神器SecureDeliveryCenter免费技术交流会,MyEclipse原厂商倾力主讲,敬请关注!...

OpenWrt 常用命令及用法!!(openwrt常用功能)

OpenWrt是一个高度可定制的嵌入式Linux操作系统,常用于路由器等网络设备。以下是一些常见的OpenWrt命令及其详细解释和示例操作:一、系统信息相关命令1.`uname-a``u...

Linux 设置定时任务crontab命令(linux定时任务cron表达式)

看了同事的脚本,发现他用了cron来自检自身的那个程序是否崩溃了,这是有多大的不自信才用这种机制的?点击(此处)折叠或打开$sudocat/var/spool/cron/crontabs/ro...

vCenter纳管ESXI主机出错(vsphere esxi)

vCenter纳管主机的大致步骤为:(1)vc和esxi交换证书,确立信任;(2)esxi把自己的资源信息同步到VC,VC建立清单。(3)VC在esxi建立几个操作用户;(4)然后下发...

从选购到安装 小白也能看懂的超全NAS经验分享

0.篇首语Hello大家好,我是KC,上一篇器材和工作流分享的文章里,有小伙伴问我怎么没有提到NAS?其实是因为前段时间碰巧更换了一台新NAS,折腾了一段时间很多内容还没来及整理和汇总,今天就...

手把手教你!如何在 Linux 服务器中搭建 Sentinel 环境?

你在Linux服务器上搭建Sentinel环境时,是不是也遇到过各种报错,要么是启动失败,要么是配置后无法正常访问控制台?看着同事顺利搭建好,自己却一头雾水,别提多着急了!其实,很多互联网大厂...

服务器被暴力破解的解决办法(二)(服务器被攻破严重吗)

上一次,我们说到小王公司服务器遭遇暴力破解,拿到解决方案回公司就开始部署。部署完成后的确起到了一定的效果,不过接下来的一个问题让他很头疼,原来黑客虽然攻入不进系统,但是依旧不依不饶的进行暴力破解。...

取消回复欢迎 发表评论: