尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

02-五大基础数据结构:String/List/Hash/Set/ZSet 实战用法

02-五大基础数据结构:String/List/Hash/Set/ZSet 实战用法 五大基础数据结构String/List/Hash/Set/ZSet 实战用法作者黒漂技术佬 | 系列Redis 缓存与高并发实战Redis 不是只能存字符串。它内置了五大数据结构涵盖了你日常开发 90% 的需求。本文逐一拆解每种都带代码示例和实际业务场景。一、String万金油什么都敢存String 是 Redis 最基础的类型但别被名字骗了——它不只能存hello还能存数字自动识别、JSON 字符串、甚至是二进制数据。常用命令SET key value[EX seconds]# 存可带过期时间GET key# 取INCR key# 原子1DECR key# 原子-1SETNX key value# key 不存在才设分布式锁核心MGET key1 key2# 批量取减少网络开销场景 1计数器无人售货柜每卖一单商品销量 1INCR product:cola:sales_today# 返回158INCR是原子操作——哪怕同时 100 个请求打过来也不会出现本来是 100加了两次变成 101的乌龙。这个特性来自单线程模型天然线程安全。场景 2缓存对象 JSON把 MySQL 查出来的商品信息序列化成 JSON 塞进 RedisSET product:1001{name:可乐,price:3.5,stock:20}EX3600下次有人查这个商品直接从 Redis 拿不用跨网络去 MySQL。3600 秒1 小时后自动过期保证数据不会一直脏下去。新手技巧EX参数别忘加不然 Key 永远不删内存早晚撑爆。二、List有序列表天生的消息队列List 是一个双向链表从左边或右边插入/弹出都是 O(1)。常用命令LPUSH queue msg1 msg2# 左边塞头部RPUSH queue msg3# 右边塞尾部LPOP queue# 左边弹RPOP queue# 右边弹LRANGE queue0-1# 查全部-1 表示最后一个LLEN queue# 长度场景消息队列工控系统中传感器每 100ms 上报一次温度数据后台逐个处理# 采集端塞数据RPUSH sensor:temp:queue{\time\:\14:00:01\,\value\:25.3}# 处理端取数据左进右出LPOP sensor:temp:queue不过 List 做消息队列有个硬伤没有确认机制。数据弹出就没了处理失败无法重试。这也是为什么 Redis 后来推出了 Stream后面文章会讲。另一场景最新消息列表无人售货柜的告警记录只保留最近 100 条LPUSH cabinet:3:alerts缺货:5号货道# 超过 100 条就截掉最旧的LTRIM cabinet:3:alerts099LTRIM是截断命令只保留指定范围的数据。配合LPUSH就能实现固定容量队列。新手提示LRANGE是 O(N) 操作数据量大时慎用完整遍历。List 不适合当全量查询工具。三、Hash字段-值映射小对象的归宿Hash 就是一个 Key 下面挂一组 field-value 对类似 Java 的 HashMap 或 Python 的 dict。常用命令HSET user:1001 name张三age28HGET user:1001 name# 取单个字段HGETALL user:1001# 取所有字段HINCRBY user:1001 login_count1# 数字字段1HDEL user:1001 age# 删字段场景商品信息缓存无人售货柜里的一个商品有多个属性HSET product:1001 name无糖可乐price4.0stock15sold_today23比存 JSON 字符串的好处是可以单独更新某个字段而不需要整体覆盖。缺货了只改stock不需要把整个 JSON 序列化再写回去。HINCRBY product:1001 stock-1# 卖一瓶库存减一为什么不用 String 存 JSON用 String 存 JSON 的话改一个字段就要整体覆盖多字段并发修改容易冲突。Hash 每个字段独立操作优雅得多。四、Set无序集合去重和交集的王者Set 是无序、不重复的字符串集合。底层是哈希表增删查全是 O(1)。常用命令SADD tags:article:1Redis数据库缓存SMEMBERS tags:article:1# 查所有成员SISMEMBER tags:article:1Redis# 判断是否存在SINTER tags:article:1 tags:article:2# 交集SUNION tags:article:1 tags:article:2# 并集SCARD tags:article:1# 成员数量场景 1商品标签每个售货柜商品打标签SADD product:1001:tags饮料碳酸冰镇用户筛选冰镇碳酸饮料时用SINTER取交集即可。场景 2共同购买两台售货柜的购买用户 ID 分别存 Set取交集就是两台都买过的用户SADD cabinet:1:users101102103104SADD cabinet:2:users102105106SINTER cabinet:1:users cabinet:2:users# 返回102这在做推荐算法时非常实用。五、ZSetSorted Set有序集合排行榜专用ZSet 和 Set 的区别是每个成员绑定一个score分数按 score 自动排序。常用命令ZADD leaderboard100玩家A150玩家B80玩家CZRANGE leaderboard0-1# 按分数升序ZREVRANGE leaderboard0-1WITHSCORES# 降序显示分数ZINCRBY leaderboard10玩家A# 给成员加分ZRANGEBYSCORE leaderboard100200# 按分数范围查ZRANK leaderboard玩家A# 查排名升序场景 1商品销量排行榜# 每卖一件销量1ZINCRBY sales_rank1可乐ZINCRBY sales_rank1可乐ZINCRBY sales_rank1雪碧# 看前三名ZREVRANGE sales_rank02WITHSCORES# 1) 可乐 2) 2# 3) 雪碧 4) 1场景 2延迟队列把任务的时间戳当 score到时去取# 5秒后执行的任务ZADD delay_queue1750000005task:send_sms:1001# 定时任务取出所有到期的任务score 当前时间戳ZRANGEBYSCORE delay_queue01750000005选型速查表需求选哪个原因简单缓存 / 计数器String最通用INCR 原子消息队列 / 列表展示List有序、可截断对象多字段频繁更新Hash单字段原子操作去重 / 交集并集SetO(1) 判断存在排行榜 / 按分数排序ZSet自动排序五种数据结构覆盖了缓存层 90% 以上的业务需求。记住它们的特性和常用命令后面的奇技淫巧BitMap、Geo、Stream都建立在这个基础之上。
返回列表