redis特性
- 速度快
- 键值对的数据结构服务器
- 丰富的功能
- 简单稳定
- 持久化
- 主从复制
- 高可用和分布式
- 客户端语言多
Redis使用场景
1.配合关系型数据库做高速缓存
2.社区中的评论、点赞、恢复等等。(使用传统数据库的select语句很耗费性能)
3.网页的排行榜、计数器
4.webMagic爬虫框架,使用RedisSchedule作去重,支持分布式
Redis缓存雪崩
- 缓存雪崩,是指在某一个时间段,缓存集中过期失效。
产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。 - 解决思路:
- 大多数考虑用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,避免缓存失效时对数据库造成太大的压力,虽然能够在一定的程度上缓解了数据库的压力但是与此同时又降低了系统的吞吐量。
- 分析用户的行为,尽量让缓存失效的时间均匀分布。
- 如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏数据,需要好好解决。
Redis缓存穿透
第一次看到这个名字,会觉得是一个很高深的名词。但是和其他许多概念一样,它只是描述了一个很容易理解的现象:请求了不存在的数据。造成大量的请求没有命中缓存场景之一:数据库使用了id为正整数作为键,但是黑客使用负整数向服务器发起请求,这时所有的请求都没有在缓存中命中,从而导致大量请求数据库,如果超过了数据库的承载能力,会导致数据库服务器宏机。
- 解决缓存穿透的方案主要有两种:
当查询不存在时,也将结果保存在缓存中。但是这可能会存在一种问题:大量没有查询结果的请求保存在缓存中,这时我们就可以将这些请求的key设置得更短一些。
提前过滤掉不合法的请求,Redis实现了布隆过滤器,我们可以使用它来达到这个目的。布隆过滤器很好理解,可以参考布隆过滤器(Bloom Filter)的原理和实现。