Java面试--Redis

Redis

1.redis是什么?

是一种高性能的非关系型数据库,是一个键值对的内存数据库。

2.redis存储结构有哪些?

  1. string(缓存,验证码)
  2. Hash(缓存)
  3. List(消息队列)
  4. Set(无序,不可重复,共同好友)
  5. Zset(类似TreeSet不可重复,按权重排序,排行榜)

3.为什么redis那么快?

①内存操作,速度快,读取 11w/s ,写入8w/s
②合理的数据结构
③单线程,避免线程切换。
④采用i/o多路复用,单线程处理多个连接请求不在i/o上浪费过多时间

4.单线程模式?

redis是单线程模式,避免cpu不必要的上下文切换和竞争锁的消耗。redis6采用多线程提速但是执行命令操作内存任然是单线程。

5.缓存雪崩?缓存穿透?缓存击穿?

  1. 缓存雪崩:现象:redis中有大量的数据过期,过度请求数据库导致压力过大或者宕机。
    解决:①使过期数据在时间上分布均匀 ②设置高可用集群
  2. 缓存穿透:现象:redis和数据库都没有请求的数据然后一直请求给数据库压力。
    解决:①给没有的设置空值或默认值 ②先通过布隆过滤器判断数据是否存在,存在再继续往下走。
  3. 缓存击穿:现象:多个请求redis中同一个key,这是key过期,redis请求数据库。
    解决:①使用互斥锁只让一个去请求,请求后将数据带到redis。②热门数据设置不过期

6.布隆过滤器?

这是一个占用空间很小的数据结构,它由很长的二进制向量和一组hash映射函数组成用于检索一个元素是否存在。缺点:有一定的误识别率和删除困难
如何减少这种误差:①多搞几次哈希函数映射,降低哈希碰撞概率 ②同时增大内存扩大hash函数生成范围降低碰撞概率

7.redis持久化机制?

①RDB:一定时间内将内存数据以快照的形式保存在硬盘中,也就是某个片段的数据写到临时文件中替换上次的持久化文件

优点:恢复某个时间段大的数据集时,比aof效率快 缺点:不安全,数据丢失

②AOF:会把每次写的命令都记录,redis重启后会将持久化日志文件恢复。

优点:安全,几乎不丢失数据。 缺点:aof比rdb文件大且速度恢复慢

8.redis和mysql怎么保持一致性?

  1. 缓存延时双删:就是更新数据库之前删除缓存再更新然后再删除缓存。下次访问redis是空的直接访问数据库同步redis。如果第二次删除失败怎么办数据也会不一致,或者给这个数据key设置过期时间自动删除,这样会在过期时间内数据不一致问题。
  2. 缓存删除重试机制:就是引入重试机制多删除几次。重试流程:①请求更新数据库 ②删除缓存失败 ③把删除失败的key写到消息队列 ④消费消息队列时获取删除key ⑤重试删除缓存操作。
  3. 读取binlog:使用canal组件监控binlog日志将更新数据同步到redis中

9.redis过期策略?

①定时删除: 每个key都需要创建一个定时器,到时间就会清除key,所以对内存很友好,但是会占用cpu的大量资源去处理过期。
②惰性删除: 用到key的时候再去判断过没过期,过期就清除,可以节省cpu的资源,但是对内存不友好。可能出现大量过期的key没有清除。
③定期删除: 定时删除和惰性删除的结合体,每隔一段时间抽取设置过期的key检测是否过期(默认是1s执行10次清除,每次抽取5个检测),过期就清除。

10.redis淘汰机制?

是为了redis内存满了删除一些key。

  1. lru(最近最少使用的根据时间):①volatile-lru:针对设置过期时间的key使用lru算法进行淘汰。②allkeys-lru:所有key使用lru算法进行淘汰
  2. lfu(最近最少使用根据计数器):①volatile-lfu:针对设置过期时间的key使用lfu算法淘汰。②allkeys-lfu:所有key使用lfu算法进行淘汰
  3. random:①volatile-random:从所有设置了过期时间的key中随机淘汰机制进行淘汰。 ②allkeys-random:所有key使用随机淘汰机制进行淘汰
  4. volatile-ttl:删除快过期的数据。 no-eviction:不删除键,操作报错。

11.分布式锁特征?

互斥性:任何时刻只有一个客户端持有锁。
锁超时释放:超时释放防止死锁避免不要资源浪费。
可重入性:一个线程获取锁后,可以再次对其请求加锁。
高性能和高可用:加锁和解锁需要开销尽可能低,同时保证高可用。
安全性:锁只能被持有者删除。

12.redis分布式锁?

  1. 保护分布式系统的安全 场景:我们在使用synchronized同步锁无法完成的场景就使用分布式锁完成互斥场景。
  2. 主要是setNx命令,往里存值,存储成功返回true代表上锁成功,第二个线程访问时有值返回false,然后自旋等待。框架中一般使用redisson组件调lock方法来实现,redisson底层通过判断key是否存在,搭配lua脚本实现,保证一致性。
  3. 分布式锁实现过程:多个线程取获取锁,加锁成功后执行lua脚本去redis执行逻辑。这里有个看门狗概念:每个锁有过期时间,如果还未执行完锁到期,这时看门狗定时去看看是否执行完,还未执行完就延长生存时间。

13.redis的hash冲突?

  1. 首先redis是键值对的内存非关系型数据库。由一个全局hash表来存储数据,这张hash表由多个hash桶组成,hash桶中entry元素保存了key和value。key指向实际键,value指向实际值。
  2. hash冲突:通过不同的key可能会计算出一样的hash值会导致存在同一个hash桶中。

解决hash冲突:采用链式哈希。链式哈希:指同一个哈希桶中,多个元素用一个链表保存。但是数据越多冲突也越多,冲突链就越长,查询效率就低。为了保持高效redis会对hash表做增加hash桶的操作,减少冲突。为了增加hash桶更高效还使用两个全局hash表一个用于当前使用一个用于扩容。

14.工作中用到redis场景?

  1. redis分布式锁使用;
  2. 当数据库,保存产品相关信息;
  3. 获取验证码;
  4. 缓存。
  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值