Redis数据库与GO(二):list,set

一、list(列表)

list(列表)是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。List本质是个链表,

list是一个双向链表 ,其元素是有序的,元素的值可以重复 。假设头在左边,尾在右边,则list支持从头插入,从尾插入,从头删除,从尾删除,但遍历只支持从头遍历,即从左遍历 。从头插入,从尾插入的算法和链表的头插法,尾插法一样。list的结构如下图:

在图中,c,b,a是从左边插入的,插入顺序为a,b,c,而d,e是从右边插入的,插入顺序为d,e,但无论从哪边插入,连接方向总是从左到右,遍历方向也是从左到右

理解了list的结构,理解其操作就容易多了,如下表。

命令 介绍
LPUSH key value [value ...] 向列表的左侧(头部)插入一个或多个值。如果 key 不存在,则会创建一个空列表再执行插入操作。返回列表的长度。
RPUSH key value [value ...] 向列表的右侧(尾部)插入一个或多个值。如果 key 不存在,则会创建一个空列表再执行插入操作。返回列表的长度。
LRANGE key start stop 获取列表指定范围内的元素,startstop 为索引(从 0 开始)。可以使用负索引来表示倒数位置(例如,-1 表示列表的最后一个元素)。
LPOP key 移除并返回列表的第一个元素(最左侧)。如果列表为空则返回 nil
RPOP key 移除并返回列表的最后一个元素(最右侧)。如果列表为空则返回 nil
LLEN key 返回列表的长度。如果 key 不存在,返回 0。如果 key 对应的不是列表类型,会返回错误。
DEL key 删除指定的列表或其他类型的 key 及其所有值。成功删除返回 1,如果 key 不存在则返回 0

实例

sql 复制代码
127.0.0.1:6379> lpush herolist aaa bbb ccc
(integer) 3
127.0.0.1:6379> lrange herolist 0 -1
1) "ccc"
2) "bbb"
3) "aaa"
127.0.0.1:6379> rpush herolist ddd eee
(integer) 5
127.0.0.1:6379> lrange herolist 0 -1
1) "ccc"
2) "bbb"
3) "aaa"
4) "ddd"
5) "eee"
127.0.0.1:6379> lpop herolist
"ccc"
127.0.0.1:6379> lrange herolist 0 -1
1) "bbb"
2) "aaa"
3) "ddd"
4) "eee"
127.0.0.1:6379> rpop herolist
"eee"
127.0.0.1:6379> lrange herolist 0 -1
1) "bbb"
2) "aaa"
3) "ddd"
127.0.0.1:6379> del herolist
(integer) 1
127.0.0.1:6379> lrange herolist 0 -1
(empty list or set)
127.0.0.1:6379> llen herolist
(integer) 0
127.0.0.1:6379> lpush herolist aa bb cc dd
(integer) 4
127.0.0.1:6379> llen herolist
(integer) 4

练习

用list存放中国四大名著并完成CRUD

参考答案

sql 复制代码
127.0.0.1:6379> lpush books hlm sgyy xyj shz
(integer) 4
127.0.0.1:6379> lrange books 0 -1
1) "shz"
2) "xyj"
3) "sgyy"
4) "hlm"
127.0.0.1:6379> lset books 1 xyj2
OK
127.0.0.1:6379> lrange books 0 -1
1) "shz"
2) "xyj2"
3) "sgyy"
4) "hlm"
127.0.0.1:6379> lrem books 1 sgyy
(integer) 1
127.0.0.1:6379> lrange books 0 -1
1) "shz"
2) "xyj2"
3) "hlm"

其中lset key index value从0开始,lrem key count value的count是指定要删除几次匹配到的元素value,1表示删除首次匹配到的value;0表示删除所有value;-1表示从列表的右侧开始删除,删除首次匹配到的value。

二、set(集合)

Set是string类型的无序集合。底层是HashTable数据结构,Set也是存放很多字符串元素,字符串元素是无序的,而且元素的值不能重复

命令 介绍
SADD key member [member ...] 将一个或多个成员添加到集合中。如果成员已经存在则忽略。如果 key 不存在,会创建一个新的集合。返回成功添加的成员数量。
SMEMBERS key 返回集合中的所有成员。如果 key 不存在,则返回空集合。
SISMEMBER key member 判断指定的成员是否在集合中。如果存在则返回 1,否则返回 0
SREM key member [member ...] 移除集合中的一个或多个成员,返回成功移除的成员数量。如果成员不存在,则忽略。

实例

sql 复制代码
127.0.0.1:6379> sadd emails tom@sohu.com jack@qq.com
(integer) 2
127.0.0.1:6379> smembers emails
1) "jack@qq.com"
2) "tom@sohu.com"
127.0.0.1:6379> sadd emails kk@yy.com yy@sohu.com
(integer) 2
127.0.0.1:6379> smembers emails
1) "yy@sohu.com"
2) "kk@yy.com"
3) "jack@qq.com"
4) "tom@sohu.com"
127.0.0.1:6379> sadd emails kk@yy.com yy@sohu.com
(integer) 0
127.0.0.1:6379> sismember emails tom@sohu.com
(integer) 1
127.0.0.1:6379> sismember emails tom@sohu1.com
(integer) 0
127.0.0.1:6379> srem emails tom@sohu.com
(integer) 1
127.0.0.1:6379> smembers emails
1) "jack@qq.com"
2) "yy@sohu.com"
3) "kk@yy.com"

练习

用set存放一个商品的名字,价格,生产日期

参考答案

sql 复制代码
127.0.0.1:6379> sadd product name price date
(integer) 3
127.0.0.1:6379> smembers product
1) "price"
2) "name"
3) "date"
127.0.0.1:6379> sismember product name
(integer) 1
127.0.0.1:6379> srem product name
(integer) 1
127.0.0.1:6379> smembers product
1) "price"
2) "date"
127.0.0.1:6379> sadd product name02
(integer) 1
127.0.0.1:6379> smembers product
1) "price"
2) "name02"
3) "date"

其中修改操作是通过sadd+srem完成的。

相关推荐
Dnui_King16 分钟前
Oracle SQL语句没有过滤条件,究竟是否会走索引??
数据库·sql·oracle
bug菌¹19 分钟前
滚雪球学Oracle[3.4讲]:事务控制与锁管理
数据库·oracle·事务·事务控制·锁管理
数据最前线29 分钟前
从DBA是“擦车的”谈起
数据库·dba
Wang's Blog44 分钟前
Redis: 集群测试和集群原理
数据库·redis
bin91531 小时前
【EXCEL数据处理】000011 案列 EXCEL带有三角形图标的单元格转换,和文本日期格式转换。
大数据·数据库·信息可视化·数据挖掘·数据分析·excel·数据可视化
彭于晏6892 小时前
Android数据存储
android·数据库
Data 3172 小时前
Hive数仓操作(四)
大数据·数据库·数据仓库·hive·hadoop
wangyue42 小时前
MYSQL 乐观锁
数据库·mysql
踩着阴暗的自己向上爬2 小时前
Day01-postgresql数据库基础入门培训
数据库·postgresql
Wang's Blog3 小时前
Redis: 集群架构,优缺点和数据分区方式和算法
数据库·redis·架构