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

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.xdnf.cn/news/15942.html

相关文章:

  • k8s知识点
  • 3x3矩阵教程
  • 第十八节:第七部分:java高级:注解的应用场景:模拟junit框架
  • 如何用纯 HTML 文件实现 Vue.js 应用,并通过 CDN 引入 Element UI
  • Python 进阶(七):XML 基本操作
  • 【编程语言】C、C++、C#深度对比:三种语言的演进历程与应用场景
  • Java 大视界 -- 基于 Java 的大数据分布式计算在地球物理勘探数据处理与地质结构建模中的应用(356)
  • numpy库的基础知识
  • oracle 数据库中,将几张表的数据按指定日期范围实时同步至同一个数据库的备份表中。
  • CLIP与SIGLIP对比浅析
  • 小架构step系列21:参数和返回值的匹配
  • FastAPI 中,数据库模型(通常使用 SQLAlchemy 定义)和接口模型(使用 Pydantic 定义的 schemas)的差异
  • 【智能协同云图库】智能协同云图库第二期:基于腾讯云 COS 对象存储—开发图片各功能模块
  • SQLite以及Room框架的学习:用SQLite给新闻app加上更完善的登录注册功能
  • 蜂窝物联网模组市场新展望:中国企业继续保持最强竞争力
  • 进阶向:基于Python的电脑硬件监控工具(GUI + 系统信息采集)
  • 51c大模型~合集157
  • 138. Java 泛型 - 通配符捕获Helper程序方法:类型安全解决方案
  • 二维码扫描登录流程详解
  • 【设计模式】迭代器模式 (游标(Cursor)模式)
  • JavaEE初阶第十期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(八)
  • WinUI3开发_Frame用法
  • 服务器设置国外IP无法访问对防御攻击有用吗?
  • 一文详解REST风格
  • 一个适合MCU的分级菜单框架
  • .NET SDK 9.0.200引入对SLNX解决方案文件的支持
  • django filter按两个属性 去重
  • Linux——自制shell命令行解释器
  • 【LeetCode 热题 100】208. 实现 Trie (前缀树)
  • 剖析Sully.ai:革新医疗领域的AI助手功能启示