关于缓存的一些思考
redis和memcached
区别:memcached只支持简单的key-value格式,redis支持更多的格式,如hash,
什么时候要用到缓存
列表页、详情页等经常请求而且变化频率不高的场景
缓存基本用法
- 从缓存中取数据
- 缓存命中,直接返回
- 缓存miss,从db中取数据,将数据存入缓存,返回
缓存穿透
指的是访问缓存中的某个不存在的key,没有命中,然后直接请求db,同时因为返回的结果为空,不会存入缓存中,故而下次还是无法命中的场景
解决方案:将不存在的key也存入缓存中,value设置为null
持久化
这个好像是运维做的,生产环境没有试过
不过在设计技术方案的时候,都要考虑redis挂掉的风险
缓存并发
redis有原子性操作,可以防止并发的时候读写出错
缓存过期时间
存入缓存时可以设置缓存的过期时间
有一个要注意的地方在于如果有一批过期时间相同的key同时过期并请求db时,会使db的压力骤增,如果扛不住,就会导致缓存雪崩
处理方法:设置过期时间时加上一个随机的小数字
缓存是否过期
是否给缓存设置过期时间,也是个值得思考的问题?
一般有两种思路:
一种是设置过期时间,到期后重新生成新的db
另一种是不设置过期时间,手动更新缓存
一般是采用第一种,因为redis存储的空间是有限的
此外,一些需要持久的缓存是不会设置过期时间的,如最新的订单号等
redis缓存的其他应用场景
队列
使用redis
可以构建简单的一对一的队列,简单的说,就是使用lpush
入列,rpop
出列(也可以右进左出)
数据库
是的,你没有看错,redis
除了当缓存使用,作为NoSql
的成员之一,它还可以当独立的数据库使用
代理
开源的tw框架
参考
本文作者 : 小凡
原文链接 : https://16bh.github.io/2017/04/12/my-thinking-about-redis/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!