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

Redis 五大核心数据结构详解

一、String(字符串)

特点

  • 最简单的数据类型,可存储文本、整数、浮点数
  • 最大容量512MB
  • 支持原子性操作(如INCR)

应用场景

  • 缓存HTML片段
  • 计数器(文章阅读量)
  • 分布式锁(SETNX)

常用命令

# 增/改
SET user:1001 "Alice"          # 设置值
MSET user:1001:age 25 user:1001:city Beijing  # 批量设置
INCR article:1001:views         # 自增计数器

# 查
GET user:1001                   # 获取值
MGET user:1001:age user:1001:city # 批量获取
STRLEN user:1001                # 获取长度

# 删
DEL user:1001                   # 删除键

二、List(列表)

特点

  • 双向链表结构
  • 允许重复元素
  • 插入时间复杂度O(1),索引访问O(n)

应用场景

  • 消息队列(LPUSH+BRPOP)
  • 最新新闻排行(固定长度列表)
  • 记录用户操作日志

常用命令

# 增
LPUSH news:latest 1001          # 左插入
RPUSH user:1001:logs "login"    # 右追加
LINSERT news:latest BEFORE 1001 1000  # 指定位置插入

# 查
LRANGE news:latest 0 9          # 获取前10条
LINDEX user:1001:logs 0         # 获取指定索引元素
LLEN news:latest                # 获取长度

# 删
LPOP news:latest                # 左删除
LTRIM news:latest 0 99         # 保留最新100条

三、Hash(哈希表)

特点

  • 键值对集合
  • 适合存储对象
  • 单个Hash最多存储2^32-1个字段

应用场景

  • 用户信息存储
  • 商品属性存储
  • 配置信息管理

常用命令

# 增/改
HSET user:1001 name "Alice"     # 设置字段
HMSET product:1001 price 299 stock 50  # 批量设置

# 查
HGET user:1001 name             # 获取字段值
HMGET product:1001 price stock  # 批量获取
HGETALL user:1001               # 获取所有字段

# 删
HDEL user:1001 age              # 删除字段
DEL user:1001                   # 删除整个Hash

四、Set(集合)

特点

  • 无序唯一元素集合
  • 支持集合运算(交集/并集/差集)
  • 最大元素数量2^32-1

应用场景

  • 标签系统(文章标签)
  • 共同好友/关注
  • 抽奖白名单

常用命令

# 增
SADD article:1001:tags 科技 互联网  # 添加元素

# 查
SMEMBERS article:1001:tags      # 获取所有元素
SISMEMBER article:1001:tags 科技 # 判断元素存在
SCARD article:1001:tags         # 元素数量

# 删
SREM article:1001:tags 互联网    # 删除元素
SPOP lottery:users              # 随机删除并返回

# 集合运算
SINTER user:1001:friends user:1002:friends  # 共同好友

五、ZSet(有序集合)

特点

  • 元素关联score实现排序
  • 元素唯一但score可重复
  • 基于跳跃表+哈希表实现

应用场景

  • 实时排行榜
  • 延迟队列(时间戳排序)
  • 带权重的任务调度

常用命令

# 增/改
ZADD leaderboard 1500 "PlayerA"  # 添加元素
ZINCRBY leaderboard 300 "PlayerA" # 增加分数

# 查
ZRANGE leaderboard 0 9 WITHSCORES  # 前10名
ZREVRANK leaderboard "PlayerA"    # 获取逆序排名
ZCOUNT leaderboard 1000 2000      # 分数区间数量

# 删
ZREM leaderboard "PlayerB"        # 删除元素
ZREMRANGEBYRANK leaderboard 0 -11 # 保留前10名

数据结构对比

类型存储结构时间复杂度典型场景
String简单文本O(1) 读写缓存、计数器
List双向链表头尾操作O(1)队列、最新列表
Hash哈希表字段操作O(1)对象存储、配置管理
Set哈希表+数组元素操作O(1)标签、去重集合
ZSet跳表+哈希表插入O(logN)排行榜、优先级队列

最佳实践建议

  1. String优化

    • 超过10KB的值考虑压缩存储
    • 计数器使用INCR替代GET+SET
  2. List使用技巧

    • 限制列表长度预防内存溢出
    LTRIM chat:1001 0 999  # 保留最新1000条消息
    
  3. Hash内存优化

    • 使用HSCAN替代HGETALL遍历大Hash
    • 字段数控制在1000以内
  4. Set高级应用

    # 每日UV统计
    SADD uv:20231001 1001 1002
    PFCOUNT uv:20231001  # HyperLogLog优化
    
  5. ZSet性能优化

    • 分数使用整数提升比较效率
    • 定期清理过期数据
    ZREMRANGEBYSCORE delay_queue 0 $(date +%s)  # 清理已处理任务
    

http://www.kler.cn/a/568097.html

相关文章:

  • SSL域名证书怎么续期?
  • 最新版本SpringAI接入DeepSeek大模型,并集成Mybatis
  • 6-1 定时中断
  • 手写线程池
  • 一周一个Unity小游戏2D反弹球游戏 - 移动的弹板(鼠标版)
  • Java 9模块与Maven的深度结合
  • Deepseek 开源周第一天:FlashMLA
  • 2025年证券从业资格考试报名全流程图解✅
  • 期权帮|国内期权交易投资人做卖出期权价差交易收取的保证金是单边的还是双向的?
  • OpenWebUI配置异常的外部模型导致页面无法打开
  • C# 牵手DeepSeek:打造本地AI超能力
  • 杰发科技AC7801——滴答定时器获取时间戳
  • 2025春新生培训数据结构(树,图)
  • HTML 日常开发常用标签
  • RabbitMQ—保障消费者的可靠性和机制与策略
  • 【Vue教程】使用Vite快速搭建前端工程化项目 Vue3 Vite Node.js
  • 怎么写C#命令行参数程序,及控制台带参数案例(程序完整源码)下载
  • 【造个轮子】使用Golang实现简易令牌桶算法
  • 数据库测试
  • 蓝桥杯---归并排序算法题目(leetcode第912题)