Redis应用-缓存

目录

什么是缓存

使用redis作为缓存

缓存的更新策略

通用的淘汰策略

redis内置的淘汰策略

缓存预热

缓存穿透

缓存雪崩

缓存击穿


什么是缓存

缓存(cache)是计算机中一个经典的概念,在很多的场景中都会涉及到.

核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方,方便随时读取.

对于计算机来说,往往访问速度越快的设备,成本越高,存储空间越小.

因此,缓存是更快了,但是空间上往往是不足的.所以大部分的时候,缓存只存放一些热点数据(频繁访问的数据).

二八定律:20%的热点数据能够应对80%的访问场景,因此只需要把这少量的热点数据缓存起来,就可以应对大多数的场景,从而整体上有明显的性能提升.

使用redis作为缓存

我们通常使用redis来作为数据库(mysql)等的缓存.

数据库是非常重要的组件,在绝大部分商业项目中都会使用到,并且mysql的速度又比较慢,所以就可以使用redis来作为mysql的缓存.

因为mysql等数据库的效率比较低,所以承担的并发量有限,一旦请求的数量多了,数据库的压力就会很大,甚至很容易宕机.

为什么并发量⾼了就会宕机?
服务器每次处理⼀个请求, 都是需要消耗⼀定的硬件资源的. 所谓的硬件资源包括不限于 CPU,
内存, 硬盘, ⽹络带宽...... ⼀个服务器的硬件资源本⾝是有限的. ⼀个请求消耗⼀份资源, 请求多了, ⾃然把资源就耗尽了. 后续的请求没有资源可⽤, ⾃然就⽆法正确处理. 更严重的还会导致服务器程序的代码出现崩溃.

如何让数据库承担更大的并发量,核心思路有两个:开源和节流.

开源:引入更多的机器,部署更多的数据库实例,构成数据库集群.

节流:引入缓存,使用其他的方式保存经常访问的热点数据,从而降低直接访问数据库的请求数量.

redis就是一个用来作为数据库缓存的常见方案,redis的访问速度比mysql快很多,或者说处理同一个访问请求,redis消耗的系统资源比mysql少很多,因此redis能支持的并发量更大.

redis就像是一个护盾一样,保护着mysql.

客户端访问业务服务器,发起查询请求,业务服务器会先查询redis,查看想要的数据是否在redis中存在,如果在redis中存在了,就直接返回,此时就不必访问mysql了;如果在redis中不存在,在去查询mysql.

根据二八定律,只需要在redis中存放20%的热点数据,就可以使80%的请求不在真正的查询mysql,从而大大提高整体的访问效率,降低数据库的压力.

需要注意的是:缓存是用来加快读操作的速度的,如果写操作,还是要写进数据库,此时缓存并不能提高性能.


缓存的更新策略

如何知道redis中应该存储哪些数据,如何知道哪些数据是热点数据呢?

1.定期生成

每隔一定的周期(比如一天/一周/一个月),对于访问的数据频次进行统计,挑选出访问频次最高的前N%的数据.

优点:实现起来比较简单,过程更加可控,方便排查问题.

缺点:实时性不够,如果出现一些突发性事件,有一些本来不是热点的数据变成了热点数据,那么新的热点数据可能会给数据库带来较大的压力.

2.实时生成

先给缓存设定容量上限(可以通过redis配置文件的maxmemory参数设定).

接下来用户的每次查询,如果在redis中查到了,就直接返回,如果redis中不存在,就从数据库查,同时把查到的结果也写入redis.

如果缓存满了,就会触发内存淘汰策略,把一些相对不那么热门的数据淘汰掉.

按照上述过程,持续一段事件之后,redis内部的数据自然就是热门数据了.

通用的淘汰策略

FIFO(first in first out)

先进先出,把缓存中存在时间最久的,也就是先来的数据,淘汰掉.

LRU(least recently used)

淘汰最久未使用的,记录每个key的最近访问时间,把最近访问时间最老的key淘汰掉.

LFU(least frequently used)

淘汰访问次数最少的,记录每个key最近一段时间的访问次数,把访问次数最少的淘汰掉.

Random

随机淘汰,从所有的key中随机抽取淘汰掉.

上述的淘汰策略,可以自己实现,redis也提供了内置的淘汰策略,供我们直接使用.

redis内置的淘汰策略

volatile-lru 当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中使⽤LRU(最近最
少使⽤)算法进⾏淘汰
allkeys-lru 当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LRU(最近最少使⽤)算法进
⾏淘汰.
volatile-lfu 4.0版本新增,当内存不⾜以容纳新写⼊数据时,在过期的key中,使⽤LFU算法
进⾏删除key.
allkeys-lfu 4.0版本新增,当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LFU算法进⾏
淘汰.
volatile-random 当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中,随机淘汰数
据.
allkeys-random 当内存不⾜以容纳新写⼊数据时,从所有key中随机淘汰数据.
volatile-ttl 在设置了过期时间的key中,根据过期时间进⾏淘汰,越早过期的优先被淘汰.
(相当于 FIFO, 只不过是局限于过期的 key)
noeviction 默认策略,当内存不⾜以容纳新写⼊数据时,新写⼊操作会报错.

缓存预热

使⽤ Redis 作为 MySQL 的缓存的时候, 当 Redis 刚刚启动, 或者 Redis ⼤批 key 失效之后, 此时由于 Redis ⾃⾝相当于是空着的, 没啥缓存数据, 那么 MySQL 就可能直接被访问到, 从⽽造成较⼤的压⼒.因此就需要提前把热点数据准备好, 直接写⼊到 Redis 中. 使 Redis 可以尽快为 MySQL 撑起保护伞. 热点数据可以基于之前介绍的统计的⽅式⽣成即可. 这份热点数据不⼀定⾮得那么 "准确", 只要能帮助MySQL 抵挡⼤部分请求即可. 随着程序运⾏的推移, 缓存的热点数据会逐渐⾃动调整, 来更适应当前情况.

缓存穿透

访问的 key 在 Redis 和 数据库中都不存在. 此时这样的 key 不会被放到缓存上, 后续如果仍然在访问该key, 依然会访问到数据库.
这就会导致数据库承担的请求太多, 压⼒很⼤. 这种情况称为 缓存穿透.

缓存穿透产生的原因:

1.业务设计不合理,比如缺少必要的参数校验缓解,导致非法的key也被进行查询了.
2.开发/运维的误操作,导致部分数据从数据库上删除了.
3.黑客的恶意攻击.
如何解决:
1.针对要查询的参数进行严格的合法性校验.
2.针对数据库上不存在的key,也存储到redis中,比如value设置成"",避免后续频繁的访问数据库.
3.使用布隆过滤器先判定key是否存在,再去真正的查询.

缓存雪崩

短时间内大量的key在缓存上失效,导致数据库压力骤增,设置直接宕机.

产生原因

大规模的key失效,可能性主要有两种.

1.redis直接挂了.redis宕机或者redis集群模式下大量节点宕机.

2.redis上大量的key同时过期.很可能之前短时间内设置了很多key给redis,并且设置的过期时间是相同的.

解决方法

1.加强监控报警,加强redis集群可用性的保证.

2.不给key设置过期时间,或者在设置过期时间的时候添加随机因子,避免同一时间过期.


缓存击穿

cache breakdown,也可以叫做缓存瘫痪/崩溃.

相当于缓存雪崩的特殊情况,针对热点key,突然过期了,导致大量的请求直接访问到数据库上,甚至引起数据库宕机.

如何解决

1.基于统计的方式发现热点key,并设置永不过期.

2.进行必要的服务降级,例如访问数据库的时候使用分布式锁,限制同时请求数据库的并发数.

服务降级:在特定的情况下,适当的关闭一些不重要的功能,只保留核心的功能.


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/222999.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javascript实现List列表数据结构

书籍推荐 有幸拜读《数据结构与算法Javascript描述》这本书,先强烈安利一波!非常感谢作者大大给我们前端领域带来这本书。 全书从javascript的角度出发,简单明了的分析了数据结构在javascript领域的实现过程与实际的应用案例,且…

VA03 凭证流 查看备忘

今天被问到了,为什么这个销售订单 只显示了3 EA 仔细看了一下,前面10 是行项目 看销售订单 最后发现,凭证流跟选择查看的行项目有关系 以前一直没有关注这个细节

QT-在ui界面中给QWidget增加Layout布局的两种方法

QT-在ui界面中给QWidget增加Layout布局的两种方法 方式一 在UI界面,用拖拽的方式加入Layout方式二 用notepad软件打开.ui文件,手动加入Layout代码 目标:去除右下角红标,给tab标签增加Layout属性。 方式一 在UI界面,用…

nodejs+vue+ElementUi小区社区公寓宿舍智能访客预约系统

该系统将采用B/S结构模式,前端部分主要使用html、css、JavaScript等技术,使用Vue和ElementUI框架搭建前端页面,后端部分将使用Nodejs来搭建服务器,并使用MySQL建立后台数据系统,通过axios完成前后端的交互,…

生殖感染对生育的影响有哪些?劲松中西医结合医院专家详细解读

生殖感染是指由细菌、病毒、支原体、衣原体等病原微生物引起的生殖道感染,包括前列腺炎、尿道炎、宫颈炎、盆腔炎等。生殖感染对生育的影响是多方面的,今天劲松中西医结合医院谭巍主任将详细介绍这些影响及相应的预防办法。 一、影响生育能力的因素 1.…

❀My学习Linux命令小记录(14)❀

目录 ❀My学习Linux命令小记录(14)❀ 56.man指令 57.whatis指令 58.info指令 59.--help指令 60.uname指令 ❀My学习Linux命令小记录(14)❀ 56.man指令 功能说明:查看Linux中的指令帮助。 (ps.man命…

软件工程之需求分析

一、对需求的基本认识 1.需求分析简介 (1)什么是需求 用户需求:由用户提出。原始的用户需求通常是不能直接做成产品的,需要对其进行分析提炼,最终形成产品需求。 产品需求:产品经理针对用户需求提出的解决方案。 (2)为什么要…

电力仪表在工厂车间设备电能管理系统的设计-安科瑞黄安南

摘 要:基于车间用电设备的电能管理系统架构思路及实施方法,从硬件和软件方面对此方法进行了阐述。对车间旧设备改造以及新的电能管理系统提供一种思路和便捷的方法。 关键词:电能管理系统;多功能电力仪表;PLC&#x…

菜鸟驿站寄快递真的能省钱吗?还不如去闪侠惠递快递折扣平台下单!

小伙伴们,你们知道我们平常去寄快递发快递的菜鸟驿站是怎么来的吗?今天小编就来带你一探究竟。 那么到菜鸟驿站寄快递真的能省钱吗?其实也不一定。在菜鸟驿站,工作人员称重之后,工作人员说多少就是多少,没…

测试岗外包干了3个月,技术退步明显。。。。。

先说一下自己的情况,本科生生,21年通过校招进入成都某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试…

微型5G网关如何满足智能巡检机器人应用

在规模庞大、设施复杂的炼化厂、钢铁厂、工业园区等大型、巨型区域,时刻需要对各类设施设备巡查监测,保障生产运行安全可控。传统的人工巡检存在着心态松懈、工作低效、工作强度高、工作环境恶劣等问题,仍然存在安全隐患。 而随着物联网、5G、…

UVM建造测试用例

(1)加入base_test 在一个实际应用的UVM验证平台中,my_env并不是树根,通常来说,树根是一个基于uvm_test派生的类。真正的测试用例都是基于base_test派生的一个类。 class base_test extends uvm_test;my_env e…

智能优化算法应用:基于学生心理学算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于学生心理学算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于学生心理学算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.学生心理学算法4.实验参数设定5.算法结果…

工业级路由器在智能交通系统(ITS)中的创新应用

智能交通系统(ITS)作为一种先进的交通管理与控制系统,旨在提高交通运输系统的效率、安全性和便捷性。随着科技的不断发展,智能交通系统已经成为城市交通管理的重要组成部分。而工业级路由器作为一种可靠的网络通信设备&#xff0c…

Notes数据结合报表工具Tableau

大家好,才是真的好。 我希望你看过前面两篇内容《Domino REST API安装和运行》和《Domino REST API安装和运行》,更希望你能看过《Notes数据直接在Excel中统计!》,有了这些内容作为基础,今天的内容就显得特别简单。 …

海鹰数据虾皮:为Shopee卖家提供的完美数据分析工具

在如今的电子商务领域中,如何更好地了解市场动态、优化商品策略以提高运营效果成为了卖家们关注的重要问题。而海鹰数据(Haiying Data)作为一款专为Shopee平台设计的数据分析工具,为卖家们提供了市场趋势、商品分析、关键词优化、…

加密保卫战:上海迅软DSEU盘加密系统守护企业机密不漏一丝

企业在办公中经常会遇到这类情况:员工为了方便,随意使用U盘拷贝公司的机密资料。不幸的是,一旦U盘丢失或者被窃取,公司的机密资料就有可能外泄。这不仅会对公司的声誉造成损害,还会对公司的利益带来威胁,除…

检索字符串每个字符出现的次数!!!

1.创建一个html。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title></h…

Centos7安装GItLab(在线版)

基础环境准备 1.配置清华大学镜像仓库 新建仓库配置文件使用 vim /etc/yum.repos.d/gitlab-ce.repo 命令&#xff0c;输入以下内容,保存 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck0 enabl…

service层报错:Invalid bound statement (not found)

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …