大数据-40 Redis 类型集合 string list set zsorted hash 详解

61 阅读5分钟

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

AI炼丹日志-30-新发布【1T 万亿】参数量大模型!Kimi‑K2开源大模型解读与实践,持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年07月10日更新到: Java-68 深入浅出 分布式服务 Netty实现自定义RPC 附详细代码 MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

请添加图片描述

章节内容

上一节我们完成了:

  • Redis 源码下载
  • Redis 编译、安装
  • Redis 配置修改
  • Redis 服务启动

背景介绍

这里是三台公网云服务器,每台 2C4G,搭建一个大数据的学习环境,供我学习。

  • 2C4G 编号 h121
  • 2C4G 编号 h122
  • 2C2G 编号 h123

在这里插入图片描述

通用键空间命令(Key Commands)

  • EXISTS key:判断键是否存在,O(1),不存在即“冷缓存”或已过期
  • DEL key1 [key2…]:删除键,O(m)(m=键数),删除大集合会锁住线程,慎用
  • EXPIRE key 60 / TTL key:,设置 / 查询剩余 TTL,O(1),“写缓存时带 TTL” 基操
  • TYPE key:返回值类型,O(1),动态调试、监控
  • KEYS pattern:扫描匹配键,O(N),线上禁用;用 SCAN
  • SCAN cursor [MATCH p*] [COUNT 1000]:游标遍历键,O(N),运维巡检、热点排查
  • RENAME a b / RENAMENX a b:重命名键,O(1):原子替换热键

string 类型

常见操作

在这里插入图片描述

  • `SET key “v” [EX 60:PX 60000] [NX,GET key / MGET k1 k2
  • 获取单个 / 多个:INCR key / INCRBY key 5 / INCRBYFLOAT key 0.1,原子计数器、限流
  • SETBIT key offset 1 / GETBIT / BITCOUNT:Bitmap 布隆位图,APPEND key "tail" / STRLEN key
  • 日志拼接、长度统计:GETSET key new,原子读取旧值并替换;实现“分布式锁超时”常用

高频使用的场景:

  • 网站 PV/UV 计数、接口 QPS 令牌桶
  • 分布式唯一 ID(Lua + INCR)
  • 简单缓存(带 EX)

应用场景

  • key和value是字符串
  • 普通的赋值
  • incr 用于乐观锁(incr递增数字)
  • setnx 用于分布式锁(当value不存在时赋值)

比如使用 setnx:

root@h121:/usr/redis/bin# ./redis-cli

127.0.0.1:6379> setnx name wzk # 设置值
(integer) 1
127.0.0.1:6379> setnx name wzk-2 # 值存在则无法设置
(integer) 0
127.0.0.1:6379> get name # 还是刚才的
"wzk"
127.0.0.1:6379> 

执行结果如下图: 在这里插入图片描述

list类型

list列表可以存储有序、可重复的元素,获取头部或者尾部附近的记录是最快的。 双向链表。头尾极快,随机索引/删除成本随长度线性。主流做 消息队列、时间线。

常见操作

表1 在这里插入图片描述 表2 在这里插入图片描述

  • LPUSH queue v1 v2 / RPUSH:左 / 右入队
  • LPOP queue / RPOP:出队
  • BLPOP queue 5:阻塞弹出;可做“消费者端拉”
  • LRANGE queue 0 9:分页拉取
  • LTRIM queue 0 99:维持有限长度(环形日志)
  • LMOVE q1 q2 LEFT RIGHT:原子转移元素

PS:长列表 LRANGE 0 -1 会堵塞线程;改用 分页 或 Stream。

应用场景

可以作为栈或者队列使用,列表有序。 可以用做各种表:比如用户表、商品表等:

127.0.0.1:6379> lpush list 1 2 3 9 4 5 # 生成列表
(integer) 6
127.0.0.1:6379> lrange list 1 10 # 遍历列表
1) "4"
2) "9"
3) "3"
4) "2"
5) "1"

127.0.0.1:6379> lpop list # 从左边取一个
"5"
127.0.0.1:6379> lpop list
"4"
127.0.0.1:6379> lpop list
"9"
127.0.0.1:6379> 

set 类型

Set:无序、唯一 无序、去重,底层整数集合/哈希表自动切换。

常见操作

在这里插入图片描述

  • SADD tag:redis u1 u2:添加成员
  • SMEMBERS tag:redis:全量取出
  • SISMEMBER tag:redis u1:判断成员
  • SRANDMEMBER key [count] / SPOP:随机抽样 / 弹出
  • SUNION / SINTER / SDIFF:并集、交集、差集(批量写到 …STORE)
  • SSCAN:分批遍历

场景有:好友列表、去重集合、抽奖摇号。

应用场景

适用于不能够重复且不需要顺序的场景 比如:关注的用户列表,进行随机抽奖

127.0.0.1:6379> sadd set:1 a b c d e f g # 写入set
(integer) 7
127.0.0.1:6379> smembers set:1 # 查看set中的值
1) "c"
2) "b"
3) "d"
4) "f"
5) "a"
6) "g"
7) "e"
127.0.0.1:6379> srandmember set:1 # 随机一个set中的值
"d"
127.0.0.1:6379> srandmember set:1
"e"
127.0.0.1:6379> srandmember set:1
"b"
127.0.0.1:6379> srandmember set:1
"e"
127.0.0.1:6379> srandmember set:1
"f"
127.0.0.1:6379> 

sortedset (zset)类型

SortedSet(ZSet)有序集合:元素本身是无序不重复的,每个元素关联一个分数,可按分数排序,分数可重复。 value+score。既能排名,又能按分数检索。

常见操作

表1 在这里插入图片描述 表2 在这里插入图片描述

  • ZRANGE rank 0 9 WITHSCORES / ZREVRANGE:正 / 逆序排行
  • ZRANGEBYSCORE rank 80 100:分数区间检索
  • ZINCRBY rank 5 user1:增量更新分数
  • ZREM rank user1 / ZREMRANGEBYRANK rank 0 9:删成员 / 删区间
  • ZCOUNT rank 80 100:区间计数
  • ZSCAN:游标遍历大排行榜

场景有:积分榜、实时热搜、延时队列(score=时间戳)。

应用场景

可以按照分数值排序,适用于各种排行榜。 比如:点击排行榜、销量排行榜、关注排行榜等等

127.0.0.1:6379> zadd hit 100 item1 20 item2 30 item3 # zset
(integer) 3
127.0.0.1:6379> zcard hit
(integer) 3
127.0.0.1:6379> zscore hit item3 
"30"
127.0.0.1:6379> zrevrange hit 0 -1 # 遍历zset
1) "item1"
2) "item3"
3) "item2"
127.0.0.1:6379> 

hash类型

Redis Hash 是一个 string 类型的 field 和 value 的映射表,它提供字段和字段值的映射。 适合存储 同一主键下多字段,如用户资料。单字段 ≤ 4 KB 且字段数不宜过大(万级别以上会退化)。 在这里插入图片描述

常见操作

在这里插入图片描述

  • HSET u:1001 name "康康" age 27:批量写;>= 4.x HMSET 已弃用
  • HGET u:1001 name / HGETALL u:1001:取字段 / 取整条
  • HINCRBY u:1001 points 10:增量积分
  • HEXISTS HLEN HDEL:字段存在、字段数、删字段
  • HRANDFIELD key [count WITHVALUES]:随机字段抽样;做广告轮播

应用场景

对象的存储,表数据的映射

127.0.0.1:6379> hmset user01 name wzk age 18 password 123 # hash对象
OK
127.0.0.1:6379> hgetall user01 # 取出对象中的内容
1) "name"
2) "wzk"
3) "age"
4) "18"
5) "password"
6) "123"
127.0.0.1:6379> hget user01 name # 获取对象的名字
"wzk"
127.0.0.1:6379>