集合类型(Set)和列表类型(List)的区别如下:
- 列表可以存储重复元素,集合只能存储非重复元素;
- 列表是按照元素的先后顺序存储元素的,而集合则是无序方式存储元素的 。
当我们把学生的成绩存储在有序集合中时,它的存储结构如下图所示:
文章插图
有序集合类型的使用如下:
127.0.0.1:6379> zadd zset1 3 golang 4 sql 1 redis # 添加数据(integer) 3127.0.0.1:6379> zrange zset 0 -1 # 查询所有数据1) "redis"2) "MySQL"3) "JAVA"复制
有序集合的经典使用场景如下:- 学生成绩排名;
- 粉丝列表,根据关注的先后时间排序 。
例如我们经常会把用户的登录信息存储在 Redis 中,但通常的做法是先将用户登录实体类转为 JSON 字符串存储在 Redis 中,然后读取时先查询数据再反序列化为 User 对象,这个过程看似没什么问题,但我们可以有更优的解决方案来处理此问题,比如我们可以使用 Hash 存储用户的信息,这样就无需序列化的过程了,并且读取之后无需反序列化,直接使用 Map 来接收就可以了,这样既提高了程序的运行速度有省去了序列化和反序列化的业务代码 。
与此知识点相关的面试题还有以下几个:
- 有序列表的实际存储结构是什么?
- 除了五种基本的数据类型之外,还有什么数据类型?
ziplist 介绍当数据比较少时,有序集合使用的是 ziplist 存储的,如下代码所示:
127.0.0.1:6379> zadd myzset 1 db 2 redis 3 mysql(integer) 3127.0.0.1:6379> object encoding myzset"ziplist"复制
从结果可以看出,有序集合把 myset 键值对存储在 ziplist 结构中了 。有序集合使用 ziplist 格式存储必须满足以下两个条件:- 有序集合保存的元素个数要小于 128 个;
- 有序集合保存的所有元素成员的长度都必须小于 64 字节 。
127.0.0.1:6379> zadd zmaxleng 1.0 redis(integer) 1127.0.0.1:6379> object encoding zmaxleng"ziplist"127.0.0.1:6379> zadd zmaxleng 2.0 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(integer) 1127.0.0.1:6379> object encoding zmaxleng"skiplist"复制
通过以上代码可以看出,当有序集合保存的所有元素成员的长度大于 64 字节时,有序集合就会从 ziplist 转换成为 skiplist 。小贴士:可以通过配置文件中的 zset-max-ziplist-entries(默认 128)和 zset-max-ziplist-value(默认 64)来设置有序集合使用 ziplist 存储的临界值 。skiplist 介绍skiplist 数据编码底层是使用 zset 结构实现的,而 zset 结构中包含了一个字典和一个跳跃表,源码如下:
typedef struct zset {dict *dict;zskiplist *zsl;} zset;复制
跳跃表的结构如下图所示:文章插图
根据以上图片展示,当我们在跳跃表中查询值 32 时,执行流程如下:
- 从最上层开始找,1 比 32 小,在当前层移动到下一个节点进行比较;
- 7 比 32 小,当前层移动下一个节点比较,由于下一个节点指向 Null,所以以 7 为目标,移动到下一层继续向后比较;
- 18 小于 32,继续向后移动查找,对比 77 大于 32,以 18 为目标,移动到下一层继续向后比较;
推荐阅读
- 刘备有诸葛亮和五虎上将为啥会输,刘备的五虎上将是哪五虎
- 深入解析什么是磁盘阵列技术?常用的磁盘阵列有哪几种?
- 抓包工具fiddler都有哪些高级功能,一文带你全面了解它
- 普洱茶有什么功效,云南普洱茶有什么功效
- 莲子心茶什么人不能喝,哪些人不能喝莲子心茶
- 人工智能神经网络中的基础概念有哪些?
- Java虚拟机 - JVM是什么?
- 朱瞻基和朱元璋谁厉害,朱瞻基有什么功绩
- 韩信的成语典故是什么,韩信有关的成语有几个
- 女性喝桂花茶的好处,喝桂花茶的好处主要有哪些