Redis常用的五大数据类型(列表List,集合set)

简介

List 的特点:单键多值。底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

常用命令

  • lpush/rpush <key> <value1> <value2> <value3> ... 指令从左边 / 右边插入一个或多个值,左右也就是首尾
  • lrange <key> <start> <stop> 指令按照索引下标获得元素(从左到右,先进后出)
  • lrange <key> 0 -1 指令如果 start 是 0,stop 是 -1,代表获取所有元素
bash 复制代码
127.0.0.1:6379> lpush k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> lrange k1 0 -1 
1) "v3"
2) "v2"
3) "v1"

127.0.0.1:6379> rpush k2 v1 v2 v3 
(integer) 3
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> 
  • lpop/rpop <key> 指令从左边 / 右边吐出一个值。吐出后该值就不存在 key 中
bash 复制代码
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> lpop k2
"v1"
127.0.0.1:6379> lrange k2 0 -1
1) "v2"
2) "v3"
127.0.0.1:6379> rpop k2
"v3"
127.0.0.1:6379> lrange k2 0 -1
1) "v2"
  • lindex <key> <index> 指令按照索引下标获得元素(从左到右)(-1 代表最后一个,0 代表是第一个)
bash 复制代码
127.0.0.1:6379> lpush name feng rong xu
(integer) 3
127.0.0.1:6379> lpush second xustudyxu
(integer) 1
127.0.0.1:6379> rpoplpush name second
"feng"
127.0.0.1:6379> lrange name 0 -1
1) "xu"
2) "rong"
127.0.0.1:6379> lrange second 0 -1
1) "feng"
2) "xustudyxu"
  • lindex <key> <index> 指令按照索引下标获得元素(从左到右)(-1 代表最后一个,0 代表是第一个)
bash 复制代码
127.0.0.1:6379> lindex name 0 
"xu"
  • llen <key> 指令获得列表长度
bash 复制代码
127.0.0.1:6379> llen name
(integer) 2
  • linsert <key> before/after <value> <newValue> 指令在元素某个值的前面 / 后面插入新值,如果 value 有多个,则插入最前面的那个
bash 复制代码
127.0.0.1:6379> lrange name 0 -1
1) "xu"
2) "rong"

127.0.0.1:6379> linsert name before rong  Rong
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "xu"
2) "Rong"
3) "rong"
127.0.0.1:6379> linsert name after  rong  test1
(integer) 4
127.0.0.1:6379> lrange name 0 -1
1) "xu"
2) "Rong"
3) "rong"
4) "test1"
  • lrem <key> <n> <value> 指令从左边删除 n 个 value(从左到右),如果有多个一样的 lement,则删除列表最前面的的
bash 复制代码
127.0.0.1:6379> lpush name rong rong rong
(integer) 7
127.0.0.1:6379> lrange name 0 -1
1) "rong"
2) "rong"
3) "rong"
4) "xu"
5) "Rong"
6) "rong"
7) "test1"
127.0.0.1:6379> lrem name 2 rong 
(integer) 2
127.0.0.1:6379> lrange name 0 -1
1) "rong"
2) "xu"
3) "Rong"
4) "rong"
5) "test1"
  • lset <key> <index> <value> 指令将列表 key 下标为 index 的值替换成 value
bash 复制代码
127.0.0.1:6379> lrange name 0 -1
1) "rong"
2) "xu"
3) "Rong"
4) "rong"
5) "test1"
127.0.0.1:6379> lrange name 0 -1
1) "rong"
2) "xu"
3) "Rong"
4) "rong"
5) "test1"
127.0.0.1:6379> lset name 1 Rong
OK
127.0.0.1:6379> lrange name 0 -1
1) "rong"
2) "Rong"
3) "Rong"
4) "rong"
5) "test1"

数据结构

  • List的数据结构为快速链表quickList。
  • 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
  • 它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
  • 当数据量比较多的时候才会改成quicklist。
  • 因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next

集合Set

简介

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是 O(1)

一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变。

常用命令

  • sadd <key> <value1> <value2> ... 指令将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
bash 复制代码
127.0.0.1:6379> sadd k1 v1 v2 v3
(integer) 3
  • smembers <key> 指令取出该集合的所有值
bash 复制代码
127.0.0.1:6379> smembers k1
1) "v1"
2) "v2"
3) "v3"
  • sismember <key> <value> 指令判断集合是否为含有该值,有 1,没有 0
bash 复制代码
127.0.0.1:6379> sismember k1 v4
(integer) 0
127.0.0.1:6379> sismember k1 v3
(integer) 1
  • scard <key> 指令返回该集合的元素个数
bash 复制代码
127.0.0.1:6379> scard k1
(integer) 3
  • srem <key> <value1> <value2> ... 指令删除集合中的某个元素
bash 复制代码
127.0.0.1:6379> srem k1 v1 v2 
(integer) 2
127.0.0.1:6379> smembers k1
1) "v3"
  • spop <key> 指令随机从该集合中吐出一个值,key 里就没有该值了
bash 复制代码
127.0.0.1:6379> sadd k2 v1 v2 v3 v4
(integer) 4
127.0.0.1:6379> spop k2 
"v4"
127.0.0.1:6379> smembers k2 
1) "v1"
2) "v2"
3) "v3"
  • srandmember <key> <n> 指令随机从该集合中取出 n 个值。不会从集合中删除
bash 复制代码
127.0.0.1:6379> srandmember k2 2
1) "v1"
2) "v2"
127.0.0.1:6379> srandmember k2 2
1) "v1"
2) "v3"
  • smove <key1> <key2> <value> 指令把集合中一个值从一个集合移动到另一个集合,其中 key1 为要获取的集合,key2 为放入的集合
bash 复制代码
127.0.0.1:6379> sadd k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> sadd k2 v3 v4 v5
(integer) 3
127.0.0.1:6379> smove k1 k2 k3
(integer) 0
127.0.0.1:6379> smembers k1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> smembers k2
1) "v3"
2) "v4"
3) "v5"
  • sinter <key1> <key2> 指令返回两个集合的交集元素
bash 复制代码
127.0.0.1:6379> sadd k3 v4 v6 v7
(integer) 3
127.0.0.1:6379> sinter k2 k3
1) "v4"
  • sunion <key1> <key2> 指令返回两个集合的并集元素
bash 复制代码
127.0.0.1:6379> sunion k2 k3
1) "v3"
2) "v4"
3) "v5"
4) "v6"
5) "v7"
  • sdiff <key1> <key2> 指令返回两个集合的差集元素(key1 中的,不包含 key2 中的)
bash 复制代码
127.0.0.1:6379> sdiff k2 k3
1) "v3"
2) "v5"
相关推荐
剩下了什么10 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥10 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉10 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变10 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
山岚的运维笔记12 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
roman_日积跬步-终至千里13 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科13 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦13 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
indexsunny14 小时前
互联网大厂Java面试实战:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·微服务·kafka·spring security·电商
晚霞的不甘15 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d