Redis知识小记

一、单线程的redis为什么这么快?

1、Redis的所有操作都在内存中;

2、Redis是单线程的,避免了线程上下文切换引起的额外性能开销。同时,单线程避免了多线程的数据同步问题,没有加锁释放锁操作;

3、数据结构简单,对数据结构的操作也简单;

4、使用多路复用IO(类似java的NIO),多路是指多个网络连接,复用是指多个网络连接复用同一个处理线程,处理线程会依次轮询有IO操作的请求,避免了线程因为IO传输导致的阻塞;

5、Redis构建了自己独有的VM机制。

 

二、Redis的数据类型:1、string(字符串);2、list(列表);3、hash(哈希);4、set(集合);5、zset(有序集合,将插入的元素根据score排序)

 

三、Redis的缓存击透、缓存击穿、缓存雪崩:

1、缓存击透

问题原因:大量的请求不断访问一个不存在的key,导致每条请求都会请求到数据库中,最终导致数据库崩溃;

解决方案:使用队列或者加锁让请求依次查询数据库,缓解数据库压力。

2、缓存击穿

问题原因:大量请求同时访问同一个key,当key失效的一瞬间,所有请求将直接打到数据库上,导致数据库崩溃;

解决方案:1、设置缓存永不过期或者过期时间比较长;2、使用双重备份缓存,当缓存A失效时,使用缓存B。

3、缓存雪崩:大量key在同一时间失效,所有请求直接请求到数据库,导致数据库崩溃;

解决方案:1、每个key设置不同的失效时间,避免所有key在同一时间失效;2、使用队列或者加锁使请求依次访问数据库。

 

四、Redis持久化的几种方式

1、RDB:每隔一定的时间(定时)把内存的数据写入到磁盘中;

2、AOF:将每个写、删除操作记录到日志文件中,查询操作不会被记录。

 

五、Redis如何保证缓存数据和数据库数据一致性

1、设置缓存过期时间;

2、对数据库的更新操作,都将触发删除redis中对应key的操作,如果删除失败,则将这个操作放入队列中,另起一个线程从队列中取任务,执行删除该条记录的操作(延时双删策略)。

 

六、基于Redis实现的分布式锁

使用SETNX(set not exists) key value:如果key不存在,则创建并赋值,否则失败。创建成功的获得锁。

但是当获取到锁的副本宕机时这个关联锁的key也不会被删除,就会导致其他所有需要获取这个锁的业务/副本阻塞。

合理的解决方式是:

1、使用SET key value [EX seconds][PX millisecond] NX

EX seconds 设置键的过期时间为 seconds 秒

PX millisecond 设置键的过期时间为 millisecond 秒

NX 当键不存在的时候才设置

但是当某个副本的操作时间大于超时时间时,就可能会导致操作还没执行完,但锁却被释放了。
2、使用Redisson的watchdog,watchdog会每隔10秒把key的超时时间重置成你设置的值,一旦客户端宕机,watchdog也就失效了,key过了超时时间就会失效。

七、Redis的数据淘汰策略:

1、从设置了超时时间的key中挑选最近将要过期的key淘汰;

2、从设置了超时时间的key中挑选最近最少使用的key淘汰;

3、从设置了超时时间的key中随机淘汰;

4、从数据集中挑选最近最少使用的key淘汰;

5、从数据集中随机淘汰;

6、从不淘汰。

 

 

 

 

发布了50 篇原创文章 · 获赞 11 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章