首页 > 数据库 >redis

redis

时间:2024-02-22 18:12:59浏览次数:28  
标签:缓存 redis 数据库 Redis 雪崩 key 数据

缓存击穿”通俗的解释就是某个热点数据,某一时刻在缓存中失效,进而大量的请求打到数据库上,就像被击穿了一样。说白了就是某个数据,数据库中有,缓存中没有,一瞬间大量该key的请求打到数据库上,导致数据库被打垮。最常见的场景就是秒杀商品。

什么是缓存穿透呢?

举个简单栗子,作者开发了一个非常火爆的网站,动了某些人的蛋糕,然后遭到疯狂的攻击,攻击手段就是采用缓存穿透,大家都知道数据库的主键是从0开始递增的,也就不存在负数的情况,那么黑客就利用这一点,不断利用ID小于0的参数向服务器发送请求,系统首先会去查Redis缓存,缓存中没有查到数据,就会去查数据库,数据库也不存在ID小于0的数据,所以Redis中也永远也不会有该数据,就会造成请求不断打到数据库上,中间Redis层并不能拦截这样的数据,Redis直接被这种数据穿透,直击数据库。

缓存穿透和击穿的区别就是:

  • 缓存击穿:数据库里有数据
  • 缓存穿透:数据库里没有数据

缓存击穿是指1个热key失效,而缓存雪崩,顾名思义,指的就是大面积的key在同一瞬间全部失效,导致大量的请求打到数据库上,就像雪崩一样,从而造成数据库响应不及时挂掉。这种属于自然雪崩,主要是引起周期性的压力波峰,还有另一种非自然雪崩,就是缓存服务某个节点或多个节点甚至全部节点都突然宕机,导致所有的请求都打到数据库上,进而导致数据库宕机,这种也是不可预知的雪崩。

所以,对于缓存雪崩来说,一般少量的缓存失效,所带来的数据库并发压力是不会太大的,而是大量的缓存同时失效,导致所有key的并发加起来打到数据库上,才会影响到我们的数据库。

其实,在真实场景中,缓存雪崩是一个更容易发生的问题,因为它不像缓存击穿那么极端,1个key就有成千上万的并发量,直接把数据库击垮,而是一个key可能只有几十几百的并发量,然后大量的key同时过期,导致很多key的并发叠加起来,积累到成千上万,再把数据库击垮。

因为缓存雪崩是大面积的key同时过期失效,才导致大量的并发直接打到数据库上,那么我们很正常的思路就是让并发分散开来

第一种常见的做法是分散缓存数据的过期时间,防止同一时间大量数据过期现象发生

既然这种做法不合理,那么还有其他的方法吗?这时,就有人提出让缓存提前更新的观点,也就是预加载缓存,提前主动加载热门数据到缓存中,在数据过期之前进行刷新,减少雪崩的风险。

但是提前更新可能会导致数据不准确,例如在23:58开始更新,然后在23:59的时候又有大量的数据被修改,用户在24:00查看数据时发现数据仍然没有变化,他们就会认为24:00系统更新数据的说法不靠谱。

因此Redis缓存还是必须要同一时间点失效,不能把时间分散开来。既然Redis的过期时间不能分散,不能在Redis上做文章,那么我们不妨改变一下思维方式,是谁来访问Redis,是service服务层,我们可以把service服务层的查询请求分散开来,利用客户端设置一个短暂的随机延迟时间,使得查询请求分散开,少量的请求先查询,就会读数据库,存入Redis缓存,其他请求由于随机时间,稍微慢一点再去Redis读数据。

  • Redis一般都是集群部署,可以把这些热点的key放到不同的节点上,让这些热点的缓存平均分布在不同的Redis节点上。
  • 使用多级缓存架构,引入多级缓存,如本地缓存、分布式缓存和集中式缓存,这样即使某个层级的缓存出现问题,仍然可以从其他层级获取数据。
  • 限流和熔断,对于缓存失效是的瞬间高并发请求,可以实时限流和熔断机制,控制系统的负载均衡,防止系统崩溃。
  • 数据库容灾和优化,确保数据库具备高可用性,采取备份策略的故障转移方案,同时对数据库进行性能优化。
  • 监控和报警,建立监控系统,实时监测缓存的状态和命中率,并设置合适的报警机制,及时发现并处理潜在的缓存问题。

标签:缓存,redis,数据库,Redis,雪崩,key,数据
From: https://www.cnblogs.com/xiaozhilong/p/18027894

相关文章

  • 【性能测试】【redis】jmeter实现对redis查询写入压测
    一、jmeter安装RedisDataSet插件首先,我们下载jmeter-plugins-manager-1.6.jar文件,放到jmeter的lib的ext文件夹中,然后重启jmeter。然后,在‘选项’菜单下,点击‘pluginmanager’,打开插件管理弹窗,选择‘AvailablePlugins’,在搜索框中,输入redis然后,选中‘RedisDataSet’,点击......
  • 【性能测试】Redis监控利器---Redis State
    一、本地运行监控神器(以Windows为例)1、安装Jruby,官网地址:http://jruby.org/2、官网下载最新的RedisStatejar包,官网下载地址:https://github.com/junegunn/redis-stat/releases3、启动RedisState进行监控(1)启动命令redis-stat[HOST[:PORT][/PASS]...][INTERVAL[COUN......
  • kettle从入门到精通 第四十五课 ETL之 kettle redis
    1、kettle9.3/9.4spoon客户端中默认是没有redis步骤的,首先想到在kettle的插件市场进行下载redis步骤。 2、可能因为网络原因,直接下载失败了。索性放弃redis原有插件步骤,改为自己通过java代码进行实现,(有java基础的可以通过java代码步骤结合自定义jar包实现一切功能)。 3、将j......
  • Redis实现分布式锁
    方案1:spring-integration-redis组件使用spring-integration-redis组件privatestaticvoidtryLock(){LettuceConnectionFactoryconnectionFactory=createConnectionFactory();RedisLockRegistrylockRegistry=newRedisLockRegistry(connectionFactory,"te......
  • redis
    安装环境与工具yum-yinstallwgetvimtclgccmake下载rediswget wgethttps://download.redis.io/releases/redis-7.0.12.tar.gz 上传 redis-7.0.12.tar.gz 到三台服务器 /data/redis-7.0.12.tar.gz 118.89.112.205 主服务器124.220.13.28  从服务器 ......
  • redis自学(2)IntSet
    IntSetIntSet是redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。  可能会有疑惑,int8_t的数组contents只有1个字节,怎么可能存的下数组,其实这里的contents存储的只是指向真正数组的指针。IntSet的取值范围大小,实际上是由encoding属性决定的......
  • redis
    RedisRedis是基于OpenSourceBSD协议,使用C语言编写的一种Key-Value(键值对)内存数据库 安装 工具 启动服务端redis-server/root/myredisconf/redis.conf-使用指定配置文件启动启动客户端连接redis-cli-aroot-p6379用密码和端口登录授权10大数据类型......
  • Redis
    RedisRedis是基于OpenSourceBSD协议,使用C语言编写的一种Key-Value(键值对)内存数据库安装工具启动服务端redis-server/root/myredisconf/redis.conf-使用指定配置文件启动启动客户端连接redis-cli-aroot-p6379用密码和端口登录授权10大数据类型......
  • redis
    RedisRedis是基于OpenSourceBSD协议,使用C语言编写的一种Key-Value(键值对)内存数据库安装工具启动服务端redis-server/root/myredisconf/redis.conf-使用指定配置文件启动启动客户端连接redis-cli-aroot-p6379用密码和端口登录授权10大数据类型1.String......
  • 05 内存快照:宕机,Redis如何快速恢复?
    内存快照:指内存中的数据在某一个时刻的状态以文件的形式写到磁盘上,类似于照片。快照文件就称为RDB文件,其中,RDB就是RedisDataBase的缩写。两个关键问题:对哪些数据做快照?关系到快照的执行效率问题;做快照时,数据还能被增删改吗?关系到Redis是否被阻塞,能否同时正常处理请求......