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"
相关推荐
独行soc2 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain20 分钟前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship21 分钟前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站25 分钟前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶27 分钟前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
梦想平凡2 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
TianyaOAO2 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
fpcc2 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
Ewen Seong2 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存
安全二次方security²3 小时前
SMMU软件指南SMMU编程之虚拟机结构和缓存
缓存·cache·smmu·arm安全架构·系统mmu·虚拟机结构·vms