Redis缓存-全面解析

Redis是什么

redis是一个开源的单核内存存储(key-value)数据库。
使用场景:
1、缓存数据
对于经常使用的变更不多的数据
2、消息队列
相当于消息订阅系统,比如ActiveMQ、RocketMQ。如果对数据有较高一致性要求时,还是建议使用MQ)
3、计数器
对于统计点击率、点赞率、redis原子性、都可以使用redis,避免并发发生
4、电商网站首页信息
官网的首页数据
5、热点数据
对于新闻网站的实时热点、热搜的数据,

redis做缓存为什么执行速度很快?
1、redis 是内存操作
2、redis的单线程
3、redis的数据结构简单、对数据的操作也简单
4、redis使用的底层模型不同,他们之间底层实现方式以及客户端之间的通信的协议不一样,redis直接自己构建VM机制,节约了系统调用函数的请求时间
5、使用多路I/O复用模型,非阻塞I/O
redis数据存储类型
String、hash、list、set(自动排重)、zset

Redis缓存的数据一致性

redis和数据库的数据不一致,
解决方案:
1、先写数据库,再写缓存(小型项目)
2、并发问题产生脏数据:导致数据不一致
解决脏数据不一性:
1、并发率小的数据、缓存数据更新使用过期时间,每隔一段时间更新一下缓存
2、并发高的基础数据。使用cannal订阅binlog的方式
3、通过加锁保证并发读写,写的时候按照顺序排队
Redis的过期和内存淘汰
redis的过期删除采用的是定期删除、默认每隔100ms检测一次,遇到过期的key就进行删除、这个检测是随机的检测,随机删除可能会出现删除不完的情况,所以redis再读写的时候采用了惰性删除策略(再请求key的时候去检测是否过期,过期就删除),来解决

redis高并发条件下经常会出现:缓存击穿,缓存穿透,缓存雪崩

缓存击穿

缓存击穿实质上就是缓存中没有数据,不断的请求db,
解决方案:
1、互斥锁
允许一个线程重建缓存,其他线程处于等待重建缓存的线程;当第一个数据库请求发起以后,将缓存请求上锁,其他查询请求查询到该位置的时候处于堵塞等待;等待一个请求完成数据库查询,并将数据更新值存入缓存以后释放锁;存在的问题:请求会处于阻塞等待,系统的吞吐量下降;
2、永不过期,
由于没有设置过期时间就不会出现数据丢失的情况,但是会存在数据不一致的情况。

缓存穿透

缓存穿透实质就是缓存中不存在数据,数据库也不存在,但请求会一直访问db
缓存穿透的危害:海量的请求查询压根不存在,这时候海量的数据全都落在数据上对数据库的压力剧增,可能会导致系统崩溃
缓存穿透的产生的原因:
1:黑客攻击
2:代码逻辑错误
解决方案:
1.将数据库查询的结果为空的key存储到缓存中,后续又出现的查询请求直接返回null;
2.避免缓存穿透的方式即为使用BloomFilter

缓存雪崩

缓存雪崩是因为一些原因发生宕机,原来可以抵挡缓存的海量数据全都请求数据库,数据库扛不住压力,导致崩溃
解决方案:
1、缓存集群,保证缓存高可用(需要了解一些哨兵sentinel)
2、使用hystrix(熔断、降级、限流)

下一期讲述memcached