博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缓存的几个概念
阅读量:6899 次
发布时间:2019-06-27

本文共 1028 字,大约阅读时间需要 3 分钟。

  hot3.png

缓存穿透

缓存穿透是说收到了一个请求,但是该请求缓存里没有,只能去数据库里查询,然后放进缓存。

这里面有两个风险,一个是同时有好多请求访问同一个数据,然后业务系统把这些请求全发到了数据库;第二个是有人恶意构造一个逻辑上不存在的数据,然后大量发送这个请求,这样每次请求都会被发送到数据库,可能导致数据挂掉。

怎么应对这种情况呢?对于恶意访问,一个思路是事先做校验,对恶意数据直接过滤掉,不要发到数据库层;第二个思路是缓存空结果,就是对查询不存在的数据仍然记录一条该数据不存在在缓存里,这样能有效的减少查询数据库的次数。

那么非恶意访问呢?这个要结合缓存击穿来讲。

缓存击穿

上面提到的某个数据没有,然后好多请求都被发到数据库其实可以归为缓存击穿的范畴:对于热点数据,当数据失效的一瞬间,所有请求都被下放到数据库去请求更新缓存,数据库被压垮。

怎么防范这种问题呢?一个思路是全局锁,就是所有访问某个数据的请求都共享一个锁,获得锁的那个才有资格去访问数据库,其他线程必须等待。但是现在的业务都是分布式的,本地锁没法控制其他服务器也等待,所以要用到全局锁,比如用redis的setnx实现全局锁。

另一个思路是对即将过期的数据主动刷新,做法可以有很多,比如起一个线程轮询数据,比如把所有数据划分为不同的缓存区间,定期分区间刷新数据等等。这第二个思路又和我们接下来要讲的缓存雪崩有关系。

缓存雪崩

缓存雪崩是指比如我们给所有的数据设置了同样的过期时间,然后在某一个历史性时刻,整个缓存的数据全部过期了,然后瞬间所有的请求都被打到了数据库,数据库就崩了。

解决思路要么是分治,划分更小的缓存区间,按区间过期;要么是给每个key的过期时间加个随机值,避免同时过期,达到错峰刷新缓存的目的。

缓存刷新(另一个程序专门刷新缓存)

说到刷新缓存,其实也有坑的。比如我之前的一份工作里,有一次大活动,正是如火如荼的时候,所有的广告位突然都变空白了。后来追查原因,所有的广告素材都在缓存里,然后起了个程序,专门负责刷新缓存,每次把当前的素材全量刷新。

坏就坏在这个全量上。因为大活动的时候流量极大,广告更新压力也很大,把负责提供更新素材的程序压崩了。刷新缓存的程序在请求时,收到了一个返回结果Null。接下来就喜闻乐见了,刷新程序根据这个null,清空了整个缓存,所有广告素材都失效了。

转载于:https://my.oschina.net/suyain/blog/1845750

你可能感兴趣的文章
我的友情链接
查看>>
那些不加班的开发团队,都看透了持续集成的四大好处
查看>>
iOS开发之CALayer
查看>>
无人值守安装Linux系统
查看>>
启动VMware虚拟机 内部错误
查看>>
解决CentOS7控制台中文显示乱码
查看>>
我的友情链接
查看>>
关于应用交付设备的使用及云计算结构之我见
查看>>
nodejs实现cas客户端
查看>>
简略CPU发展史
查看>>
Rad Studio 10.1 UP1 移动开发 关于模拟器
查看>>
区块链开发教程分享【201904】
查看>>
TextView实现打印机效果
查看>>
我的友情链接
查看>>
将数据快速读入R—readr和readxl包
查看>>
.user.ini文件权限操作
查看>>
菜鸟学Linux 第097篇笔记 nginx配置文件
查看>>
新浪微博收网捕鱼 免费午餐也需要成本
查看>>
Kickstart无人值守批量部署CentOS6
查看>>
java开发webservice的几种方式
查看>>