Redis作为数据库的备胎,今天就让我们来讲讲

redis拿不到String类型数据数据 redis获取数据失败怎么办_redis 永不过期

要说Redis缓存一般是系统先判断Redis是否有缓存

两种情况如果有就直接返回数据。

如果没有则将数据库中数据查询后保存到Redis缓存中。

问题一、关于数据实时同步指的是数据库中数据发生改变后,Redis缓存中的数据如何处理?缓存一致性问题,这里提供四种解决方案,如果要强一致性的话根本就不应该用缓存!!!

方案一、实时同步是指

如图客户端2就是先删除缓存后,提交数据到数据库,再次查询Redis会进行新的缓存操作

redis拿不到String类型数据数据 redis获取数据失败怎么办_redis热点key解决方案_02

方案二、另一种方式是准时同步,是增量、被动

redis拿不到String类型数据数据 redis获取数据失败怎么办_redis热点key解决方案_03

方案三、任务调度更新,举例通过SpringTask定时任务框架每隔1小时更新Redis缓存数据

方案四、是通过binlog客户端更新缓存,将缓存服务作为mysql的一个从服务(slave)订阅binlog,方案四和方案三的区别是需要单独搭建一个binlog客户端,优点是比定时任务更实时,等于是通过binlog方式将Redis改造成数据库的从服务

问题二、关于常问的缓存穿透、缓存击穿、缓存雪崩

缓存穿透是查询一个一定不存在的缓存key,并且数据库中该数据也不存在,如果有人利用不存在的Key频繁查询我们的业务服务,这就是缓存穿透。

解决方案是如果用户查询数据库也不存在的Key,保存空对象到缓存层,设置较短的失效时间

防止缓存穿透也可以通过布隆过滤器保存所有缓存的key,在访问请求到来时过滤掉不存在的key,防止这些key进行数据库的查询

缓存击穿是缓存中key的失效后,导致没有数据但是数据库有数据,这时并发用户特别多,同时去数据库进行数据查询,造成数据库压力瞬间过大

解决方案是设置数据永不过期,另外一种办法是通过ReentranReadWriteLock(读写锁)达到互斥效果,保证只有一个请求到达数据库并更新缓存,其他线程等待并重试

缓存雪崩和击穿的区别是击穿是一条失效后并发请求有很多导致,雪崩是大面积都失效导致,从而像生活中的雪崩一样,大面积失效后,访问压力瞬间堆积到数据库

解决方案,将key的过期时间不要批量设置,在设置的时候进行一些随机数设置,并且将热点数据设置为用永不过期

问题三、Redis服务的使用场景

1.单台Redis在传统项目中也可以使用

2.如果考虑单台Redis不安全可以开启Redis的主从备份功能(redis.conf文件中配置即可),读写分离

3.如果主从备份后考虑主服务挂掉后,自动切换从服务升级为主服务,就需要哨兵策略,搭建sentient服务

4.如果并发过大可以考虑搭建Redis3.0以后的Rediscluster内置集群

5.如果内置集群还是无法满足需求可以搭建twemproxy有中心节点的Redis集群

问题四、你们在项目中是如何使用Redis的

    关于五种Redis的数据类型这里不再总结,网上有很多关于RedisTemplate的使用案例,及五种数据类型的应用场景介绍,这里作为高级玩家,除了基本的五种外,还可以提用于基数统计的HyperLogLog,还有BloomFilter

问题五、Jedis和RedisTemplate的区别

    Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是SpringDataRedis中对JedisApi的高度封装。

        SpringDataRedis相对于Jedis来说可以方便地更换Redis的Java客户端,比Jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用如:SpringCache

使用场景:数据缓存、会话缓存、时效性数据、访问频率、计数器

社交列表、热门列表与排行榜、最新动态、消息队列、分布式锁

问题六、Redis 有哪几种数据“淘汰”策略,如果Redis满了怎么办

Redis 内存数据集大小上升到一定大小的时候,就会进行数据淘汰策略。Redis有六种淘汰策略

1.volatile-lru

2.volatile-ttl

3.volatile-random

4.allkeys-lru

5.allkeys-random

6.【默认策略】no-enviction

问题七、关于Redis的热数据,如何提高缓存命中

        从架构师的角度,需要应用尽可能的通过缓存直接获取数据,并避免缓存失效。这也是比较考验架构师能力的,需要在业务需求,缓存粒度,缓存策略,技术选型等各个方面去通盘考虑并做权衡。尽可能的聚焦在高频访问且时效性要求不高的热点业务上(如字典数据、session、token),通过缓存预加载(预热)、增加存储容量、调整缓存粒度、更新缓存等手段来提高命中率。

        对于时效性很高(或缓存空间有限),内容跨度很大(或访问很随机),并且访问量不高的应用来说缓存命中率可能长期很低,可能预热后的缓存还没来得被访问就已经过期了

还有一定要配合Redis总结&手撕Redis协议(牛肉干)这篇总结,你终于可以在简历上写Redis精通了。。。