我们都知道Redis是单线程的,基于事件驱动的,Redis中有个EventLoop,EventLoop负责对两类事件进行处理:
1. 一类是IO事件,这类事件是从底层的多路复用器分离出来的。
2. 一类是定时事件,这类事件主要用来事件对某个任务的定时执行
1.Redis 用过哪些数据结构,以及Redis底层是怎么实现的?
list hash string set sortedSet
有底层八种数据结构分别实现了字符串(int、raw或者embstr),列表(ziplist或者linkedlist)、哈希(ziplist或者hashtable)、集合(intset或者hashtable)、有序集合(ziplist,另一种是skiplist与dict的结合)
2.Redis缓存穿透,缓存雪崩?
缓存穿透就是查询一个一定不存在的数据时,由于缓存中不存在,每次请求总是穿过缓存,从数据库中查询,造成缓存穿透。
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
3.如何使用Redis实现分布式锁?
基于redis开发了一个dlock的模块,进行分布式锁的使用
4.Redis的并发竞争问题如何解决?
使用乐观锁的方式进行解决(成本较低,非阻塞,性能较高),就是使用watch命令来实现。
5.Redis的持久化的几种方法,优缺点是什么,怎么实现的
AOF,RDB。
RDB:
优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能
缺点:RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候
AOF:是文件操作,需要IO操作。
优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会 丢失1s的数据;且如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)。
缺点:AOF文件比RDB文件大,且恢复速度慢。
6.Redis的缓存失效策略
延迟失效机制(消极失效机制):
当客户端请求操作某个key的时候,Redis会对客户端请求操作的key进行有效期检查,如果key过期才进行相应的处理。
主动失效机制(积极失效机制):
积极失效机制,即服务端定时的去检查失效的缓存,如果失效则进行相应的操作。
遗留问题:
1. Redis缓存失效逻辑为什么只有master才能操作?
2. 上面提到如果客户端访问的是slave,slave并不会清理失效缓存,那么这次客户端岂不是获取了失效的缓存?
3. 上面介绍的两种缓存失效机制各有什么优缺点?Redis设计者为什么这么设计?
4. 服务端对客户端的请求处理是单线程的,单线程又要去处理失效的缓存,是不是会影响Redis本身的服务能力?
7.Redis的集群,高可用,原理
8.Redis的缓存分片
分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。分片方式有:按照范围分区,使用哈希分区
9.Redis的数据淘汰策略
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
redis 确定驱逐某个键值对后,会删除这个数据并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)
下面看看几种策略的适用场景:
1. allkeys-lru: 如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。
2. allkeys-random: 如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。
3. volatile-ttl: 这种策略使得我们可以向Redis提示哪些key更适合被eviction。
另外,volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。
1. 一类是IO事件,这类事件是从底层的多路复用器分离出来的。
2. 一类是定时事件,这类事件主要用来事件对某个任务的定时执行
1.Redis 用过哪些数据结构,以及Redis底层是怎么实现的?
list hash string set sortedSet
有底层八种数据结构分别实现了字符串(int、raw或者embstr),列表(ziplist或者linkedlist)、哈希(ziplist或者hashtable)、集合(intset或者hashtable)、有序集合(ziplist,另一种是skiplist与dict的结合)
2.Redis缓存穿透,缓存雪崩?
缓存穿透就是查询一个一定不存在的数据时,由于缓存中不存在,每次请求总是穿过缓存,从数据库中查询,造成缓存穿透。
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
3.如何使用Redis实现分布式锁?
基于redis开发了一个dlock的模块,进行分布式锁的使用
4.Redis的并发竞争问题如何解决?
使用乐观锁的方式进行解决(成本较低,非阻塞,性能较高),就是使用watch命令来实现。
5.Redis的持久化的几种方法,优缺点是什么,怎么实现的
AOF,RDB。
RDB:
优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能
缺点:RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候
AOF:是文件操作,需要IO操作。
优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会 丢失1s的数据;且如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)。
缺点:AOF文件比RDB文件大,且恢复速度慢。
6.Redis的缓存失效策略
延迟失效机制(消极失效机制):
当客户端请求操作某个key的时候,Redis会对客户端请求操作的key进行有效期检查,如果key过期才进行相应的处理。
主动失效机制(积极失效机制):
积极失效机制,即服务端定时的去检查失效的缓存,如果失效则进行相应的操作。
遗留问题:
1. Redis缓存失效逻辑为什么只有master才能操作?
2. 上面提到如果客户端访问的是slave,slave并不会清理失效缓存,那么这次客户端岂不是获取了失效的缓存?
3. 上面介绍的两种缓存失效机制各有什么优缺点?Redis设计者为什么这么设计?
4. 服务端对客户端的请求处理是单线程的,单线程又要去处理失效的缓存,是不是会影响Redis本身的服务能力?
7.Redis的集群,高可用,原理
8.Redis的缓存分片
分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。分片方式有:按照范围分区,使用哈希分区
9.Redis的数据淘汰策略
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
redis 确定驱逐某个键值对后,会删除这个数据并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)
下面看看几种策略的适用场景:
1. allkeys-lru: 如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。
2. allkeys-random: 如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。
3. volatile-ttl: 这种策略使得我们可以向Redis提示哪些key更适合被eviction。
另外,volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。
1120

被折叠的 条评论
为什么被折叠?



