天天看点

面试准备(七)Redis、Redis的分布式锁、Redis的双写问题、Reids击穿、穿透、雪崩

一、什么是Redis

  Redis是一个使用C语言编写的,开源的高性能非关系型(NoSQL)的键值对数据库。Redis的数据是存在内存中的,所以读写速度很快。常用于缓存方向,每秒可处理超过10W次读写操作,可以用来做分布式锁。此外,Redis支持事务、持久化等等。

  优势:

面试准备(七)Redis、Redis的分布式锁、Redis的双写问题、Reids击穿、穿透、雪崩

二、Reids的分布式锁

举例:比如电商中的超卖问题,同时调用同一个接口,减少库存数量出现错误。

解决方法:

1、增加锁

问题:分布式集群环境中通过分发之后jvm进程级别的锁并不管用。

2、redis分布式锁

运用Redis 的 SETNX命令 

面试准备(七)Redis、Redis的分布式锁、Redis的双写问题、Reids击穿、穿透、雪崩

减库存运行之前,先执行SETNX命令插入一条数据。如果存在该数据,则没抢到锁,不执行操作,如果抢到锁,则执行操作,并删除key。

问题:

(1)、如果中间报错了,则会不删除key,形成死锁。(try/catch 加入finally)

但是如果系统宕机,依然无法执行解锁操作。

(2)、设置key的超时时间

但是还是会存在宕机问题,并没设置上key的超时时间。

(3)、增加原子操作,插入key的时候顺便设置上超时时间,执行原子操作。

但是有可能在超时时间之内没有执行完内部操作,这时候其余线程获取到锁,出现问题。

(4)、使用redisson,redisson底层原理:

面试准备(七)Redis、Redis的分布式锁、Redis的双写问题、Reids击穿、穿透、雪崩

  redisson加锁并设置了超时时间之后会开启一个线程不断检测原线程是否还持有锁,然后不断续锁。

面试准备(七)Redis、Redis的分布式锁、Redis的双写问题、Reids击穿、穿透、雪崩

但是分布式锁会带来性能问题。

(5)、 与java concurrenthashmap 类似的分段锁.

具体:将整体拆分,比如有200个数量,分割成10个20个数量的段,分别上锁,每次请求进来会随机一组上锁,实现分段锁提高性能。

三、什么是Redis击穿和穿透以及预防措施

面试准备(七)Redis、Redis的分布式锁、Redis的双写问题、Reids击穿、穿透、雪崩

四、什么是Redis雪崩以及预防措施

面试准备(七)Redis、Redis的分布式锁、Redis的双写问题、Reids击穿、穿透、雪崩

五、什么是Redis一致性哈希实现动态扩容缩容

  一执行哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的空间为0-2^32-1,圆环就如下:

面试准备(七)Redis、Redis的分布式锁、Redis的双写问题、Reids击穿、穿透、雪崩

   然后下一步将各个服务器使用Hash进行一个哈希,具体可以选择服务器的ip或主机名作为关键字进行hash,这样每台机器就能确定其在哈希环上的位置。这样没台机器就在该环上有了自己的位置,然后数据进来之后,我们根据key用相同的哈希函数进行计算,计算出在该环上的位置,然后顺时针行走,遇到的第一台机器就将该数据保存到该机器。

  这样,如果其中一天机器宕机,该数据只重定向到下一个机器上,其余所有机器不会收到影响。一致性hash具有较好的容错性与可扩展性。

六、Redis的过期键的删除策略

面试准备(七)Redis、Redis的分布式锁、Redis的双写问题、Reids击穿、穿透、雪崩

七、Redis的内存淘汰策略

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。

全局的键空间选择性移除

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。

设置过期时间的键空间选择性移除

  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

八、Reids与数据库双写不一致

面试准备(七)Redis、Redis的分布式锁、Redis的双写问题、Reids击穿、穿透、雪崩

解决:

(1)、延迟双删

线程2执行过程完。延迟一阵时间再删除一次缓存。

但是不太靠谱。

(2)、内存队列

将操作放到队列里执行,但是顺序会出问题

(3)、分布式锁,将线程串行化执行

性能问题,串行执行

(4)、读写锁

针对同一个key

读数据之前增加读锁。

写数据之前增加写锁。

同一个key的读锁与写锁互斥。

继续阅读