redis 数据类型(字符串、哈希、列表、集合、有序集合)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值