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

相关推荐
今天头发还在吗1 小时前
【Go】:mac 环境下GoFrame安装开发工具 gf-cli——gf_darwin_arm64
macos·golang·go·gf-cli
luckys.one4 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
言之。6 小时前
Django中的软删除
数据库·django·sqlite
是誰萆微了承諾7 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
阿里嘎多哈基米7 小时前
SQL 层面行转列
数据库·sql·状态模式·mapper·行转列
抠脚学代码7 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
jakeswang8 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
Heliotrope_Sun8 小时前
Redis
数据库·redis·缓存
一成码农8 小时前
MySQL问题7
数据库·mysql
吃饭最爱8 小时前
JUnit技术的核心和用法
数据库·oracle·sqlserver