【redis架构系列】redis常用面试题问答

1.redis的5种基本类型string、list、hash、set、zset的使用场景

String最常用,可以用在各种cache的key。
List可以用作消息队列。
Set可以用来取交集。
Hash可以用来存储对象(比如用户)的各种属性。
zset可以用来做排行榜

2.Set的常用命令

set、append、get、strlen、keys、scan、object encoding。 

3.String 类型对象的底层实现

string 底层实现有三种实现方式有三种实现方式:int,embstr,raw

  • 字符串内容可转为 long,采用 int 类型;
  • 长度<39(3.2版本前39,3.2版本后分界线44) 用 embstr;
  • 其他用 raw。SDS是Redis自己构建的一种简单动态字符串的抽象类型,并将 SDS 作为 Redis 的默认字符串表示

4.list的常用命令:

lpush、lpop、rpush、rpop、llen、keys、scan、object encoding

5.list类型对象的底层实现

list底层实现有三种实现方式:linkedlist、ziplist、quicklist。

  • 双端链表。
    1.双端链表便于在表的两端进行 push 和 pop 操作,但是它的内存开销比较大;
    2.双端链表每个节点上除了要保存数据之外,还要额外保存两个指针;
    3.双端链表的各个节点是单独的内存块,地址不连续,节点多了容易产生内存碎片;
  • 压缩列表。
    1.ziplist 由于是一整块连续内存,所以存储效率很高;
    2.ziplist 不利于修改操作,每次数据变动都会引发一次内存的 realloc;
    3.当 ziplist 长度很长的时候,一次realloc可能会导致大批量的数据拷贝,进一步降低性能;
  • quicklist。
    1.空间效率和时间效率的折中;
    2.结合了双端链表和压缩列表的优点;

6.hash常用命令有哪些:

hset、hmse、hget、hmget、hlen、hscan(HSCAN website3 0 COUNT 10000)、HKEYS。

7.hash类型的对象的底层实现

底层实现有2种实现方式:ziplist、hashtable。

  • 当哈希对象可以同时满足以下两个条件时, 哈希对象使用 ziplist 编码
    a.哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节;
    b.哈希对象保存的键值对数量小于512个;
  • 不能满足这两个条件的哈希对象需要使用 hashtable 编码。
  • 注意:这两个条件的上限值是可以修改的
    具体请看配置文件中关于 hash-max-ziplist-value 选项和 hash-max-ziplist-entries 选项的说明。
    对于使用 ziplist 编码的列表对象来说, 当使用 ziplist 编码所需的两个条件的任意一个不能被满足时, 对象的编码转换操作就会被执行: 原本保存在压缩列表里的所有键值对都会被转移并保存到字典里面, 对象的编码也会从 ziplist 变为 hashtable 。

8.set的常用命令:

sadd、smembers(次之)、scard、sscan(SSCAN set01 0 COUNT 10000)(优先)、sinter(取交集)、SMOVE(SMOVE songs my_songs "Believe Me")

9.集合set的底层实现,

集合对象的编码可以是 intset 或者 hashtable。

  • intset 编码的集合对象使用整数集合作为底层实现, 集合对象包含的所有元素都被保存在整数集合里面。
    当集合对象可以同时满足以下两个条件时, 对象使用 intset 编码:1.集合对象保存的所有元素都是整数值;2.集合对象保存的元素数量不超过 512 个;
  • 不能满足这两个条件的集合对象需要使用 hashtable 编码。
  • 注意 : 第二个条件的上限值是可以修改的, 具体请看配置文件中关于 set-max-intset-entries 选项的说明。
  • 对于使用 intset 编码的集合对象来说, 当使用 intset 编码所需的两个条件的任意一个不能被满足时, 对象的编码转换操作就会被执行:
    原本保存在整数集合中的所有元素都会被转移并保存到字典里面, 并且对象的编码也会从 intset 变为 hashtable。

10.zset常用命令:

zadd、zcard(第1步)、zscan(第2步,优先)、ZCOUNT、ZRANGE(第2步次之zrange key start stop)

11.有序集合zset的底层实现

实现有两种:ziplist、skiplist。

  • 当有序集合对象可以同时满足以下两个条件时, 对象使用 ziplist 编码:
    a.有序集合保存的元素数量小于 128 个
    b.有序集合保存的所有元素成员的长度都小于 64 字节;
  • 不能满足以上两个条件的有序集合对象将使用 skiplist 编码。