一 Redis基本数据类型
1.1 Redis中数据类型有哪些?底层实现是什么?不同的数据类型运用到什么场景?
String、hash、list、set、sorted_set/zset
hash 底层是hash表实现的数据存储。
list 能存储多个数据,按照插入顺序排序,底层使用双向链表实现。
set 和hash存储结构完全相同,仅存储键值,不存储value。且键值不允许重复。存储大量数据,且快速查询。
zset 是字典(dict) + 跳表(skiplist),数据比较少的时候用ziplist编码结构存储。是有序集合,不允许有重复的数据结构,每一个元素关联double类型分数。通过分数对集合中元素从小到大排序。成员唯一的,分数不唯一的。
string 微博上大v的访问量存储。
hash 商品的抢购可以用,店铺的id为key,商品id为filed,数量为value。
list 对有顺序的信息管理。
set 用于黑白名单。
1.2 Redis中哪里用了跳表?数据结构是什么?跳表插入和删除的大概过程,跳表相对普通链表有什么优势,是怎么提高访问效率的?
zset底层就使用了跳跃表,是由多层多链表实现。
在进行数据插入时候,先插入底层,然后利用算法(类似抛硬币算法),如果正面插入l2层,然后继续利用算法计算是否还继续向上层插入,当判断不需要插入,元素就插入结束。
删除元素,从上到下找到元素,找到删除,一直到最底层。
跳跃表在查询时候速度很快,因为在跳跃表中每个列表都是有顺序的。从上层往下查找,每一层查询到查询结束,如果比某一个节点大向右边,比一个节点大向左边。然后一层层查询。
1.3 整数集合、压缩列表实现原理?
是集合(set)的底层实现之一,当一个集合(set)只包含整数值元素,并且这个 集合的元素不多时,Redis就会使用整数集合(intset)作为该集合的底层实现。
压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表只包含少量列表项时,并且每个列 表项时小整数值或短字符串,那么Redis会使用压缩列表来做该列表的底层实现。 压缩列表(ziplist)是Redis为了节省内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数 据结构,一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整 数值。
1.4 SDS动态字符串的优点是什么?
- len 保存了SDS保存字符串的长度 。
- buf[] 数组用来保存字符串的每个元素。
- free记录了 buf 数组中未使用的字节数量 。
好处:获取 SDS 字符串的长度只需要读取 len 属性,时间复杂度为 O(1)。
1.5 Redis事务回滚?
Redis中是不支持回滚的,可以使用lua脚本执行redis条命令。
1.6 Redis中数据字典如何更新?hash 冲突怎么办,rehash,负载因子?
是一种用于保存键值对的抽象数据结构。字典中的每一个键 key 都是唯一的,通过 key 可以对值来进行查找或修改。redis地址底层是hash表实现。