Redis 性能管理/优化 双一致性问题 缓存雪崩/击穿/穿透

这篇具有很好参考价值的文章主要介绍了Redis 性能管理/优化 双一致性问题 缓存雪崩/击穿/穿透。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

---------------------- Redis 性能管理 ----------------------------------------

----- 查看Redis内存使用 ----- 

info memory

redis-cli -a 'abc123' info memory

----- 内存碎片率 -----

  • used_memory_rss:是Redis向操作系统申请的内存。
  • used_memory:是Redis中的数据占用的内存。
  • mem_fragmentation_ratio:内存碎片率。
    mem_fragmentation_ratio = used_memory_rss / used_memory
  • used_memory_peak:redis内存使用的峰值。

内存碎片如何产生的?
Redis内部有自己的内存管理器,为了提高内存使用的效率,来对内存的申请和释放进行管理。
Redis中的值删除的时候,并没有把内存直接释放,交还给操作系统,而是交给了Redis内部有内存管理器。
Redis中申请内存的时候,也是先看自己的内存管理器中是否有足够的内存可用。
Redis的这种机制,提高了内存的使用率,但是会使Redis中有部分自己没在用,却不释放的内存,导致了内存碎片的发生。

Redis请求了一堆内存空着不用,也不还给操作系统,俗称占着茅坑不拉屎。

跟踪内存碎片率对理解Redis实例的资源性能是非常重要的
●内存碎片率在1到1.5之间是正常的,这个值表示内存碎片率比较低,也说明 Redis 没有发生内存交换。
●内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率。
●内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。需要增加可用物理内存或减少 Redis内存占用。

解决碎片率大的问题
如果你的Redis版本是4.0以下的,需要在 redis-cli 工具上输入 shutdown save 命令,让 Redis 数据库执行保存操作并关闭 Redis 服务,再重启服务器。Redis服务器重启后,Redis会将没用的内存归还给操作系统,碎片率会降下来。

Redis4.0版本开始,可以在不重启的情况下,线上整理内存碎片。

config set activedefrag yes     #自动碎片清理,内存就会自动清理了。
memory purge                    #手动碎片清理

----- 内存使用率 -----

redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换。

避免内存交换发生的方法
●针对缓存数据大小选择安装 Redis 实例(内存大多装几个Redis实例,内存小就少装)
●尽可能的使用Hash数据结构存储(hash 散列 占用空间小)
●设置key的过期时间(设置过期时间 用不到的key不让他浪费空间)

----- 内回收key -----

内存数据淘汰策略,保证合理分配redis有限的内存资源

当达到设置的最大阀值时,需选择一种key的回收策略,默认情况下回收策略是禁止删除


配置文件中修改 maxmemory-policy 属性值

vim /usr/local/redis/conf/redis.conf

--1149--
maxmemory-policy noenviction #最大内存时key的淘汰策略
●volatile-lru:从已设置过期时间的数据集合中 使用LRU算法淘汰数据(移除最近最少使用的key,针对设置了TTL的key) 
●volatile-ttl:从已设置过期时间的数据集合中 挑选即将过期的数据淘汰(移除最近过期的key)
●volatile-random:从已设置过期时间的数据集合中 随机挑选数据淘汰(在设置了TTL的key里随机移除)
●allkeys-lru:使用LRU算法从所有数据集合中淘汰数据(移除最少使用的key,针对所有的key)
●allkeys-random:从数据集合中任意选择数据淘汰(随机移除key)
●noenviction:禁止淘汰数据(不删除直到写满时报错)

其它限制相关

●maxclients #最大客户端连接数
设置redis同时可以与多少个客户端进行连接。
默认情况下为10000个客户端。
如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。

●maxmemory #最大内存使用量
Redis使用最大内存量。建议必须设置,否则,将内存占满,造成服务器宕机。
设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。
但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明redis集群有主从),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。

●maxmemory-samples #LRU/最小TTL算法的采样数量
设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个。
一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。

redis优化【重中之重】

性能优化

1)设置 config set activedefrag yes 开启内存碎片自动清理, 或者定时执行 memory purge 清理内存碎片
2)设置 maxmemory 指定redis占用最大内存大小, 设置 maxmemory-samples 指定内存数据淘汰策略的样本数量
3)设置 内存数据淘汰策略 maxmemory-policy 实现保证内存使用率不超过设置的最大内存大小
4)设置 key 的过期时间,精简 键名和键值,及控制键值的大小
5)尽可能使用 Hash 数据类型存储数据,因为 Hash 类型的一个键包含多个字段,该类型的数据占用空间较小
6)合理设置 maxclients 最大客户端连接数(10000),tcp-backlog tcp监控端口的最大连接排队数(1024), timeout 连接超时时间(30000)  

安全优化
7)设置 AOF 持久化

8)部署 主从复制 备份数据,采用 哨兵 或者 集群 模式实现高可用
9)设置 config set requirepass 开启密码验证




缓存和数据库双写一致性问题【重要】

Redis缓存服务器要与MySQL服务器中数据保持一致。

为了实现数据的一致,可以

先更新数据库,然后再删除缓存  + 缓存做过期时间,数据过期后再有读请求可从数据库直接更新缓存,以保证数据的一致性。

1.读取数据时,先从Redis中读取,如果Redis中没有,再从MvSQL中读取,并将读取到的数据写入到Redis缓存中。
2.更新数据时,先更新MySQL数据库,再更新Redis缓存。
3.删除数据时,同样需要先删除Redis缓存,再删除MvSQL数据库。
4.对于一些关键数据,可以使用MySQL的触发器(Trigger) 来实现同步更新Redis缓存。当MySQL中的数据发生变化时,触发器可以自动将变化同步到Redis中,避免了手动操作的疏漏。
5.定期同步MySQL和Redis中的数据,以确保数据的一致性。可以使用定时任务或者其他方式定期同步两个数据源中的数据,从而保持一致。




缓存的三大问题(需要知道现象原因,解决方案可以不用管,是软件开发的业务逻辑问题)

正常情况下,大量的资源请求都会被redis响应,在redis得不到响应的小部分请求才会去请求DB,这样DB的压力是非常小的,是可以正常工作的。
缓存雪崩/击穿/穿透三大问题的根本原因在于Redis命中率下降,大量请求直接落在数据库上,导致数据库直接崩溃。

  • 缓存雪崩:redis中大量key集体过期
  • 缓存击穿:redis中一个热点key过期(大量用户访问该热点key,但是热点key过期)
  • 缓存穿透:大量请求根本不存在的key

缓存雪崩       

缓存同一时间大面积的过期失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

Redis 性能管理/优化 双一致性问题 缓存雪崩/击穿/穿透

解决方案
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。(软件开发负责)
给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

缓存击穿

缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
和缓存雪崩不同的是,缓存击穿指并发查同一条数据缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案
实时调整,监控哪些数据是热门数据,实时的调整key的过期时长
使用锁机制,加互斥锁

缓存穿透

缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案文章来源地址https://www.toymoban.com/news/detail-512400.html

  • 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
  • 对空值进行缓存。从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
  • 采用布隆过滤器(牠说有的数据不一定有,但是确认过没有的数据肯定没有),将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。

到了这里,关于Redis 性能管理/优化 双一致性问题 缓存雪崩/击穿/穿透的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis如何保障缓存与数据库的数据一致性问题?

    目录 一.最经典的数据库加缓存的双写双删模式 二. 高并发场景下的缓存+数据库双写不一致问题分析与解决方案设计 三、上面高并发的场景下,该解决方案要注意的问题 1.1 Cache Aside Pattern概念以及读写逻辑 (1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取

    2023年04月21日
    浏览(35)
  • 深入理解高并发下的MySQL与Redis缓存一致性问题(增删改查数据缓存的一致性、Canal、分布式系统CAP定理、BASE理论、强、弱一致性、顺序、线性、因果、最终一致性)

    一些小型项目,或极少有并发的项目,这些策略在无并发情况下,不会有什么问题。 读数据策略:有缓存则读缓存,然后接口返回。没有缓存,查询出数据,载入缓存,然后接口返回。 写数据策略:数据发生了变动,先删除缓存,再更新数据,等下次读取的时候载入缓存,

    2024年03月20日
    浏览(39)
  • 【Redis】缓存一致性

    读缓存 双检加锁 策略 采用 双检加锁 策略 多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。 其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。 后面的线程进来发现已经有缓存了,

    2023年04月24日
    浏览(43)
  • Redis之缓存一致性

    按照缓存更新的方式大致分为: 内存淘汰、过期删除、主动更新。 利用 Redis 的内存淘汰策略,当内存不足时自动进行淘汰部分数据,下次查询时更新缓存,一致性差,无维护成本。 因为 Redis 是基于内存的,如果内存超过限定值( Redis 配置文件的 maxmemory 参数决定 Redis 最大内

    2024年02月07日
    浏览(37)
  • Redis 原理缓存过期、一致性hash、雪崩、穿透、并发、布隆、缓存更新策略、缓存数据库一致性

    redis的过期策略可以通过配置文件进行配置 redis会把设置了过期时间的key放在单独的字典中,定时遍历来删除到期的key。 1).每100ms从过期字典中 随机挑选20个,把其中过期的key删除; 2).如果过期的key占比超过1/4,重复步骤1 为了保证不会循环过度,导致卡顿,扫描时间上限

    2024年02月08日
    浏览(43)
  • 【Redis】之数说缓存一致性

    对于使用 Redis 作为缓存来说,如何保证数据库和缓存数据一致性是个麻烦的问题。对于缓存和数据库的操作,主要有以下两种方式: 先删缓存,再更新数据库; 先更新数据库,再删除缓存; 这两种方式都存在缓存一致性问题,下面我们就分析一下如何解决这两种方式的缓存

    2024年02月13日
    浏览(29)
  • Redis---缓存双写一致性

    目录 一、什么是缓存双写一致性呢?  1.1 双检加锁机制  二、数据库和缓存一致性的更新策略 2.1、先更新数据库,后更新缓存  2.2 、先更新缓存,后更新数据库  2.3、先删除缓存,在更新数据库 延时双删的策略:  2.4.先更新数据库,在删除缓存(常用) 2.5、实际中是不可

    2024年02月15日
    浏览(33)
  • Redis缓存双写一致性

    如果redis中有数据:需要和数据库中的值相同 如果redis中无数据:数据库中的值要是最新值,且准备回写redis 缓存按照操作来分,可细分为两种: 只读缓存和读写缓存 只读缓存很简单:就是Redis只做查询,有就是有,没有就是没有,不会再进一步访问MySQL,不再需要会写机制

    2023年04月17日
    浏览(30)
  • 【Redis】聊一下缓存双写一致性

    缓存虽然可以提高查询数据的的性能,但是在缓存和数据 进行更新的时候 其实会出现数据不一致现象,而这个不一致其实可能会给业务来带一定影响。无论是Redis 分布式缓存还是其他的缓存机制都面临这样的问题。 数据一致性 缓存中有数据,那么缓存的数据和数据库的数据

    2024年02月06日
    浏览(40)
  • Redis高级系列-缓存双写一致性

    Redis缓存双写一致性是指在更新数据库数据后,同时更新缓存数据以保持数据一致性的策略,总的来说,就是 写入redis 和 写入数据库 的数据要保持一致 2.1 Cache Aside Pattern(旁路缓存模式) 旁路缓存模式,字面意思理解:缓存是旁路,缓存相对与应用程序和数据库是旁路,应用

    2024年01月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包