Redis缓存击穿
发表于|更新于|Redis
|总字数:272|阅读时长:1分钟|浏览量:
什么是缓存击穿?
其实跟缓存雪崩有点类似,缓存雪崩是大规模的key失效,而缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。这种现象就叫做缓存击穿。
分析:
关键在于某个热点的key失效了,导致大并发集中打在数据库上。所以要从两个方面解决,第一是否可以考虑热点key不设置过期时间,第二是否可以考虑降低打在数据库上的请求数量。
解决方案:
1、上面说过了,如果业务允许的话,对于热点的key可以设置永不过期的key。
2、使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差。
文章作者: Michael
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Michael's Blog!
相关推荐

2019-03-20
穿透&雪崩&击穿
雪崩 穿透 击穿 概念 当某一个时刻出现大规模的缓存失效的情况,那么就会导致大量的请求直接打在数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。这时候如果运维马上又重启数据库,马上又会有新的流量把数据库打死。 访问redis中一个不存在的key的时候,会直接穿过缓存,去数据库中进行查询。 场景 就是每秒有5000个请求过来时候,redis缓存库崩了,然后这些请求瞬间落在了mysql数据库上,直接导致数据库死机. 如果是黑客,进行恶意攻击的时候,每次都请求超过2000个/秒的时候,这个时候mysql基本上就挂了. 解决方案 事前:提高缓存库的高可用, 使用主从结构加哨兵 cluster集群事中:使用ehcache+hystrix限流组件(当请求量非常巨大的时候,就调用自己开发好的一个降级饿组件,返回一些默认值,如友情提示,或者空白值)事后:做持久化,尽快恢复缓存集群,一旦恢复,自动从磁盘上读取数据,恢复内存中的数据. 每次从数据库中查询到一个不存在的key的时候,就写一个空值到缓存库中,有恶意攻击的时候,直接从缓存...

2017-03-20
Redis 队列消费
数据结构 list - 先进先出 - 左进右出 归纳 实现方式 操作 效果 单list 左进右出 lpush rpop 最简单,实际应用比较局限 多list brpop list1 list2 0 推荐用法,实际应用最为合适 特定单list list1 - 高优list2 - 普通 实现复杂优先级,但实现比较复杂,不利于维护 优先级实现方式 通常使用一个list来实现队列操作, 这样有一个小限制,所以的任务统一都是先进先出, 如果想优先处理某个任务就不太好处理了,这就需要让队列有优先级的概念,我们就可以优先处理高级别的任务,实现方式有以下几种方式: 单一列表实现: 队列正常的操作是 左进右出(lpush,rpop)为了先处理高优先级任务,在遇到高级别任务时,可以直接插队,直接放入队列头部(rpush),这样,从队列头部(右侧)获取任务时,取到的就是高优先级的任务(rpop) 使用两个队列 一个普通队列,一个高级队列,针对任务的级别放入不同的队列,获取任务时也很简单,redis的BRPOP命令可以按顺序从多个队列中取值,BRPOP会按照给出...

2021-03-20
Redis缓存
数据结构:memcache仅支持简单的key-value形式,Redis支持的数据更多(string字符串,set集合,list列表,hash散列,zset有序集合); 多线程:memcache支持多线程,Redis支持单线程 持久化:Redis支持持久化,memcache不支持持久化 分布式:Redis做主从结构,memcache服务器需要通过hash一致化来支撑主从结构 实际运用中可以redis,memcache结合,memcache可作为session存储的方式,session都是KV类型键值对。 Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcache相比一个最大的区别。 Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcache只是简单的K/V缓存。 他们的扩展都需要做集群;实现方式:master-slave、Hash。 在100k以上的数据中,Memcache性能要高于Redis。 如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结...

2021-03-20
Redis高并发
背景 Redis是不会存在并发问题的,因为他是单进程的,再多的命令都是一个接一个地执行的。 场景 GET & SET 利用Jedis等客户端对Redis进行并发访问 远程访问Redis的时候,因为网络等原因造成高并发访问、延迟返回 我们使用的时候,可能会出现并发问题,比如获得和设定这一对。 Redis的为什么 有高并发问题?Redis的的出身决定。 Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。 由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系, 但是利用Jedis等客户端对Redis进行并发访问时会出现问题。 原因 发生【连接超时】、【数据转换错误】、【阻塞】、【客户端关闭连接】等问题, 这些问题均是由于【客户端连接混乱】造成。 单线程的天性决定,高并发对同一个键的操作会排队处理, 如果并发量很大,可能造成后来的请求超时。 在远程访问Redis的时候,因为网络等原因造成高并发访问延迟返回的问题。 解决办法 客户端角度,将连接进行池化,同时对读写Redis操作采用内部锁 sy...

2022-03-20
Redis全部
基础1.说说什么是Redis? Redis图标 Redis是一种基于键值对(key-value)的NoSQL数据库。 比一般键值对数据库强大的地方,Redis中的value支持string(字符串)、hash(哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、 HyperLogLog、GEO(地理信息定位)等多种数据结构,因此 Redis可以满足很多的应用场景。 而且因为Redis会将所有数据都存放在内存中,所以它的读写性能非常出色。 不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。 除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。 总之,Redis是一款强大的性能利器。 2.Redis可以用来干什么? Redis 缓存 这是Redis应用最广泛地方,基本所有的Web应用都会使用Redis作为缓存,来降低数据源压力,提高响应速度。 计数器 Redis天然支持计数功能,而且计数性能非常好,可以用来记录浏览量、点...

2019-03-20
Redis缓存穿透
我们使用Redis大部分情况都是通过Key查询对应的值,假如发送的请求传进来的key是不存在Redis中的,那么就查不到缓存,查不到缓存就会去数据库查询。假如有大量这样的请求,这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。 分析: 关键在于在Redis查不到key值,这和缓存击穿有根本的区别,区别在于缓存穿透的情况是传进来的key在Redis中是不存在的。假如有黑客传进大量的不存在的key,那么大量的请求打在数据库上是很致命的问题,所以在日常开发中要对参数做好校验,一些非法的参数,不可能存在的key就直接返回错误提示,要对调用方保持这种“不信任”的心态。 解决方案: 1、把无效的Key存进Redis中。如果Redis查不到数据,数据库也查不到,我们把这个Key值保存进Redis,设置value=”null”,当下次再通过这个Key查询时就不需要再查询数据库。这种处理方式肯定是有问题的,假如传进来的这个不存在的Key值每次都是随机的,那存进Redis也没有意义。 2、使用布隆过滤器。布隆过滤器的作用是某个 key 不存在,那么就一定不存在,它说某...
评论
公告
欢迎来到 Michael 的博客 · 记录代码、思考与生活
