redis面试
redis内部的数据结构:
1.简单动态字符串(sds):内部是二进制,存在一个len字段记录长度值
2.双端链表:可以回溯到前边的链表
3.跳跃表:更快的访问后续节点
4:字典:内部是hash存储,隔一段时间会实现rehash,将4,4重新hash到8长度的内存
5.压缩列表:每个节点记录前一个节点长度,可以回溯到前边的字符,存在问题是会连锁更新,长度254变更后会连锁变化
redis的对象:
有序集合:
使用压缩链表与跳跃表实现
压缩链表中根据分值排序,v与score先后进入
跳跃表也是按照分值进行排序
哈希结构:
使用压缩链表与hashtable结构实现
压缩链表中k,v先后插入
hashtable使用字典作为底层结构,字典的k,v就是一一对应
集合:
使用整数链表和hashtable进行实现
当元素是整数时候使用整数列表
hashtable使用字典底层实现,k是集合元素,v都是null
列表:
使用压缩列表和双端链表实现
压缩列表实现每个列表节点存一个元素
双端链表每个节点存一个元素
一些基础点:
1.redis是内存操作,因此可以快速访问
2.redis是单线程,避免了线程切换造成的cpu损耗
3.redis使用epoll实现io单路复用技术
redis的数据淘汰机制:
redis使用定期删除与惰性删除。
数据淘汰机制分类:
1、定时删除,设置定时时间,到达时间后删除
2、定期删除,服务每到达一个时间节点全部遍历,将过期key淘汰
3、惰性删除,每次对key的访问操作来临时候检查是否过期,过期则删除
redis的事务:
redis的事务,前一条执行失败,事务中后续命令会继续执行
redis不存在事务回滚的机制,追求简单化
原子性:如果语句出问题整个事务全部放弃执行,因此会保证完整性。
一致性:事务虽然有的语句执行失败继续执行,但是所有事务都会执行失败,因此具有一致性。入队错误:直接不执行,具有一致性。执行错误:全部执行错误,具有一致性
隔离性:单线程,因此具有隔离性
持久性:不具有很强的持久性,因为rdb与aof文件所具有的持久性
redis复制:
RDB与AOF
rdb存储的是数据
aof存储的是逻辑文件
rdb基本复制:
1.从服务器发送复制请求
2.主接口生成rdb文件,并且用缓冲区记录目前的命令
3.将rdb文件发送从服务器,然后发送缓冲区记录的命令
4.从服务器加载rdb文件,并且执行主接口发送的缓冲区命令
存在问题:
1.初次复制:没有问题
2.断线后重连,存在问题,会造成时间上的浪费
rdb优化复制:
1.从服务器会发送给主服务器一个偏移量
2.主服务器通过偏移量给从服务器发送偏移量到现在的数据
3.从服务器加载存在的数据
如果偏移量态久远则执行初次复制。
复制积压缓存区是一个先进先出的队列。
redis cluster
去中心化,因此需要主从复制的思路
通过哈希一致性将每种分配到一个固定的槽中