1、字符串类型
随着redis版本的更新,可能会支持更大的最大容量,超过512MB。
注意:键的命名要有唯一性和可读性。
实际上字符串类型是一个长度可以动态变化的字符数组,结构如下,字符数组存不下,就会创建一个新的更长的数组,当数组的数据量非常小时,会减小数组的长度,所以是比较节约空间的。
2、散列类型
散列类型(hash)。散列类型适合存储对象,当散列对象包含少量的<字段名,字段值> 时,并且字段名和字段值都是小整数值或者短字符串时,底层是用压缩列表实现;否则就用数组+ 链表方式实现,类似于Java 的 HashMap 结构。
HSET key(对象名) field(属性变量) value(变量值);
HGET key filed;获取值;
批量插入 HMSET key field1 value1 field2 value2.....
批量查询 HMGET key field1 field2;
HGETALL key 查询key所有的属性值;
判断字段是否存在:HEXISTS key field;存在返回1,不存在返回0。
增加数字 :HINCRBY key field 值;
删除字段:HDEL key filed [field 。。。。];
HKEYS key; 获取key 的所有字段名;
HVALS key;获取key的所有值。
HLEN key;获取key的长度。
3、列表类型
列表类型是双向链表,可以在链表的左右两端加数据和删除数据。就如同栈一样。越往中间走,时间复杂度越大。
当列表比较短,并且列表项都是小整数或者短字符串时,底层用压缩列表实现,否则用链表方式实现。
LPUSH在链表的左边添加值,RPUSH在链表的右边添加值。返回值是增加链表后链表的长度。
LPOP从链表左边弹出一个值,RPOP从链表右边弹出一个值。返回的值是弹出值。
LLEN key用于获取链表的长度(元素个数)。
LRNGE key start end;获取链表从[start , end]期间的元素。
LREM key count value;
列表如何通过索引或者说下标来操作呢?
LINDEX key index;表示获取key的第index元素;
LSET key index value;表示设置key的第index元素为value;
LTRIM key start end;删除[start ,end]之外的所有元素;
4、集合类型
当集合里只包含整数元素时,并且元素不多时,底层用集合实现(其实就是整数型数组),而且数组是一个升序的,元素唯一的数组,数组元素要么全部是 16 位整数,要么全是 32 位整数,要么全是 64 位整数,至于用哪种整数,这取决于数组中长度最长的那个元素,当有新的更长的元素加入数组时,数组会自动进行位数升级,比如数组从16位整数升级为32位整数,但是只能升级,升级之后就不能降级了。
当集合里包含的不是整数元素时,或者包含的元素非常多时,底层是用哈希表实现的(数组 + 链表)。
SADD是向集合中添加元素,SREM是删除元素。返回(真实的)添加成功或者删除成功的元素个数。
SMEMBERS key;获取集合中所有的元素。
SISMEMBER key member;判断member是否在集合key中,存在返回1,否则返回0.
集合之间的运算。
SDIFF key1 key2;可以是多个key,表示key1-key2的运算结果(数学的集合运算一样)。
SINTER key1 key2;可以是多个key,表示集合的交集;
SUNION key1 key2;可以是多个key,表示并集。
5、有序集合类型
当集合里只包含整数元素时,并且元素不多时,底层用集合实现(其实就是整数型数组),而且数组是一个升序的,元素唯一的数组,数组元素要么全部是 16 位整数,要么全是 32 位整数,要么全是 64 位整数,至于用哪种整数,这取决于数组中长度最长的那个元素,当有新的更长的元素加入数组时,数组会自动进行位数升级,比如数组从16位整数升级为32位整数,但是只能升级,升级之后就不能降级了。
当集合包含的元素不是整数时,或者包含的元素非常多时,底层是用跳表实现的。
增加元素。返回成功添加的元素个数(不含已经存在的)
获取元素的分数。
获取[start, stop]顺序区间的元素,0代表第一个元素,-1代表最后一个元素。如果ZRANGE结果按照元素升序排列。ZREVRANGE结果按照元素降序排列。
获取指定分数区间[min, max]的元素。+inf 和 -inf表示正无穷和负无穷。limit offset count 指的是从第offset元素开始的count个元素内,ZRANGEBYSCORE key (80 100;表示(80,100]范围的元素。
增加某个元素的分数。
6、为什么 redis 有序集合使用跳表而不是红黑树(自平衡二叉搜索树)
跳表的优点:1、跳表适合范围查询,2、跳表的读取速度和红黑树几乎一样,3、读取的操作更加简单。
这也就是 redis 选择有序集合的原因。
但是跳表也有缺点:一般情况下,它的平衡性没有红黑树好,在极端情况下,会有极小的概率退化为单链表形式(时间复杂度 O(n)),只是极小的概率,一般可以忽略。
为什么跳表的平衡性不如红黑树,插入/删除是怎么样的,这篇文章讲得很好:https://www.sohu.com/a/293236470_298038