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 编码。