当前位置: 首页 > news >正文

redis之缓存

概念

在一个网站中,我们经常会使用关系型数据库(如MySQL)来存储数据,由于关系型数据的数据是存储在硬盘上的,因此我们对关系型数据库的操作是需要在硬盘上执行的,硬盘的IO 性能是很慢的,因此关系型数据库的性能不大,相比于我们的 NoSQL(如:redis),这种直接在内存上操作数据的,我们的 redis 则效率很高,因此对于一些热点数据,我们可以存储到 redis 中,由 redis 来分担MySQL的负担

除了引入缓存之外,我们还可以引入更多的机器,部署更多的数据库实例,构成数据库集群.(主从复制,分库分表等…),提高数据库的并发量

注意!
缓存是用来加快“读操作”的速度的.如果是“写操作”,还是要老老实实写数据库,缓存并不能提高写操作的性能.

缓存的更新策略

定期生成

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

以搜索引擎为例:
用户在搜索引擎中会输入一个“查询词”,有些词是属于高频的,大家都爱搜(鲜花,蛋糕,同城交
友,不孕不育…).有些词就属于低频的,大家很少搜搜索引擎的服务器会把哪个用户什么时间搜了啥词,都通过日志的方式记录的明明白白,然后
每隔一段时间对这期间的搜索结果进行统计(日志的数量可能非常巨大,这个统计的过程可能
需要使用hadoop或者spark等方式完成).从而就可以得到"高频词表".

这种做法实时性较低,对于一些突然情况应对的并不好,比如春节期间,“春晚”这样的词就会成为非常高频的词,而平时则很少会有人搜索“春晚”

实时生成

先给缓存设定容量上限(可以通过Redis配置文件的maxmemory参数设定).
接下来把用户每次查询:
如果在Redis查到了,就直接返回
如果Redis中不存在,就从数据库查,把查到的结果同时也写入Redis。
如果缓存已经满了(达到上限),就触发缓存淘汰策略
把一些“相对不那么热门”的数据淘汰掉。
按照上述过程,持续一段时间之后Redis内部的数据自然就是“热门数据”了.

淘汰策略

FIFO (First In First On)(先进先出):把缓存中存在时间最久的数据淘汰掉

LRU (Least Recently Used):将最久未使用的数据淘汰掉,通过记录每个key 的最近访问时间,将最近最久没访问的 key 淘汰掉

LFU (Least Frequently Used):淘汰访问次数最少的 key

Random 随机淘汰


上面四种是我们的主要的策略,现在我们来看一下 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提供的策略和我们上述介绍的通用策略是基本一致的.只不过Redis这里会针对“过期key" 和"全部 key" 做分别处理.

缓存预热(Cache preheating)

使用Redis作为MySQL的缓存的时候,当Redis刚刚启动,或者Redis大批key失效之后,此时由于Redis自身相当于是空着的,没啥缓存数据,那么MySQL就可能直接被访问到,从而造成较大的压力。

因此就需要提前把热点数据准备好,直接写入到Redis中.使Redis可以尽快为MySQL撑起保护伞。热点数据可以基于之前介绍的统计的方式生成即可,这份热点数据不一定非得那么“准确",只要能帮助MySQL抵挡大部分请求即可,随着程序运行的推移,缓存的热点数据会逐渐自动调整,来更适应当前情况.

缓存穿透(Cache penetration)

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

原因可能有几种:
业务设计不合理,比如缺少必要的参数校验环节,导致非法的key也被进行查询了,
开发/运维误操作,不小心把部分数据从数据库上误删了.
黑客恶意攻击.

解决方案:
针对要查询的参数进行严格的合法性校验,比如要查询的key是用户的手机号,那么就需要校验当前key是否满足一个合法的手机号的格式.
针对数据库上也不存在的key,也存储到Redis中,比如value就随便设成一个"".避免后续频繁访问数据库.
使用布隆过滤器先判定key是否存在,再真正查询.

缓存雪崩(Cache avalanche)

什么是缓存雪崩
短时间内大量的key在缓存上失效,导致数据库压力骤增,甚至直接宕机

产生原因:
大规模 key失效,可能性主要有两种:
Redis挂了.
Redis上的大量的 key同时过期.
为啥会出现大量的key同时过期?
这种和可能是短时间内在Redis上缓存了大量的key,并且设定了相同的过期时间.

解决方案:
部署高可用的Redis集群,并且完善监控报警体系.
不给key设置过期时间或者设置过期时间的时候添加随机时间因子.

缓存击穿(Cache breakdown)

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

解决方案:
基于统计的方式发现热点key,并设置永不过期
进行必要的服务降级,例如访问数据库的时候使用分布式锁,限制同时请求数据库的并发数。

http://www.dtcms.com/a/398199.html

相关文章:

  • 新网站seo外包蓟县做网站公司
  • 六一儿童节网站制作设计公司可以是高新企业
  • VVIC 平台商品详情接口高效调用方案:从签名验证到数据解析全流程
  • 基于物联网的智能衣柜系统的设计(论文+源码)
  • 03)阿里 Arthas(阿尔萨斯)开源的 Java 诊断工具使用-排查web项目请求后响应超时或响应慢;trace、stack、profiler指令使用
  • RNN-Gauss / RNN-GMM 模型的结构
  • Spring框架接口之RequestBodyAdvice和ResponseBodyAdvice
  • Unity 性能优化 之 打包优化( 耗电量 | 发热量 | 启动时间 | AB包)
  • 北京南站在几环山西路桥建设集团网站
  • 北京专业网站建设公司哪家好网站及备案
  • RabbitMQ-保证消息不丢失的机制、避免消息的重复消费
  • 分布式之RabbitMQ的使用(1)
  • 基于Java后端与Vue前端的MES生产管理系统,涵盖生产调度、资源管控及数据分析,提供全流程可视化支持,包含完整可运行源码,助力企业提升生产效率与管理水平
  • 阿里云ACP云计算和大模型考哪个?
  • RabbitMQ C API 实现 RPC 通信实例
  • Ingress原理:七层流量的路由管家
  • 代理网站推荐做网站公司是干什么的
  • 个人建设门户网站 如何备案网址域名注册信息查询
  • React 19 vs React 18全面对比,掌握最新前端技术趋势
  • 链改2.0倡导者朱幼平:内地RWA代币化是违规的,但RWA数资化是可信可行的!
  • iOS 混淆后崩溃分析与符号化实战,映射表管理、自动化符号化与应急排查流程
  • 【JavaSE】【网络原理】网络层、数据链路层简单介绍
  • PyTorch 神经网络工具箱核心内容
  • Git高效开发:企业级实战指南
  • 外贸营销型网站策划中seo层面包括影楼网站推广
  • ZooKeeper详解
  • RabbitMQ如何构建集群?
  • 【星海随笔】RabbitMQ开发篇
  • 深入理解 RabbitMQ:消息处理全流程与核心能力解析
  • docker安装canal-server(v.1.1.8)【mysql->rabbitMQ】