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

Redis入门教程(一):基本数据类型

一、Redis是什么?为什么你需要它?

        Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。与传统的关系型数据库不同,Redis将数据存储在内存中,使其读写速度达到惊人的11万次读/秒和8.1万次写/秒。同时支持数据持久化,重启后数据不丢失,完美平衡了速度与可靠性。

Redis的五大核心优势:

  1. 丰富的数据结构:支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等18

  2. 原子性操作:所有操作要么完全执行要么完全不执行,特别适合高并发场景

  3. 持久化机制:支持RDB快照和AOF日志两种持久化方式,确保数据安全

  4. 发布/订阅功能:原生支持消息队列,轻松实现系统解耦

  5. 跨平台:支持Linux、Windows、macOS等主流操作系统

二、Redis的典型应用场景

  • 高速缓存:将MySQL热点数据缓存到Redis,提升网页加载速度

  • 会话存储:分布式系统中存储用户登录状态,解决Session共享问题

  • 实时排行榜:利用有序集合实现游戏积分实时排名

  • 消息队列:通过List的LPUSH/BRPOP实现任务队列

  • 社交关系:用集合(Set)存储好友列表,快速计算共同好友

三、数据类型详解

3.1 字符串(String):Redis 最基础的数据类型​

        字符串是 Redis 中最常用也最基础的数据类型,它能存储文本、数字甚至二进制数据,单个字符串的最大容量为 512MB。从底层实现来看,Redis 的字符串并非简单的 C 语言字符串,而是采用了简单动态字符串(SDS) 结构,这种结构不仅能高效支持字符串的拼接、截断等操作,还能避免缓冲区溢出问题。​

核心特性​

  • 可以存储文本、数字、二进制数据(如图片、序列化对象)​
  • 支持原子性的自增、自减操作​
  • 能设置过期时间,适合实现缓存功能​

常用命令​

  • SET key value [EX seconds] [PX milliseconds]
      设置键值对,可指定过期时间(EX 为秒,PX 为毫秒)。

          例如SET username "zhangsan" EX 3600表示设置username的值为zhangsan,1 小时后过期。​

  • GET key
    获取键对应的 value,若键不存在则返回nil。​
  • INCR key
    将键对应的数字值自增 1,若键不存在则先初始化为 0 再自增,返回结果为自增后的值。​
  • DECR key
    将键对应的数字值自减 1,用法与INCR类似。​
  • APPEND key value
    在原字符串后追加内容,返回追加后的总长度。例如APPEND message " world"会在message原 value 后加上 “world”。​
  • STRLEN key
    返回字符串的长度。​

应用场景​

  • 缓存热点数据:将数据库中频繁访问的数据缓存到 Redis 字符串中,如商品详情、用户信息等,设置合理的过期时间可减轻数据库压力。​
  • 计数器:利用INCR和DECR实现网站访问量统计、商品库存计数等功能,由于 Redis 操作的原子性,可避免并发问题。​
  • 分布式锁:通过SET key value NX EX seconds命令实现分布式锁,NX表示仅当键不存在时才设置成功,结合过期时间防止死锁。​
  • 会话存储:将用户登录后的会话信息序列化为字符串存储,实现分布式系统中的会话共享。

3.2 哈希(Hash):存储对象的理想选择​

        哈希类型类似于 Java 中的HashMap或 Python 中的字典,它允许一个键对应多个字段 - 值对,非常适合存储结构化数据。哈希类型的底层实现采用两种结构:当数据量较小时使用压缩列表(ziplist),当数据量增大后自动转换为哈希表(hashtable),这种动态调整机制保证了哈希类型的高效性。​

核心特性​

  • 一个哈希表最多可包含 2^32 - 1 个字段 - 值对​
  • 字段和值都是字符串类型​
  • 支持对单个字段进行操作,无需修改整个对象​

常用命令​

  • HSET key field value [field value ...]
    为哈希表设置一个或多个字段 - 值对,返回成功设置的字段数量。例如HSET user:100 name "zhangsan" age "25"为user:100哈希表设置name和age字段。​
  • HGET key field
    获取哈希表中指定字段的值。​
  • HMGET key field1 field2 ...
    获取哈希表中多个字段的值。​
  • HGETALL key
    返回哈希表中所有字段和值。​
  • HDEL key field1 field2 ...
    删除哈希表中的一个或多个字段,返回删除的字段数量。​
  • HKEYS key
    返回哈希表中所有字段名。​
  • HVALS key
    返回哈希表中所有字段值。​
  • HLEN key
    返回哈希表中字段的数量。​
  • HEXISTS key field
    判断哈希表中是否存在指定字段,存在返回 1,不存在返回 0。​

应用场景​

  • 存储对象数据:如用户信息(姓名、年龄、邮箱)、商品信息(名称、价格、库存)等结构化数据,相比使用多个字符串存储,哈希类型能更清晰地组织数据,减少键的数量。​
  • 用户属性管理:可方便地新增、修改或删除用户的单个属性,无需操作整个用户对象。​
  • 购物车实现:以用户 ID 为键,商品 ID 为字段,购买数量为值,实现购物车功能,通过HINCRBY可轻松修改商品数量。

3.3列表(List):有序集合的灵活实现​

        Redis 的列表是一种有序的字符串集合,允许元素重复,其底层实现采用双向链表或压缩列表(当数据量较小时)。列表支持在两端进行插入和删除操作,且操作时间复杂度为 O (1),这使得列表非常适合实现队列、栈等数据结构。​

核心特性​

  • 元素按插入顺序排序,可重复存储​
  • 支持从头部和尾部插入、删除元素​
  • 可通过索引获取或修改元素,但索引操作时间复杂度为 O (n)​

常用命令​

  • LPUSH key value1 [value2 ...]
    在列表头部插入一个或多个元素,返回插入后列表的长度。​
  • RPUSH key value1 [value2 ...]
    在列表尾部插入一个或多个元素,返回插入后列表的长度。​
  • LPOP key
    移除并返回列表的头部元素。​
  • RPOP key
    移除并返回列表的尾部元素。​
  • LRANGE key start stop
    返回列表中从start到stop索引范围内的元素(包含两端),索引从 0 开始,负数表示从尾部开始计数(如 - 1 表示最后一个元素)。例如LRANGE messages 0 9返回列表前 10 个元素。​
  • LLEN key
    返回列表的长度。​
  • LREM key count value
    从列表中删除count个值为value的元素,count为正数时从头部开始删除,为负数时从尾部开始删除。​
  • LSET key index value
    将列表中指定索引的元素设置为新值,若索引超出范围则返回错误。​

应用场景​

  • 消息队列:使用LPUSH和RPOP实现先进先出(FIFO)的消息队列,生产者通过LPUSH向列表头部添加消息,消费者通过RPOP从尾部获取消息。​
  • 栈结构:使用LPUSH和LPOP实现后进先出(LIFO)的栈结构。​
  • 最新消息展示:如社交平台的朋友圈动态、新闻网站的最新资讯,通过LPUSH添加新消息,LRANGE获取最新的 N 条消息。​
  • 排行榜:结合LTRIM命令可实现只保留最新的 N 条数据,例如LTRIM activities 0 99只保留列表中前 100 条活动记录。

 

3.5集合(Set):无序去重的集合类型​

        集合是 Redis 中的无序集合,它不允许元素重复,底层实现采用哈希表或整数集合(intset)(当元素都是整数且数量较少时)。集合支持丰富的集合运算,如交集、并集、差集等,这使得它在社交关系、标签系统等场景中非常有用。​

核心特性​

  • 元素无序且唯一,不允许重复​
  • 支持高效的添加、删除和查找操作(时间复杂度为 O (1))​
  • 提供强大的集合运算功能​

常用命令​

  • SADD key member1 [member2 ...]
    向集合中添加一个或多个元素,返回成功添加的元素数量(不包含已存在的元素)。例如SADD tags "java" "python" "redis"向tags集合添加三个标签。​
  • SMEMBERS key
    返回集合中所有元素。​
  • SISMEMBER key member
    判断元素是否为集合的成员,是返回 1,否返回 0。​
  • SREM key member1 [member2 ...]
    从集合中删除一个或多个元素,返回成功删除的元素数量。​
  • SCARD key
    返回集合的元素数量。​
  • SPOP key [count]
    随机从集合中删除并返回count个元素,默认返回 1 个。​
  • SRANDMEMBER key [count]
    随机返回集合中count个元素,不会删除元素。​
  • SINTER key1 key2 ...
    返回多个集合的交集。​
  • SUNION key1 key2 ...
    返回多个集合的并集。​
  • SDIFF key1 key2 ...
    返回多个集合的差集(存在于第一个集合但不存在于其他集合的元素)。​

应用场景​

  • 好友关系管理:存储用户的好友列表,通过SINTER计算两个用户的共同好友,SUNION合并多个好友列表。​
  • 标签系统:为文章、商品等添加标签,通过SADD添加标签,SMEMBERS获取所有标签,SINTER查找同时拥有多个标签的内容。​
  • 去重操作:利用集合元素的唯一性,对数据进行去重处理,如记录用户的浏览历史,避免重复记录。​
  • 抽奖系统:使用SPOP或SRANDMEMBER实现随机抽奖功能,SPOP会删除抽中的元素,SRANDMEMBER则不会。​

3.3有序集合(Sorted Set):带分数的有序集合​

        有序集合是 Redis 中最具特色的数据类型之一,它结合了集合和排序的特性,每个元素都关联一个分数(score),并按照分数从小到大排序。底层实现采用跳跃表(skiplist) 和哈希表,跳跃表保证了高效的排序和范围查询,哈希表则用于快速查找元素的分数。​

核心特性​

  • 元素唯一且有序,排序依据是元素的分数​
  • 支持按分数范围查询和排序​
  • 添加、删除和查找操作的时间复杂度为 O (logN)​

常用命令​

  • ZADD key score1 member1 [score2 member2 ...]
    向有序集合中添加一个或多个元素及其分数,返回成功添加的元素数量。例如ZADD ranking 95 "zhangsan" 88 "lisi" 92 "wangwu"向ranking有序集合添加三个用户及其分数。​
  • ZRANGE key start stop [WITHSCORES]
    返回有序集合中指定范围的元素,按分数从小到大排序,WITHSCORES选项可同时返回元素的分数。例如ZRANGE ranking 0 4 WITHSCORES返回排名前 5 的用户及其分数。​
  • ZREVRANGE key start stop [WITHSCORES]
    返回有序集合中指定范围的元素,按分数从大到小排序。​
  • ZSCORE key member
    返回元素在有序集合中的分数。​
  • ZINCRBY key increment member
    为有序集合中的元素增加分数,返回增加后的分数。例如ZINCRBY ranking 2 "zhangsan"将zhangsan的分数增加 2。​
  • ZCARD key
    返回有序集合的元素数量。​
  • ZCOUNT key min max
    返回分数在min到max范围内的元素数量。​
  • ZRANK key member
    返回元素按分数从小到大排序后的排名(从 0 开始)。​
  • ZREVRANK key member
    返回元素按分数从大到小排序后的排名(从 0 开始)。​

应用场景​

  • 排行榜系统:如游戏积分排名、考试成绩排名、商品销量排名等,通过ZADD添加或更新分数,ZREVRANGE获取排名靠前的用户。​
  • 带权重的消息队列:为消息设置分数作为优先级,消费者通过ZREVRANGE按优先级获取消息。​
  • 范围查询:如查询分数在 90 - 100 分之间的学生、价格在 100 - 500 元之间的商品等,使用ZCOUNT和ZRANGEBYSCORE实现。​
  • 时间序列数据:将时间戳作为分数,存储监控数据、日志时间等,可按时间范围查询数据。

 

命令速记表

数据类型写入命令读取命令删除命令
字符串SETGETDEL
哈希HSETHGETHDEL
列表LPUSHLRANGELPOP

总结 

        Redis凭借其毫秒级响应灵活的数据模型,已成为现代应用栈的核心组件。无论是缓解数据库压力,还是实现实时排行榜,亦或构建消息队列,它都能游刃有余。掌握Redis,就是为你的系统装上高性能引擎 。

学习资源扩展:

  • 官方文档:Docs

  • 命令大全:redis 命令手册

http://www.lryc.cn/news/595320.html

相关文章:

  • (LeetCode 每日一题) 1957. 删除字符使字符串变好 (字符串)
  • 17 BTLO 蓝队靶场 Pretium 解题记录
  • 【C++11】哈希表与无序容器:从概念到应用
  • 【Unity基础】Unity中2D和3D项目开发流程对比
  • 用户虚拟地址空间布局架构
  • git_guide
  • 【Git#6】多人协作 企业级开发模型
  • 【面经】实习经历
  • 深入理解 C++ 中的指针与自增表达式:*a++、(*a)++ 和 *++a 的区别解析
  • 破除扫描边界Photoneo MotionCam-3D Color 解锁动态世界新维度
  • 京东疯狂投资具身智能:众擎机器人+千寻智能+逐际动力 | AI早报
  • 2021 RoboCom 世界机器人开发者大赛-本科组(复赛)解题报告 | 珂学家
  • [硬件电路-64]:模拟器件 -二极管在稳压电路中的应用
  • 物流链上的智慧觉醒:Deepoc具身智能如何重塑搬运机器人的“空间思维”
  • 库卡气体保护焊机器人省气的方法
  • Java IO流体系详解:字节流、字符流与NIO/BIO对比及文件拷贝实践
  • 大模型高效适配:软提示调优 Prompt Tuning
  • 【Windows】多标签显示文件夹
  • PLC之间跨区域通讯!无线通讯方案全解析
  • SQL通用增删改查
  • Spring Cache 扩展:Redis 批量操作优化方案与 BatchCache 自定义实现
  • C++中的deque容器
  • vue3实现可视化大屏布局
  • 相机标定(非ROS相机)
  • hard_err错误
  • 【PTA数据结构 | C语言版】哥尼斯堡的“七桥问题”
  • 2000 兆瓦挖矿合作落地,GSP 2031 携 Whitebird 拓展全球合规算力版图
  • 【安全篇 / 反病毒】(7.6) ❀ 01. 查杀HTTPS加密网站病毒 ❀ FortiGate 防火墙
  • 服务器设置国外IP无法访问对防御攻击有用吗?
  • uni-api交互反馈组件(showToast)的用法