企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
>[info] hash数据类型与结构 **hash类型介绍:** Redis hash数据结构 是一个键值对(key-value)集合,它是一个 string 类型的 field 和 value 的映射表,redis 本身就是一个key-value型数据库,因此hash数据结构相当于在value中又套了一层key-value型数据。所以 redis中hash数据结构特别适合存储关系型对象。比如用来存储学生基本信息,或者用户信息等。 ***** **Hmset 命令:** 用于同时将多个field-value (字段-值)对设置到哈希表中。假如hash表中已经存在field,则会对其 进行覆盖。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。 ``` 127.0.0.1:6379> hmset users id 1 username starsky age 18 sex 1 OK 127.0.0.1:6379> ``` ***** **Hmget 命令:** 用于返回hash表中field字段对应的值,如果field不存在,那么返回nil值。 ``` 127.0.0.1:6379> hmget users id username age 1) "1" 2) "starsky" 3) "18" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/48/83/4883d47e606a3b0025be69fe25dc3e4f_414x105.png) ***** **Hset 命令:** 对hash表中field对应的value进行赋值,如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操 作。 ``` 127.0.0.1:6379> hmget users id username age sex 1) "1" 2) "starsky" 3) "18" 4) "1" 127.0.0.1:6379> hset users age 30 (integer) 0 127.0.0.1:6379> hset users sex 0 (integer) 0 127.0.0.1:6379> hmget users id username age sex 1) "1" 2) "starsky" 3) "30" 4) "0" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/86/59/8659187ecaa56c64ec73266a71dd4dd8_493x299.png) ***** **Hvals 命令:** 用于返回哈希表所有field对应的值。 ``` 127.0.0.1:6379> hvals users 1) "1" 2) "starsky" 3) "30" 4) "0" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/0b/bb/0bbb866969622329372a0891e3c13edc_281x127.png) ***** **Hdel 命令:** 用于删除指定哈希表中的一个或多个field,不存在的field将被忽略。 ``` 127.0.0.1:6379> hdel users sex (integer) 1 127.0.0.1:6379> hvals users 1) "1" 2) "starsky" 3) "30" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/43/d0/43d049dd561454a3d58f3a83cdc96cf3_309x153.png) ***** **Hgetall 命令:** 用于返回哈希表中,所有的字段和值。 ``` 127.0.0.1:6379> hgetall users 1) "id" 2) "1" 3) "username" 4) "starsky" 5) "age" 6) "30" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/79/ea/79ea489e9e5b5949be70a8fa11f226f4_284x162.png) ***** >[info] 存储对象 hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。 ***** 在介绍string类型的应用场景时有所介绍,string + json也是存储对象的一种方式,那么存储对象时,到底用 string + json还是用hash呢? 两种存储方式的对比如下表所示: ![](https://img.kancloud.cn/31/42/31426f1c76a15125c5427d3cdefd3ea3_1115x379.png) ***** 当对象的某个属性需要频繁修改时,不适合用string+json,因为它不够灵活,每次修改都需要重新将整个对 象序列化并赋值,如果使用hash类型,则可以针对某个属性单独修改,没有序列化,也不需要修改整个对 象。比如,商品的价格、销量、关注数、评价数等可能经常发生变化的属性,就适合存储在hash类型里。 ***** 当然,不常变化的属性存储在hash类型里也没有问题,比如商品名称、商品描述、上市日期等。但是,当 对象的某个属性不是基本类型或字符串时,使用hash类型就必须手动进行复杂序列化,比如,商品的标签 是一个标签对象的列表,商品可领取的优惠券是一个优惠券对象的列表(如下图所示)等,即使以 coupons(优惠券)作为field,value想存储优惠券对象列表也还是要使用json来序列化,这样的话序列化工 作就太繁琐了,不如直接用string + json的方式存储商品信息来的简单。 ***** >[info] zset类型与结构(有序集合) redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性,但是不同的是,有序集 合给每个元素多设置了一个分数,利用该分数作为排序的依据。 ***** 有序集合可以利用分数进行从小到大的排序。虽然有序集合的成员是唯一的,但是分数(score)却可以重复。 就比如在一个班中,学生的学号是唯一的,但是每科成绩却是可以一样的,redis可以利用有序集合存储学 生成绩快速做成绩排名功能。 ***** **什么是跳表(skiplist dict)呢?** 二分查找法 ![](https://img.kancloud.cn/eb/65/eb654cf8658b32e6f8e487abc004dd64_1751x404.png) ![](https://img.kancloud.cn/4b/0a/4b0afacfb77a677b483a568e06262509_1706x385.png) ![](https://img.kancloud.cn/19/1e/191e83772b09552b0af8cdfc125e486f_1772x393.png) ***** **Zadd 命令:** 向一个有序集合中加入一个或者多个元素及其分数。假如加入的元素已经存在,那么更新这个成 员的分数值,然后进行重新插入,来定位自己的位置。如果key不存在,那么创建一个新的有序集合并进行 插入操作。 ``` 127.0.0.1:6379> zadd score 80 will 90 starsky 100 harry (integer) 3 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/50/b9/50b9870cf572fc49657d905a2c32fa41_519x96.png) ***** **Zcard 命令:** 用于计算有序集合中元素的数量。 ``` 127.0.0.1:6379> zcard score (integer) 3 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/d1/06/d106d1fab73cf5aefacba57c4f4f4eef_275x68.png) ***** **Zcount 命令:** 用于计算有序集合中指定分数区间的成员数量。 ``` 127.0.0.1:6379> zcount score 80 90 (integer) 2 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/5b/97/5b972e993d625297367d0783a667cbda_323x85.png) ***** **Zrange 命令:** 用于返回指定区间内的成员。其中成员的位置按分数值递增(从小到大)来排序。这里的下标参数都 是从0开始的,负数代表是从最后一个成员算起,-1表示最后一个成员。 ``` 127.0.0.1:6379> zrange score 0 -1 1) "will" 2) "starsky" 3) "harry" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/5a/df/5adf0af2fe33205c3028c28da208c5c5_335x109.png) ***** **Zrevrange 命令:** 用于返回指定分数区间内的成员。其中成员的位置按分数值递减(从大到小)来排序。 ``` 127.0.0.1:6379> zrevrange score 0 -1 1) "harry" 2) "starsky" 3) "will" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/2c/06/2c0654200bf95422b511c0f1632f6f62_350x105.png) ***** **Zrangebyscore 命令:** 回有序集合中指定分数区间的成员列表。其中集成员按分数值递增(从小到大)来排序。 ``` 127.0.0.1:6379> zrangebyscore score 80 90 1) "will" 2) "starsky" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/80/48/8048d79ebea7dcad6e9b4f6987fb756e_417x121.png) ***** **Zrank 命令:** 用于返回有序集中指定成员的排名。 ``` 127.0.0.1:6379> zrank score harry (integer) 2 127.0.0.1:6379> zrank score will (integer) 0 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/e5/94/e594b0022f33e942a1a0f6a033eaab39_359x110.png) ***** **Zrem 命令:** 用于移除有序集中的一个或多个成员,不存在的成员将被忽略。 ``` 127.0.0.1:6379> zrem score starsky (integer) 1 127.0.0.1:6379> zrange score 0 -1 1) "will" 2) "harry" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/50/89/50896d0acc4dca4f76d2981c22b43a99_325x125.png) ***** **Zremrangebyrank 命令:** 用于移除有序集中,指定排名(rank)区间内的所有成员。-1 最后一个 ``` 127.0.0.1:6379> zremrangebyrank score 0 0 (integer) 1 127.0.0.1:6379> zrange score 0 -1 1) "harry" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/f0/1b/f01ba61ff3288300f53fa554ce61883a_438x110.png) ***** **Zscore 命令:** 返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil ``` 127.0.0.1:6379> zscore score tony "95" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/01/4f/014f59b712dc066571f8ca3f7b666819_310x65.png) ***** **Zscan 命令:** 用于迭代有序集合中的元素(包括元素成员和元素分值)。 ``` 127.0.0.1:6379> zscan score 0 match tony 1) "0" 2) 1) "tony" 2) "95" 127.0.0.1:6379> ``` ![](https://img.kancloud.cn/b1/58/b158fd2a439920b8b1a036ef2a953196_388x137.png) ***** >[info] 字典 字典又称符号表,关联数组或者映射,是一种用于保存键值对的抽象数据结构。 字典中的每个键都是独一无二的,程序可以在字典中根据键值查找与之关联的值,或者通过键来更新值,删除等。 ***** **字典的结构属性:** ![](https://img.kancloud.cn/da/43/da4376afe0fbd35c87274a461b6dc26e_1255x755.png) ***** **字典中的hash表:** ![](https://img.kancloud.cn/05/22/0522d99a8dd89a6520f0d8ae9a95788a_1472x846.png) ***** **Hash表中的hash节点:** ![](https://img.kancloud.cn/51/da/51daee4a6add1895fe6025a73be035f7_1337x624.png) ***** **字典总体结构:**