Redis数据结构String、Hash、List、Set、SortedSet及相关操作

String

简单动态字符串(SDS),这种结构更像C++的String或者Java的ArrayList,长度动态可变。

  1. struct sdshdr {
  2. // buf 中已占用空间的长度
  3. int len;
  4. // buf 中剩余可用空间的长度
  5. int free;
  6. // 数据空间
  7. char buf[];
  8. };

String是Redis中最简单的一种数据结构,即Key-Value型的数据,根据Redis官方文档,Value最大值为512M。

String数据结构的基本操作
命令 描述 用法
SET 将字符串值Value关联到Key
Key已关联则覆盖,无视类型
原本Key带有生存时间TTL,那么TTL被清除
SET key value [EX 秒数] [PX 毫秒] [NX|XX]
GET 返回key关联的字符串值
Key不存在返回nil
Key存储的不是字符串,返回错误,因为GET只用于处理字符串
GET key
MSET (1)同时设置一个或多个Key-Value键值对
(2)某个给定Key已经存在,那么MSET新值会覆盖旧值
(3)如果上面的覆盖不是希望的,那么使用MSETNX命令,所有Key都不存在才会进行覆盖
(4)MSET是一个原子性操作,所有Key都会在同一时间被设置,不会存在有些更新有些没更新的情况
MSET key value [key value …]
MGET (1)返回一个或多个给定Key对应的Value
(2)某个Key不存在那么这个Key返回nil
MGET key [key …]
SETEX (1)将Value关联到Key
(2)设置Key生存时间为seconds,单位为秒
(3)如果Key对应的Value已经存在,则覆盖旧值
(4)SET也可以设置失效时间,但是不同在于SETNX是一个原子操作,即关联值与设置生存时间同一时间完成
SETEX key seconds value
SETNX (1)将Key的值设置为Value,当且仅当Key不存在
(2)若给定的Key已经存在,SEXNX不做任何动作
SETNX key value


List

List对象的底层实现是quicklist(快速列表,是ziplist 压缩列表 和linkedlist 双端链表 的组合)。Redis中的列表支持两端插入和弹出,并可以获得指定位置(或范围)的元素,可以充当数组、队列、栈等。

Hash

Hash对象的底层实现可以是ziplist(压缩列表)或者hashtable(字典或者也叫哈希表)。
Hash对象只有同时满足下面两个条件时,才会使用ziplist(压缩列表):
1.哈希中元素数量小于512个;
2.哈希中所有键值对的键和值字符串长度都小于64字节。
hashtable哈希表可以实现O(1)复杂度的读写操作,因此效率很高。源码如下:

Set

Set集合对象的底层实现可以是intset(整数集合)或者hashtable(字典或者也叫哈希表)。
intset(整数集合)当一个集合只含有整数,并且元素不多时会使用intset(整数集合)作为Set集合对象的底层实现。