答:支持字符串、哈希、list、set、soredset等数据结构
2.redis如何实现string,这样实现有什么好处?
答:摘选自《Redis的设计与实现》
好处:(1)可以常数复杂度获取字符串长度
(2)杜绝缓冲区溢出
(3)减少修改字符串时,带来的内存分配次数
3.redis的hash怎么实现的?rehash过程讲一下;
答:如图所示,index就是索引位置
Rehash过程:哈希结构如图所示
(1)为ht[1]分配空间:空间大小如下:
<1>若是扩展大小:分配大小=(第一个大于等于ht[0]*used*2)的2的n次方的数;<2>若是缩小大小:分配大小=(第一个大于等于ht[0]*used)的 2的n次方的数;
(2)将ht[0]保存的所有键值对重建计算计算索引值,保存到ht[1];
(3)全部迁移之后,将ht[0]置为空,释放ht[0],把ht[1]设置为ht[0],并在ht[1]新建一个空白哈希表,为下一次rehash准备。
4.Redis的zset实现原理是什么?为什么不用红黑树来实现?
答:zset的底层结构同时使用了字典与跳跃表的;
红黑树是一种存在于内存中的结构,可以保证在最坏的情况下,对红黑树进行例如search,insert,以及delete等基本的动态集合操作的时间复杂度为O(lg n)。而跳跃表则是一种随机性的结构,所以在跳表中的搜索、插入、删除操作的时间复杂度就都为O(logn),但在最坏的情况下,它的时间复杂性又会变成O(n)
5.讲讲redis里面的哈希表?
答:哈希结构如图所示:
哈希表节点如图所示:
答:RDB与AOF是redis的两种持久化策略,由于redis是基于内存的数据库,存储的数据为了防止丢失,需要持久化到硬盘中;
RDB是一种redis数据快照的持久化策略,在一定条件下,备份这个条件下时间点的redis数据,,是redis默认的持久化策略。
AOF是一种存储redis的命令的持久化方式,存储符合redis协议格式的命令数据;
如果AOF日志文件超过一定的大小限制,则会出发AOF的重写机制,重写过程:redis创建新的AOF文件,同时操作的命令会继续追加到现有的AOF文件中,如果新的文件创建完毕,就会从旧的文件切换到新的文件,继续在新的文件追加命令。
比较两种持久化方式:
方式 |
触发条件 |
实现过程 |
优点 |
缺点 |
RDB |
1.自定义的配置的快照规则; 2.使用save或者bgsave命令 3.执行flushall命令 4.执行主从复制操作 |
1.redis进程调用操作系统的fork创建子进程; 2.子进程将内存中数据写入硬盘的临时文件中; 3.写入完毕后,临时文件替换掉旧的rdb文件; |
1.最大化redis的性能,持久化操作交给子进程完成 2.速度比较快,方便传输,因为保存的压缩的二进制数据 |
1.若redis突然异常退出,则最后一刻的数据不能持久化 2.fork过程出现耗时的情况下,造成redis服务端一段时间停止处理客户端请求; |
AOF |
1.手动开启持久化; 2.每次执行更快数据库的命令都会触发AOF持久化 |
1.更改redis数据库的命令会添加到操作系统的缓冲机制中 2.从缓冲中再写入到磁盘的aof |
1.可以及时持久化redis的数据; 2.持久化文件易懂易理解 |
1.降低了redis服务端的性能; 2.通过AOF恢复数据没有RDB方式的速度快 |
答:哨兵模式是在主从复制模式中用于监控master的状态,可以实现master与slaver服务器的切换,保证系统的可用,主要作用:监控master状态、提醒、自动故障迁移
2. redis哨兵怎么选举主节点?
答:(1)哨兵leader选举过程:
当哨兵发现监控的master主观下线,会向其他哨兵发送is-master-down-by-addr,征求判断并将自己设置为领导者,如果哨兵发现选举的票数大于n/2+1,就会成为领导者,否则继续选举
(2)选slave节点为master的过程:
找到优先级最高的slave>复制偏移量最大的>run_id最小的slave
1. redis集群有哪些玩法,各自优缺点,场景?
答:codis方式的集群:一种代理模式,代理服务器负责转发redis客户端的请求,并分发给多个redis服务器节点:
Redis-cluster: redis官方提供的集群方式,是一种去中心化的集群,客户端可访问任意节点,每个节点都存储了其他节点的信息;
2. redis cluster有没有了解过,怎么做到高可用的?
答:redis cluster 是redis官方提供的一种去中心化的集群方式,所有节点通过ping-pong机制互联,内部使用二进制协议优化传输速度,客户端直接连接节点,不需要连接每个节点。
保证高可用:如果其中某个节点挂掉了,则会将哈希槽跟给挂掉的slave,并设置为新的master节点,
3. redis cluster原理是什么?
答:Redis 集群中内置了 16384个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
4. 一个key值如何在redis集群中找到存储在哪里
答:使用crc16算法计算key对应的值,然后除以16384求余数得到对应的哈希槽,再根据哈希槽分布得出key所在的节点
1. redis key的过期淘汰机制?
答:(1)定时过期:设置过期时间,定时删除,会占用大量CPU资源处理过期数据,从而影响服务器的缓存相应和吞吐量;
(2)惰性过期:当key被访问时,判断key是否已经过期,过期就清除,但是若某个key一直不被访问,就不会清除,从而会占用内存空间;
(3)定期过期:每隔一定的时间,扫描expires字典中过期的key,然后清除
2. 你们redis用在了什么地方?
答:(1)内存数据库(登录信息、购物车信息、用户浏览记录等)
(2)缓存服务器(商品数据、广告数据等等)(最多使用)
(3)解决分布式集群架构中的 session 分离问题( session 共享)
(3)任务队列(秒杀、抢购、12306等等)
(5)分布式锁的实现
(6)支持发布订阅的消息模式
(7)应用排行榜(有序集合)
(8)网站访问统计
(9)数据过期处理(可以精确到毫秒)
3. 为什么要使用Redis,有什么好处
答:(1)是单线程的内存数据库,不存在线程安全问题
(2)最多支持并发10w QPS请求,因为底层采用了多路IO复用
(3)相比memcache这种专业的缓存技术,具有更高的读写性能,支持丰富的数据类型
4. 讲下redis存穿透?
答:大量请求的key在redis中对应的value一定不存在,大量请求就会直接请求数据库,造成数据库压力突然变大,解决方案是对查询为空的情况设置值并设置过期时间
5. 讲一下缓存雪崩?
答:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。
6. redis单线程为什么快
答:(1)redis的数据直接存储在内存中,绝大部分请求是直接操作内存;
(2)采用单线程,避免了不必要的上下文切换和竞争条件,也不用考虑多进程或多线程切换消耗的cpu,不考虑锁的问题,
(3)使用多路I/O复用模型,非阻塞IO
7. redis分布式锁实现?
答:串行访问使用setnx命令
使用SETNX完成同步锁的流程及事项如下:
使用SETNX命令获取锁,若返回0(key已存在,锁已存在)则获取失败,反之获取成功,为了防止获取锁后程序出现异常,导致其他线程/进程调用SETNX命令总是返回0而进入死锁状态,需要为该key设置一个“合理”的过期时间释放锁,使用DEL命令将锁数据删除
8. Redis的并发竞争问题如何解决?
答:Redis 的并发竞争 Key 的问题也就是多个系统同时对一个 key 进行操作,但是最后执行的顺序和我们期望的顺序不同,这样也就导致了结果的不同,
可以使用分布式锁,保持请求访问key是串行的
9. redis作为高速缓存和数据库的数据一致性的问题
答:(1)数据库进行更新操作之前清空缓存,更新之后也清空缓存;
(2)使用消息队列,串行化执行
10. 如果redis作为分布式锁的时候,主节点挂掉了,但是数据还没有同步到从节点,这种情况怎么办?
答:使用RedLock