跳至主要內容

面试-Redis

TenSoFlow...大约 6 分钟面试面试-Redis

面试-Redis

介绍一下Redis

问:介绍一下Redis

答:Redis是一个基于Key-Value结构存储的非关系型数据库。数据类型有String、List、Set、Hash、SortedSte有序集合。其基于内存存储速度很快。使用场景有缓存、分布式锁、保存token、消息队列、延迟队列等

Redis和MySQL如何保证一致性

问:Redis和MySQL如何保证一致性

答:当程序需要读取某一个数据时,首先会先尝试去Redis里面加载,如果命中则直接返回,否则则去MySQL查询,查询到之后再把数据缓存到Redis里面。一份数据,同时保存在数据库和Redis里面,当数据发生变化的时候,需要同时更新Redis和MySQL,由于更新是有先后顺序的,并且它不像MySQL中的多表事务操作,可以满足ACID特性。所以就会出现数据一致性问题。不可能100%保证缓存和数据库一致,只能保证最终一致。解决方式有先更新数据库,再删除缓存。最后可以基于RabbitMQ的可靠性消息通信来实现最终一致性。也可以利用canal中间件,监听mysql日志,数据有变更则去更新Redis。

谈谈缓存雪崩

问:谈谈缓存雪崩

答:缓存雪崩:就是存储在缓存里面的大量数据,在同一个时刻全部过期或者Redis宕机,原本应该走缓存的大量流量全部请求到了数据库导致服务器崩溃。可以通过给过期时间加随机化偏移或者做集群来解决。

谈谈缓存穿透

问:谈谈缓存穿透

答:表示是短时间内有大量的不存在的key请求到应用里面,而这些不存在的key在缓存里面又找不到,从而全部穿透到了数据库,造成数据库压力。可以把存在的key放到布隆过滤器中,请求来时如果在布隆过滤器中查不到直接返回不走缓存也不走数据库。另外也可做接口限流、设置黑名单的方式。

谈谈缓存击穿

问:谈谈缓存击穿

答:给某一个key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量并发请求过来,造成数据库压力。第一种解决方法是增加分布式锁,第一个请求过来查询缓存没有命中则获取锁并重建数据,在重建数据过程中其它请求没有获取锁只能等待重试一直到重建数据成功。第二种解决方案是对于这种热点数据不设置过期时间。

介绍一下布隆过滤器

问:介绍一下布隆过滤器

答:它的底层是先去初始化一个比较大的数组,存放二进制的0和1,初始时都是0,当一个key来了之后经过三次hash计算,对数组长度求模找到数组下标把数组中原来的0改为1。这样的话三个数组位置就能标明一个key的存在,查找过程也是一样的。当然也有缺点,布隆过滤器也有可能会产生一定的误判,可以设置这个误判率,一般不会超过5%。这个误判是必然存在的,想要减少误判可以增加数组长度,增加数组长度又会增大内存消耗。所以具体数组长度为多少需要根据实际考虑。5%以内的误判率一般项目也能接受,不至于高并发下压到数据库。

Redis实现数据持久化

问:Redis实现数据持久化

答:把Redis中的所有数据都记录到磁盘中,当Redis实例故障重启后,从磁盘读取快照文件,从而恢复数据。
也可以在Redis配置文件中开启AOF,开启之后每次写操作都会把命令记录到日志文件中。当Redis实例故障重启后,Redis会重新执行AOF文件中的所有命令,从而恢复数据。

Redis数据过期策略

问:Redis过期策略

答:Redis设置的数据过了有效时间,将数据从内存中删除的规则就被称之为数据的过期策略。
惰性删除:设置改key过期时间后,不去管,当需要该key时,检查其是否过期,如果过期则删掉。
定期删除:每隔一段时间,对key进行检查,删除里面过期的key(选取一定数量的key随机检查,并删除其中过期的key)
Redis的过期删除策略:惰性删除 + 定期删除两种策略配合使用

Redis数据淘汰策略

问:Redis数据淘汰策略

答:如果在Redis里面缓存过多数据,内存有限,则就需要淘汰旧数据来保存新数据。
不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略
对设置了过期时间的key,比较key的剩余过期时间,越小的越先被淘汰
对全体key,随机进行淘汰
对设置了过期时间的key,随机进行淘汰
对全体key,基于LRU算法(最近最少使用)进行淘汰
对设置了过期时间的key,基于LRU算法(最近最少使用)进行淘汰
对全体key,基于LFU算法(最少频率使用)进行淘汰
对设置了过期时间的key,基于LFU算法(最少频率使用)进行淘汰

Redis分布式锁

问:Redis分布式锁

答:Redis实现分布式锁主要利用setnx(如果不存在则set)命令。也可直接使用Redis提供的Redisson实现分布式锁。

-- 添加锁 nx是互斥 ex是设置超时时间
set lock value nx ex 10

-- 释放锁 删除即可
del key

Redis为什么快

问:Redis为什么快

答:Redis是纯内存操作,执行速度本来就快。另外Redis采用的是单线程避免了线程切换开销。其数据结构是基于Key-Value形式的,获取数据时间复杂度是O(1)。

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8