关于Redis缓存的Q&A
Redis缓存一般是系统先判断Redis是否有缓存。如果有就直接返回数据。如果没有则将数据库中数据查询后保存到Redis缓存中。
问题一、数据实时同步指的是数据库中数据发生改变后,Redis缓存中的数据如何处理?缓存一致性问题,提供四种解决方案,如果要强一致性的话根本就不应该用缓存!
方案一、实时同步,先删除缓存后,提交数据到数据库,再次查询Redis会进行新的缓存操作;
方案二、另一种方式是准时同步,是增量、被动;
方案三、任务调度更新,举例通过SpringTask定时任务框架每隔1小时更新Redis缓存数据;
方案四、是通过binlog客户端更新缓存,将缓存服务作为mysql的一个从服务(slave)订阅binlog,方案四和方案三的区别是需要单独搭建一个binlog客户端,优点是比定时任务更实时,等于是通过binlog方式将Redis改造成数据库的从服务。
问题二、缓存穿透、缓存击穿、缓存雪崩
缓存穿透是查询一个一定不存在的缓存key,并且数据库中该数据也不存在,如果有人利用不存在的Key频繁查询业务服务,这就是缓存穿透。
解决方案是如果用户查询数据库也不存在的Key,保存空对象到缓存层,设置较短的失效时间
防止缓存穿透也可以通过布隆过滤器保存所有缓存的key,在访问请求到来时过滤掉不存在的key,防止这些key进行数据库的查询
缓存击穿是缓存中key的失效后,导致没有数据但是数据库有数据,这时并发用户特别多,同时去数据库进行数据查询,造成数据库压力瞬间过大
解决方案是设置数据永不过期,另外一种办法是通过ReentranReadWriteLock(读写锁)达到互斥效果,保证只有一个请求到达数据库并更新缓存,其他线程等待并重试
缓存雪崩和击穿的区别是击穿是一条失效后并发请求有很多导致,雪崩是大面积都失效导致,从而像生活中的雪崩一样,大面积失效后,访问压力瞬间堆积到数据库
解决方案,将key的过期时间不要批量设置,在设置的时候进行一些随机数设置,并且将热点数据设置为用永不过期
问题三、Jedis和RedisTemplate的区别
Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是SpringDataRedis中对JedisApi的高度封装。SpringDataRedis相对于Jedis来说可以方便地更换Redis的Java客户端,比Jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用。
使用场景:数据缓存、会话缓存、时效性数据、访问频率、计数器、社交列表、热门列表与排行榜、最新动态、消息队列、分布式锁。
上一篇: 如果有一个特别大的访问量,到数据库上,怎么做优化?
下一篇: 学编程会像打游戏一样上瘾吗?