当前位置: 首页 > news >正文

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:nameproduct: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>

  1. 结构化存储:可以存储多个字段-值对,适合表示对象
  2. 高效访问:支持单独访问或修改某个字段,而不需要读取整个对象
  3. 内存优化:小哈希(字段较少)会使用特殊编码节省内存
  4. 原子操作:所有操作都是原子性的,适合并发环境

基本命令

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 编码的中文字符“王五”的十六进制表示。

应用

  1. 用户资料存储,哈希非常适合用于存储用户资料信息,如用户的个人信息、联系方式等。
  2. 商品信息管理,在电子商务平台中,可以使用哈希来存储商品信息,包括价格、库存量、描述等。

六、Redis集合(Set)

单值多value,无重复

  1. 唯一性:集合中的元素都是唯一的,自动去重
  2. 无序性:元素没有固定的顺序
  3. 高效操作:支持O(1)时间复杂度的添加、删除和成员检查
  4. 集合运算:支持交集、并集、差集等数学集合操作

基本命令

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
  1. 唯一性:集合中的元素(member)是唯一的
  2. 有序性:元素按分数(score)从小到大排序
  3. 高效性:支持O(logN)复杂度的插入、删除和范围查询
  4. 灵活性:分数可以是整数或双精度浮点数

底层实现

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

感谢阅读!

http://www.dtcms.com/a/330361.html

相关文章:

  • 解决:Gazebo连接模型数据库失败
  • linux 内核 - 内存管理概念
  • Apifox精准定义复杂API参数结构(oneOf/anyOf/allOf)
  • aave v3 存款与借款利息的计算方式
  • 码上爬第七题【协程+参数加密+响应解密+格式化检测】
  • C#面试题及详细答案120道(11-20)-- 面向对象编程(OOP)
  • LeetCode Day5 -- 二叉树
  • 嵌入式学习(day26)frambuffer帧缓冲
  • 【系统安装】虚拟机中安装win10企业版系统记录
  • HarmonyOS 开发实战:搞定应用名字与图标更换,全流程可运行示例
  • 101、【OS】【Nuttx】【周边】文档构建渲染:reStructuredText 格式
  • 硬件工程师八月实战项目分享
  • AI抢饭碗,软件测试该何去何从?
  • 基于离散余弦变换的激活水印(DCT-AW)
  • 交错字符串-二维dp
  • 如何通过 Actor 网络压缩为概率分布实现
  • RK3568 Linux驱动学习——新字符设备驱动
  • 人工智能入门①:AI基础知识(上)
  • Vue3 vs Vue2:全面对比与面试宝典
  • 接口添加了 @Transactional 注解并开启事务,而其中一个小方法启动了新线程并手动提交数据,会有什么影响?
  • 红黑树的特性与实现
  • 打靶日常-文件上传
  • 【Python】新手入门:什么是python运算符?python运算符有哪些种类?运算符优先级是怎么样的?
  • Go语言函数详解:从基础到高阶的行为逻辑构建
  • C5.4:光电器件
  • RagFlow启动源码说明
  • Linux framebuffer 编程入门:直接操作显存画图
  • Flutter权限管理三步曲:检查、申请、处理全攻略
  • 【超算】算力的精度,数据中心的划分标准与行业现状(国家超级计算机,企业万卡GPU集群)
  • 深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构