写点什么

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

作者:武子康
  • 2025-07-14
    美国
  • 本文字数:2557 字

    阅读完需:约 8 分钟

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

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

🚀 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) 1127.0.0.1:6379> setnx name wzk-2 # 值存在则无法设置(integer) 0127.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) 6127.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) 7127.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) 3127.0.0.1:6379> zcard hit(integer) 3127.0.0.1:6379> zscore hit item3 "30"127.0.0.1:6379> zrevrange hit 0 -1 # 遍历zset1) "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对象OK127.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> 
复制代码


发布于: 刚刚阅读数: 4
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-40 Redis 类型集合 string list set zsorted hash 详解_Java_武子康_InfoQ写作社区