首页 > 其他分享 >如何使用缓存 | 热点Key处理

如何使用缓存 | 热点Key处理

时间:2023-08-24 20:44:22浏览次数:31  
标签:降级 缓存 热点 线程 Key 数据

热点Key

当热点key缓存失效后,会有大量线程进行缓存重建。

有的热点key不能再短时间内完成,可能需要复杂的计算,多次IO等。

在缓存失效的瞬间,有大量线程来重建缓存,也就是会直接访问到后端,这会造成后端负载加大,严重的甚至可能导致应用崩溃,也就是 - 缓存击穿。

解决方案1. 分布式锁
加载数据的时候可以利用分布式锁锁住这个数据的Key,在Redis中直接使用setNX操作即可,对于获取到这个锁的线程,查询数据库更新缓存,其他线程采取重试策略,这样数据库不会同时受到很多线程访问同一条数据。

解决方案2. 异步刷新 (永不过期)
由于缓存击穿是热点数据才会出现的问题,可以对这部分热点数据采取到期自动刷新的策略,而不是到期自动淘汰。淘汰其实也是为了数据的时效性,所以采用自动刷新也可以。

唯一不足的就是重构缓存期间,会出现数据不一致的情况,这取决于应用方是否容忍这种不一致。

回到我们使用缓存的目的
第一、加快用户访问速度,提高用户体验
第二、降低后端负载,减少潜在负载
第三、保证数据“尽可能”及时更新

如何发现热点key

Redis监控工具 - Redis monitor 和 redis-stat

慢查询日志 - 使用redis-cli的slowlog命令查看慢查询日志

解决热点Key

1、数据分片
通过将热点数据分散存储在多个Redis节点上,避免单个节点负载过高,是解决热点Key问题最常用的策略。

2、读写分离
读写分离可以将读操作与写操作分开处理,降低单个节点的负载。在主从复制模式下,可以将读操作分发到从节点上,从而分担主节点的压力。

3、缓存预热
缓存预热是指在系统启动或重启后,主动将热点数据加载到缓存中。这样,当用户访问这些热点数据时,可以直接从缓存中获取,避免对后端数据库造成压力。缓存预热可以通过定时任务或应用程序启动时加载热点数据实现。

4、限流
在应用层实现限流,有效减轻热点key对redis的压力

5、熔断降级
当redis出现访问问题时,根据具体的业务场景,将请求熔断,进行快速失败,避免导致缓存彻底down机。

当业务场景具备降级的条件时,我们可以启用降级策略。
比如返回备用数据。

降级分为以下几种:
1、被动降级:服务不可用,返回备用数据或返回提示信息。
2、主动降级:人为把服务设置为不可用,关闭次要的一些功能,保证核心服务可用。
3、自动降级:根据预定的规则,实现自动降级,自动恢复。

标签:降级,缓存,热点,线程,Key,数据
From: https://www.cnblogs.com/tonyq/p/17655114.html

相关文章

  • Vue组件缓存之keep-alive正确使用姿势
    先来看一个项目中的需求作为苦逼的前端开发者,我们无时无刻都要面对产品经理提的各种需求,比如下图这个场景场景:从首页的点击导航进入列表页,列表页点击列表进入该数据详情页从详情页返回,希望列表页缓存,不重新渲染数据,这样会提高用户体验。分析一下这样需求,如果是小程序......
  • vue3 使用 setup 语法糖时,keep-alive 缓存使用 include / exclude 获取组件名
    <template><router-viewv-slot="{Component,route}"><keep-alive:include="['ComponentName']"><component:is="Component":key="route.name"/></keep-alive>......
  • Redis 缓存满了怎么办?
    引言Redis缓存使用内存来保存数据,随着需要缓存的数据量越来越大,有限的缓存空间不可避免地会被写满。此时,应该怎么办?本篇文章接下来就来聊聊缓存满了之后的数据淘汰机制。 值得注意的是,在Redis中 过期策略和内存淘汰策略是两个完全不同的概念。Redis过期策略指的是Red......
  • idea运行java项目提示异常: java.security.InvalidKeyException: Illegal key size
    idea运行java项目提示异常:java.security.InvalidKeyException:Illegalkeysizenews/2023/8/1715:55:43idea运行java项目提示异常:java.lang.IllegalArgumentException:java.security.InvalidKeyException:Illegalkeysize参考:java.security.InvalidKeyException:I......
  • Vue3 中 keepAlive 如何搭配 VueRouter 来更自由的控制页面的状态缓存?
    在vue中,默认情况下,一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时,会创建一个只带有初始状态的新实例。但是vue提供了keep-alive组件,它可以将一个动态组件包装起来从而实现组件切换时候保留其状态。本篇文章要介绍的......
  • 定义一个函数,传入一个字典和一个元组,将字典的值(key不变)和元组的值交换,返回交换后的
    知识点:zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。li=[3,4,5]t=(7,8,9)print(list(zip(li,t)))print(dict(zip(li,t)))运行截图:例1:deff(a,b):print(a)print(b)#先获取对应的元素b......
  • windows 桌面GUI自动化- 10.pywinauto 键盘快捷键操作send_keys()
    前言pywinauto快捷键操作,使用send_keys()方法按键对应的符号按键名称 对应符号按键名称对应符号SHIFT+CTRL^ALT%SPACEBACKSPACE{BACKSPACE}{BS}or{BKSP}BREAKCAPSLOCKDELorDELETE{DELETE}or{DEL}DOWNARROWENDENTE......
  • windows查看/删除DNS缓存
    一、查看DNS缓存打开CMD,输入ipconfig/displaydns二、删除DNS缓存打开CMD,输入ipconfig/flushdns......
  • WebDriver.__init__() got an unexpected keyword argument 'desired_capabilities'
    我的selenium的版本是4.11.2selenium4.10中已经不支持desired_capabilities参数如果要传这个参数的话建议用selenium==4.9.1参考《Appium新版本引发的一个问题》......
  • 记录一个通过keep-alive缓存组件不生效的问题
    项目中通过菜单管理配置页面进行缓存,layout组件中通过keep-alive的include属性进行命中官方描述:匹配首先检查组件自身的name选项,如果name选项不可用,则匹配它的局部注册名称(父组件components选项的键值)。匿名组件不能被匹配。通过检查发现配置菜单时用的组件名称(动态菜......