Redis7学习——Redis的十大类型String、List、Hash、Set、Zset
目录
一、前言
二、基本命令
三、Redis字符串--String
基础读写命令
字符串修改与拼接命令
批量操作命令
其他特殊命令
SDS
应用
四、Redis列表--List
基本命令
阻塞操作命令
列表间操作
应用
五、Redis哈希(Hash)
基本命令
应用
六、Redis集合(Set)
基本命令
应用
七、Redis有序集合Zset
底层实现
基本命令
集合运算
其他操作
应用
一、前言
上篇文章中我们已经对Redis做了基本的认识,在本文中,我们来学习Redis的基本的十大数据类型。我们知道Redis是以 k-v键值对进行存储,本文我们需要注意的是 这里说的数据类型是 value 的数据类型,而key的类型都是字符串。
Redis的十大数据类型如下图所示
下来我们就依次对上图中的数据类型做介绍。
二、基本命令
在学习数据类型之前,先熟悉一下基本的命令,这些命令是所有的数据结构通用的。
注意:在Redis中,命令是不分大小写的,而key的值是区分大小写的。
keys * //当前库的所有key
exists key //判断某个key是否存在
type key //查看你的key是什么类型
del key //删除指定的key数据
unlink key //非阻塞删除,仅仅将keys从keyspace元数据中删除,没真正的删除会在后续异步中操作
ttl key // 查看还有多少秒过期 -1表示永不过期 -2 表示已过期
pttl key //以毫秒为单位返回key的剩余的过期时间
expire key 秒 // 给key设置过期时间
move key dbindex [0-15] // 将当前数据库的key移动到指定的数据库中 redis默认是有16个数据库的
select dbindex [0-15] // 切换数据库[0-15],默认为0
dbsize // 查看当前数据库key的数量
flushdb // 清空当前库,即删除当前数据库所有键(谨慎!生产环境禁止)
flushall // 清空16个数据库 慎用
keys pattern //查找所有匹配 pattern 的键(慎用!生产环境可能阻塞)如KEYS user:* → 匹配所有user:XXX 键
rename key //重命名键(若 newkey 存在则覆盖)
persist //移除键的过期时间(变为永久有效)
info //查看 Redis 服务器信息(内存/键数量/持久化等)如INFO memory → 查看内存使用情况
move key db //将当前数据库的key移动到给定的数据库db中
randomkey //从当前数据库中随机返回一个key
help @+数据类型 会出现命令提示 比如 help @string
三、Redis字符串--String
string是redis最基本最常用的类型,一个key对应一个value。
string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。即
- Key:字符串类型(如
user:name
、product:price
),需唯一。 - Value:不仅支持普通文本字符串(如
"hello world"
),还支持二进制数据(如图片、序列化对象)和数值(整数/浮点数,可进行自增/自减操作)。
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M。且所有 String 命令都是单线程原子执行,无需担心并发竞争问题。
以下是Redis关于String数据类型的一些命令
基础读写命令
set key value //设置键值对
get key //获取key对应的value
getrange key start end //返回key对应的字符串的子串,start 和 end 为索引,0 开头,-1 表示最后一个字符
getset key value //设置新值并返回旧值(原子操作,适合“获取旧值并更新”场景,如计数器重置)
演示如下
数值操作命令
incr key//键值自增 1(Value 必须为整数,否则报错)
incrby key increment//键值自增指定整数(increment 可正可负,负数即自减)
incrbyfloat key increment//键值自增指定浮点数(支持小数运算)
decr key//键值自减 1(Value 必须为整数,否则报错)
decrby key decrement//等价于 INCRBY key -decrement
演示如下
字符串修改与拼接命令
getbit key offset //获取二进制位(返回键值第 offset 位的值,0 或 1)
setbit key offset value // 操作二进制位(将键值视为二进制字符串,设置第 offset 位为 value,value 只能是 0 或 1)
bitcount key start end //统计二进制位中 1 的个数(可选 start 和 end 限制字节范围)
setrange key offset value //从指定索引 offset 开始,用 value 覆盖原键值的部分内容
append key value//追加字符串到键值末尾(若键不存在,等价于 SET key value)
strlen key //返回键值的字符串长度(字节数,非字符数,支持中文/二进制)
批量操作命令
mget key1 key2 ... //获取所有的(一个或者多个)key给定key值所对应的字符串
mset key value [key value ...] //同时设置一个或多个 key-value 对
msetnx key value [key value ...]//同时设置一个或多个 key-value 对,且仅当所有给定 key 都不存在。
其他特殊命令
setex key seconds value //将值 value 关联到 key,并将 key 的过期时间设为 seconds (以秒为单位)。等价于 SET key value EX seconds(原子操作,避免先 SET 再 EXPIRE 的非原子风险)
psetex key milliseconds value//这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
setnx key value //只有在 key 不存在时设置 key 的值。
单独介绍一下 SET 命令
SET key value [EX seconds] [PX milliseconds] [NX|XX]
这里解释一下后面方括号的可选参数
- EX 秒数:设置键的过期时间,以秒为单位
- PX 毫秒数:设置键的过期时间,以毫秒为单位
- NX:只在键不存在时设置键
- XX:只在键已经存在时设置键
SDS
C语言的字符串是char[]
实现的,而Redis使用SDS(simple dynamic string) 封装,sds源码如下:
struct sdshdr{ unsigned int len; // 标记buf的长度 unsigned int free; //标记buf中未使用的元素个数 char buf[]; // 存放元素的坑 }
应用
如我们平时点赞某个视频某个文章,点一个赞就加一次,可以使用 incr key 这个命令增加点赞数。然后再使用get key 获取到当前点赞数量。
四、Redis列表--List
该数据类型是单 key 对 多个value
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),列表(List)中的元素都是字符串形式存储的。这意味着当你向 Redis 列表中插入数据时,所有值都会以字符串的形式被存储,即使你尝试插入其他类型的数据(如整数、浮点数、JSON 对象等),这些数据也会被转换成其字符串表示形式进行存储。
它的底层实际是个双端链表,最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
基本命令
lpush key value [value...] //将一个或多个值插入到列表头部(左边)
rpush key value [value...] //将一个或多个值插入到列表尾部(右边)lrange key start stop //获取列表指定范围内的元素
lindex key index //通过索引获取列表中的元素
llen key //获取列表长度
lpop key //移除并获取列表的第一个元素
rpop key //移除并获取列表的最后一个元素
lrem key count value//移除列表中与value相等的元素,count > 0: 从表头开始向表尾搜索,移除与value相等的元素,数量为count
//count < 0: 从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值.count = 0: 移除表中所有与value相等的值lset key index value //通过索引设置列表元素的值
ltrim key start stop //对一个列表进行修剪,只保留指定区间内的元素
linsert key BEFORE|AFTER pivot value//用于在列表中某个已有值的前面或后面插入新值的命令
阻塞操作命令
blpop key [key ...] timeout //移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到超时或发现可弹出元素brpop key [key ...] timeout //移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到超时或发现可弹出元素
列表间操作
rpoplpush source destination//移除列表的最后一个元素,并将该元素添加到另一个列表并返回
brpoplpush source destination timeout //rpoplpush的阻塞版本
应用
- 公众号的订阅的消息
- 关注的人发布文章,就会到我的List lpush likearticle:id 文章id
- 查看自己订阅的文章 lrange likearticle:id 0 9
list应用场景参考以下:
- lpush+lpop=Stack(栈)
- lpush+rpop=Queue(队列)
- lpsh+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)
五、Redis哈希(Hash)
k-v 模式不变,但v是一个键值对 => Map<String,Map<Object,Object>
- 结构化存储:可以存储多个字段-值对,适合表示对象
- 高效访问:支持单独访问或修改某个字段,而不需要读取整个对象
- 内存优化:小哈希(字段较少)会使用特殊编码节省内存
- 原子操作:所有操作都是原子性的,适合并发环境
基本命令
hset key field value [filed value ...] //设置哈希表中一个或多个字段的值
hsetnx key field value //当字段不存在时才设置值
hget key field //获取哈希表中指定字段的值
hmget key field [field ...] //获取哈希表中多个指定字段的值
hgetall key //获取哈希表中所有字段和值
hkeys key //获取哈希表中所有字段名
hvals key //获取哈希表中所有字段值hexists key field //检查哈希表中指定字段是否存在
hlen key //获取哈希表中字段的数量
hincrby key field increment// 为哈希表中指定字段的整数值加上增量
hincrbyfloat key field increment //为哈希表中指定字段的浮点数值加上增量
hdel key field [field ...] //删除哈希表中一个或多个字段
hscan key cursor [MATCH pattern] [COUNT count] //增量式迭代哈希表中的键值对
当使用 HGET
命令从 Redis 中获取 name
字段的值时,返回的是一个看起来像编码后的字符串:"\xe7\x8e\x8b\xe4\xbax94"
。这是因为在 Redis 中存储和检索数据时,默认情况下是以字节形式处理的,并且当显示非 ASCII 字符时,Redis 客户端可能会将其转换为转义序列。看到的 \xe7\x8e\x8b\xe4\xbax94
实际上是 UTF-8 编码的中文字符“王五”的十六进制表示。
应用
- 用户资料存储,哈希非常适合用于存储用户资料信息,如用户的个人信息、联系方式等。
- 商品信息管理,在电子商务平台中,可以使用哈希来存储商品信息,包括价格、库存量、描述等。
六、Redis集合(Set)
单值多value,无重复
- 唯一性:集合中的元素都是唯一的,自动去重
- 无序性:元素没有固定的顺序
- 高效操作:支持O(1)时间复杂度的添加、删除和成员检查
- 集合运算:支持交集、并集、差集等数学集合操作
基本命令
sadd key member [member ...] //向集合添加一个或多个成员
srem key member [member ...] //移除集合中一个或多个成员
spop key [count] //随机移除并返回集合中一个或多个元素
smembers key //返回集合中的所有成员
scard key //获取集合的成员数
sismember key member //判断 member 是否是集合的成员
srandmember key [count] //随机返回集合中一个或多个元素(不删除)
sinter key [key ...] //返回多个集合的交集
sunion key [key ...] //返回多个集合的并集
sdiff key [key] //返回第一个集合与其他集合的差集
sinterstore destination key [key ...] // 计算多个集合的交集并存储到新集合
sunionstore destination key [key ...] //计算多个集合的并集并存储到新集合
sdiffstore destination key [key ...] //计算集合的差集并存储到新集合
smove source destination member //将 member 元素从 source 集合移动到 destination 集合
Redis集合因其唯一性和高效的集合运算特性,成为处理需要去重和关系计算的场景的理想选择。
应用
- 抽象小程序
- 将所有抽奖用户 sadd key 用户ID
- 显示多少人参加 SCARD key
- 从set中任意选取N个中奖人
- SRANDMEMBER key 2 随机抽奖两个人,元素不删除
- SPOP key 2 随机抽奖两个人,元素会删除
- 朋友圈点赞
- 新增点赞 SADD pub:msgID 点赞用户Id1 点赞用户Id2
- 取消点赞 SREM pub:msgID 点赞用户Id
- 展现所有点赞过的用户 SMEMBERS pub:msgID
- 点赞用户统计 SCARD pub:msgID
- 判断某个朋友是否对楼主点赞过 SISMEMBER pub:msgID 用户Id
- 可能认识的人
- 求两个人的差集 SDIFF user1 user2
七、Redis有序集合(Zset)
Zset和set的区别,就是在set的基础上加了一个score分数值。
- set k1 v1 v2 v3
- Zset k1 score1 v1 score2 v2
- 唯一性:集合中的元素(member)是唯一的
- 有序性:元素按分数(score)从小到大排序
- 高效性:支持O(logN)复杂度的插入、删除和范围查询
- 灵活性:分数可以是整数或双精度浮点数
底层实现
Redis有序集合使用两种编码方式:
- ziplist:当元素数量小于128个且所有元素长度小于64字节时使用
- skiplist(跳表)+ dict(字典):不满足ziplist条件时使用
基本命令
zadd key [NX|XX] [CH] [INCR] score member [score member ...] //添加或更新元素
//NX:仅添加新元素 XX:仅更新已存在元素 CH:返回被修改元素总数 INCR:对分数做递增操作zscore key member //获取元素的分数
zrank key member //获取元素升序排名(从0开始)
zrevrank key member //获取元素降序排名
zcard key //集合元素数量
zcount key main max //计算分数区间内的元素数量zrange key start stop [WITHSCORES] //按分数升序获取范围
zrevrange key start stop [WITHSCORES] //按分数降序获取范围zrangebyscore key min max [WITHSCORES] [LIMIT offset count]//按分数区间获取(升序)
zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]//按分数区间获取(升序)zrem key member [member...] //删除指定元素
zremrangebyrank key start stop //按排名区间删除
zremrangebyscore key min max //按分数区间删除
集合运算
zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]//计算多个有序集合的交集并存储
// WEIGHTS:乘法因子 AGGREGATE:聚合方式(默认SUM)zunionstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]//计算多个有序集合的并集并存储
其他操作
zincrby key increment member //增加元素的分数
zscan key cursor [MATCH pattern] [COUNT count]//增量迭代
应用
- 根据商品销售对商品进行排序显示
- 思路:定义商品销售排行榜(sorted set集合),key为goods:sellsort,分数为商品销售数量。
- 商品编号1001的销量是9,商品编号1002的销量是15
- zadd goods:sellsort 9 1001 15 1002
- 有一个客户又买了2件商品1001,商品编号1001销量加2
- zincrby goods:sellsort 2 1001
- 求商品销量前10名
- ZRANGE goods:sellsort 0 9 withscores
感谢阅读!