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完成的。

相关推荐
用户3169353811832 天前
Java连接Redis
redis
倔强的石头_2 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab3 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence3 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神3 天前
三、用户与权限管理
数据库·mysql
小小工匠4 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
何以解忧,唯有..4 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
麦聪聊数据4 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡4 天前
【MySQL数据库】数据类型与表约束
数据库·mysql