Redis 入门:写给编程菜鸟的介绍 – wiki基地


Redis 入门:写给编程菜鸟的介绍

嘿,你好!欢迎来到编程的世界。当你开始学习写代码,创建网站或者开发应用程序时,很快就会接触到“数据存储”这个话题。我们写出来的程序,最终都是要处理数据的:用户的名字、商品的库存、帖子的内容、游戏的分数……这些数据都需要一个地方来“记住”它们,以便下次还能找到。

你可能已经听说过“数据库”这个词了,比如 MySQL、PostgreSQL、SQL Server,它们就像一个巨大的表格系统,能把数据整理得井井有条。它们很强大,但有时候,对于某些特定场景,我们需要一种更快、更灵活、更专门的工具。

今天,我们要介绍的就是这样一个非常受欢迎的工具:Redis

别担心,即使你刚刚接触编程,甚至对“数据库”的概念还不太清晰,这篇文章也会尽量用最简单的方式,一步一步带你认识 Redis 是什么,它有什么特别之处,以及它能帮助我们解决什么问题。

所以,准备好了吗?让我们一起揭开 Redis 的面纱吧!

1. Redis 是什么?简单来说

想象一下,你有很多重要的信息需要快速存取。传统的数据库就像是一个巨大的、需要翻阅的图书馆,虽然信息很全,但找起来可能需要一些时间。

而 Redis 更像是一个超级快速的、放在你手边的便签贴或者一个整洁的工具箱

  • 超级快速: 因为它主要把数据放在计算机的内存里(内存比硬盘快得多得多!)。
  • 放在手边: 你不需要像操作复杂数据库那样写长长的查询语句,它的操作非常简单直观。
  • 整洁的工具箱: 它不像传统数据库那样只有一种“表格”结构,而是提供了多种“数据类型”,就像工具箱里有锤子、螺丝刀、钳子一样,每种工具都擅长处理特定类型的问题。

官方一点的说法是:Redis 是一个开源的、基于内存的、键值对数据结构存储系统。

这听起来有点拗口,让我们把这句话拆开来理解:

  • 开源的: 意味着所有人都可以免费使用、学习和改进它。
  • 基于内存的 (In-Memory): 这是 Redis 最大的特点之一。数据主要存储在计算机的内存中,而不是硬盘上。这就解释了它为什么这么快!当然,它也有机制把数据保存到硬盘上,防止断电丢失,但这主要是为了持久化,读写操作主要是在内存中进行。
  • 键值对 (Key-Value): 这是 Redis 最基本的数据组织方式。就像字典一样,你通过一个“键”(Key)来找到对应的“值”(Value)。比如,键是 "user:1:name",值可能是 "张三";键是 "product:101:price",值可能是 "99.5"。非常简单直接!
  • 数据结构存储系统: 这强调了 Redis 不仅仅存储简单的文本或数字,它支持存储多种更复杂的数据结构,这是它比很多其他简单的键值对存储工具更强大的地方。

2. Redis 为什么这么快?

正如前面提到的,快是 Redis 最引以为傲的特点。主要原因有几个:

  • 内存是王道: 读写内存的速度比读写硬盘的速度快了几个数量级。想象一下你是在书桌上找东西(内存),还是要去仓库翻箱倒柜(硬盘)。
  • 简单的数据模型: 键值对模型查找起来非常直接,不像关系型数据库可能需要复杂的表连接查询。
  • 单线程模型(大部分): 虽然听起来反直觉,但 Redis 的核心操作是单线程的。这意味着它在处理每个命令时,不需要进行复杂的线程切换和同步,避免了多线程带来的额外开销和潜在的锁问题。因为它的操作是在内存中进行的,CPU 不是瓶颈,主要的耗时在于网络传输,单线程已经足够快来处理绝大多数请求了。当然,对于一些耗时长的操作,Redis 也有办法在后台或借助多线程来处理,但核心的读写是单线程的。
  • 优化的数据结构: Redis 内部使用了高度优化的数据结构(比如跳跃表、压缩列表等),使得对这些数据结构的常见操作(如查找、插入、删除)非常高效。

因为快,Redis 经常被用来处理那些对速度要求非常高的场景。

3. 键值对:Redis 的地基

就像你家里的地址是用来找到你家一样,Redis 中的“键”(Key)就是用来找到数据的“地址”。每个键都是唯一的。

  • 键 (Key): 通常是一个字符串,用来命名你要存储的数据。比如 "username""product:123:stock""blog:post:5:title"。好的键名应该能让你一看就知道这个键对应的是什么数据。建议使用冒号 : 来分隔不同的部分,形成层级结构,这样更清晰。
  • 值 (Value): 这是真正存储的数据内容。但请注意,Redis 的值不像传统数据库那样只能是简单的数字或字符串。Redis 的值可以是前面提到的那些“数据结构”。

Redis 的基本操作就像在字典里查词:

  • SET key value: 把某个键和值“存”起来。
  • GET key: 根据键把对应的值“取”出来。
  • DEL key: 把某个键和对应的值“删”掉。

是不是很简单?这就是 Redis 最核心的存取方式。

4. Redis 的“工具箱”:丰富的数据类型

光有键值对还不够,Redis 的强大之处在于它支持多种不同类型的值。这些不同的数据结构让 Redis 能更高效地解决不同类型的问题。

想象一下,你要整理你的书架:
* 简单的书名(字符串)
* 一堆待读的书清单(列表,有顺序)
* 你收集的邮票(集合,每张独一无二,没有顺序)
* 你朋友的电话本(哈希,每个人有名字、电话、地址等多个信息)
* 一个游戏排行榜(有序集合,每个人有分数,按分数高低排序)

Redis 就提供了对应这些场景的数据类型:

4.1 字符串 (Strings)

这是最简单、也是最常用的数据类型。一个键对应一个字符串值。这个字符串可以是普通文本、数字、甚至是一张图片的二进制数据。

  • 就像: 一个便签贴,上面写着一句话或一个数字。
  • 典型用途: 缓存网页内容、存储用户的会话信息、记录某个计数器的值等。
  • 常用命令:
    • SET key value: 设置键的值。
      redis
      SET name "zhangsan"
      SET age "30"
      SET visits "100"
    • GET key: 获取键的值。
      redis
      GET name -> "zhangsan"
      GET age -> "30"
      GET visits -> "100"
    • DEL key: 删除键。
      redis
      DEL name
    • INCR key: 将键的值(必须是数字字符串)增加 1。非常适合做计数器。
      redis
      SET counter "0"
      INCR counter -> 1
      INCR counter -> 2
      GET counter -> "2"
    • DECR key: 将键的值减少 1。
    • INCRBY key increment: 将键的值增加指定的数量。
    • APPEND key value: 将值追加到现有字符串的末尾。

4.2 列表 (Lists)

列表是一个有序的、可以重复元素的集合。你可以从列表的头部或尾部添加/删除元素。

  • 就像: 一个排队的队伍,或者一个任务清单。
  • 典型用途: 最新消息列表、待处理任务队列(简单的消息队列)、用户浏览历史记录。
  • 常用命令:
    • LPUSH key element1 [element2 ...]: 从列表的头部添加一个或多个元素。
      redis
      LPUSH mylist "apple"
      LPUSH mylist "banana" # 现在列表是 ["banana", "apple"]
      LPUSH mylist "cherry" # 现在列表是 ["cherry", "banana", "apple"]
    • RPUSH key element1 [element2 ...]: 从列表的尾部添加一个或多个元素。
      redis
      RPUSH mylist "date" # 现在列表是 ["cherry", "banana", "apple", "date"]
    • LPOP key: 从列表的头部移除并返回一个元素。
      redis
      LPOP mylist # 返回 "cherry",列表变成 ["banana", "apple", "date"]
    • RPOP key: 从列表的尾部移除并返回一个元素。
      redis
      RPOP mylist # 返回 "date",列表变成 ["banana", "apple"]
    • LRANGE key start stop: 获取列表中指定范围的元素。索引从 0 开始,-1 表示最后一个元素。
      redis
      LRANGE mylist 0 -1 # 返回 ["banana", "apple"] (所有元素)
      LRANGE mylist 0 0 # 返回 ["banana"] (第一个元素)
      LRANGE mylist 1 1 # 返回 ["apple"] (第二个元素)
    • LLEN key: 获取列表的长度(元素数量)。

4.3 集合 (Sets)

集合是一个无序的、不重复元素的集合。你可以很方便地添加、删除、检查某个元素是否存在,以及执行集合间的操作(交集、并集、差集)。

  • 就像: 一个装满各种独特石头的袋子,你只关心有什么样的石头,不关心它们的顺序,也不会有两块完全一样的石头。
  • 典型用途: 存储标签(tags)、社交网站的粉丝/关注者列表(自动去重)、抽奖活动中的参与用户列表(确保没人重复)。
  • 常用命令:
    • SADD key member1 [member2 ...]: 向集合添加一个或多个元素。如果元素已存在,则忽略。
      redis
      SADD myset "A" "B" "C"
      SADD myset "C" "D" # "C" 已存在,只添加 "D"
      # 集合 myset 现在包含 {"A", "B", "C", "D"} (顺序不定)
    • SMEMBERS key: 获取集合中的所有元素。
      redis
      SMEMBERS myset # 返回 {"A", "B", "C", "D"} (顺序不定)
    • SISMEMBER key member: 检查某个元素是否存在于集合中。返回 1 (存在) 或 0 (不存在)。
      redis
      SISMEMBER myset "A" # 返回 1
      SISMEMBER myset "Z" # 返回 0
    • SREM key member1 [member2 ...]: 从集合中移除一个或多个元素。
      redis
      SREM myset "C" # 移除 "C"
      # 集合 myset 现在包含 {"A", "B", "D"}
    • SCARD key: 获取集合的元素数量。

4.4 哈希 (Hashes)

哈希是一个键值对的集合,但这个集合是存储在一个键下面的。你可以把它看作是一个“内嵌”的键值对存储。

  • 就像: 一本电话本,大的键是“我的朋友们”,值是一个哈希结构,里面包含多个字段(名字、电话、地址)来描述每个人。
  • 典型用途: 存储对象(如用户、商品)的信息,每个对象的不同属性存储为哈希中的字段。
  • 常用命令:
    • HSET key field value [field value ...]: 设置哈希中一个或多个字段的值。
      redis
      HSET user:1 name "张三" age "30" city "北京"
    • HGET key field: 获取哈希中某个字段的值。
      redis
      HGET user:1 name # 返回 "张三"
      HGET user:1 age # 返回 "30"
    • HGETALL key: 获取哈希中所有字段和值。
      redis
      HGETALL user:1 # 返回 ["name", "张三", "age", "30", "city", "北京"]
    • HDEL key field1 [field2 ...]: 删除哈希中的一个或多个字段。
      redis
      HDEL user:1 city # 删除 city 字段
    • HKEYS key: 获取哈希中所有字段名。
    • HVALS key: 获取哈希中所有字段的值。
    • HLEN key: 获取哈希中字段的数量。

4.5 有序集合 (Sorted Sets / ZSets)

有序集合类似于集合,也是不重复元素的集合。但每个元素都关联着一个分数 (score)。集合中的元素会按照这个分数进行排序。

  • 就像: 一个游戏排行榜,每个玩家都有一个分数,排行榜按分数高低显示玩家排名。
  • 典型用途: 排行榜、带有优先级的任务队列、需要按时间或分数排序的列表。
  • 常用命令:
    • ZADD key score member [score member ...]: 添加一个或多个带有分数的成员到有序集合。
      redis
      ZADD leaderboard 100 "player:1" 80 "player:2" 120 "player:3"
      # 有序集合 leaderboard 现在包含 {"player:2": 80, "player:1": 100, "player:3": 120}
    • ZRANGE key start stop [WITHSCORES]: 按照分数顺序(从低到高)获取指定范围的成员。
      redis
      ZRANGE leaderboard 0 -1 # 返回 ["player:2", "player:1", "player:3"]
      ZRANGE leaderboard 0 -1 WITHSCORES # 返回 ["player:2", "80", "player:1", "100", "player:3", "120"]
    • ZREVRANGE key start stop [WITHSCORES]: 按照分数逆序(从高到低)获取指定范围的成员。
      redis
      ZREVRANGE leaderboard 0 -1 # 返回 ["player:3", "player:1", "player:2"]
    • ZSCORE key member: 获取某个成员的分数。
      redis
      ZSCORE leaderboard "player:1" # 返回 "100"
    • ZRANK key member: 获取某个成员的排名(从低到高,索引从 0 开始)。
      redis
      ZRANK leaderboard "player:1" # 返回 1 (因为 player:2 分数是 80,排在它前面)
    • ZINCRBY key increment member: 增加某个成员的分数。
    • ZCARD key: 获取有序集合的成员数量。

总结一下 Redis 的数据类型:

数据类型 描述 像什么? 典型用途
Strings 最简单的键值对,值是字符串 便签贴 缓存、计数器、存储简单值
Lists 有序的、可重复元素的集合 队列、清单 最新列表、简单消息队列、历史记录
Sets 无序的、不重复元素的集合 独特石头的袋子 标签、去重、社交关系、抽奖
Hashes 存储在一个键下的键值对集合 电话本条目、对象属性 存储对象信息
Sorted Sets 有序的、不重复元素的集合,每个元素有分数 排行榜 排行榜、按分数排序的列表、优先级队列

理解这些数据类型以及它们各自的特点,是掌握 Redis 的关键!

5. Redis 常被用来做什么?

因为速度快和灵活的数据结构,Redis 在很多场景都非常有用:

  • 数据缓存 (Caching): 这是 Redis 最常见的用途。网站或应用经常需要从慢速的数据库(比如 MySQL)中读取数据。把经常访问的数据放到 Redis 里,下次直接从 Redis 读取,速度能快好几倍甚至几十倍!这就像把常用的书放到书桌上,而不是每次都去图书馆找。
  • 会话缓存 (Session Caching): 当用户登录网站后,我们需要记住他们的登录状态和一些信息(比如用户名、购物车内容)。这些信息可以放在 Redis 里,每次用户访问页面时,快速从 Redis 中获取,而不是频繁查询数据库。
  • 计数器和排行榜 (Counters & Leaderboards): 使用 String 的 INCR 命令可以轻松实现各种计数器(网站访问量、文章阅读数)。使用 Sorted Set 可以方便地实现各种排行榜(游戏得分榜、点赞数排行)。
  • 消息队列 (Message Queue – Simple): 使用 List 的 LPUSHRPOP 命令(或者 BLPOP/BRPOP 阻塞命令),可以实现一个简单的任务队列,生产者把任务放到列表头部,消费者从列表尾部取出任务执行。
  • 发布/订阅 (Pub/Sub): Redis 支持发布/订阅模式,可以用来实现简单的实时消息系统,比如聊天室、通知系统。
  • 地理位置信息 (Geospatial): Redis 提供了专门的功能来存储和查询地理位置信息,比如查找附近的餐馆。
  • 限时数据 (Time-Limited Data): Redis 可以给任何键设置过期时间 (TTL, Time To Live)。比如缓存数据设置 5 分钟过期,用户登录状态设置 30 分钟过期。这非常方便,不用我们手动去管理哪些数据该清理了。

6. 如何开始使用 Redis?

作为编程新手,你可能还不太熟悉服务器、命令行这些概念。但别担心,学习 Redis 的第一步可以很简单:

  1. 安装 Redis 服务器: 你需要在你的电脑上或者一台服务器上安装 Redis。这通常是一个简单的过程,具体步骤会因你的操作系统(Windows, macOS, Linux)而异。你可以在 Redis 官网找到详细的安装指南(通常是搜索 “Install Redis on [你的操作系统]”)。
  2. 启动 Redis 服务器: 安装完成后,你需要运行 Redis 服务器程序。
  3. 连接 Redis: Redis 提供一个命令行客户端叫做 redis-cli。打开终端或命令行工具,输入 redis-cli 就可以连接到本地运行的 Redis 服务器。
  4. 尝试基本命令: 连接成功后,你就可以输入前面学过的那些基本命令了!
    bash
    > SET mykey "Hello Redis!"
    OK
    > GET mykey
    "Hello Redis!"
    > DEL mykey
    (integer) 1
    > GET mykey
    (nil)

    (integer) 1(nil) 是 Redis 服务器返回的结果,表示操作成功、删除了 1 个键或者键不存在。
  5. 在你的代码里使用 Redis: 几乎所有流行的编程语言(如 Python, Java, Node.js, PHP, Ruby, Go 等)都有 Redis 的客户端库(也叫驱动或连接器)。你需要在你的项目里引入对应的库,然后就可以在代码里调用方法来连接 Redis 并执行各种命令了。比如在 Python 里,你可能写 redis_client.set('mykey', 'Hello from Python')

刚开始学习,重点是理解 键值对不同的数据类型 如何使用。多练习使用 redis-cli 执行各种命令,亲手操作一下 String, List, Set, Hash, Sorted Set 的存取和操作,你会更快掌握它们。

7. Redis 和传统数据库有什么不同?

理解 Redis,一个好办法是把它和我们常说的传统关系型数据库(比如 MySQL)对比一下:

  • 数据结构:
    • 传统数据库:主要是表格 (Tables),数据按行和列组织,有固定的结构(Schema)。
    • Redis:多种多样的数据结构 (String, List, Set, Hash, Sorted Set),更加灵活,没有固定结构的要求(Schema-less)。
  • 存储位置:
    • 传统数据库:数据主要存在硬盘上。
    • Redis:数据主要存在内存里,但可以持久化到硬盘。
  • 速度:
    • 传统数据库:相对较慢,因为涉及硬盘读写和复杂的查询处理。
    • Redis:非常快,因为是内存操作。
  • 查询方式:
    • 传统数据库:使用结构化查询语言 SQL,可以进行复杂的连接、过滤、排序等操作。
    • Redis:通过简单的来查找,操作是针对特定数据结构设计的命令。没有复杂的查询语言。
  • 使用场景:
    • 传统数据库:适合存储大量结构化数据,进行复杂的查询和事务处理。
    • Redis:适合对读写速度要求极高、需要使用灵活数据结构的场景,常作为辅助传统数据库的工具(比如做缓存),而不是完全替代。

简单来说,传统数据库是你的长期记忆详细档案室,而 Redis 更像是你的工作台,放着你当前最需要、需要快速拿取的工具和资料。它们通常是配合使用,而不是二选一。

8. 接下来怎么学?

你已经迈出了认识 Redis 的第一步!接下来,你可以:

  • 安装并实际操作 Redis: 跟着官方文档在你自己的电脑上安装 Redis,并打开 redis-cli 多敲敲命令,亲手体验一下各种数据类型。
  • 结合编程语言使用: 在你熟悉的编程语言项目中,引入 Redis 客户端库,尝试用代码连接 Redis,并实现一些简单功能,比如缓存一个计算结果,或者用列表实现一个简单的任务队列。
  • 阅读官方文档: Redis 的官方文档非常详细且清晰,是最好的学习资源。即使是英文,配合翻译工具也能理解大部分内容。重点关注命令参考部分,查阅每个命令的具体用法和参数。
  • 查找在线教程和课程: 有很多优秀的博客、视频和课程会更详细地讲解 Redis 的概念和实际应用。

学习一个新工具,最重要的是动手实践和持续探索。不要害怕犯错,多尝试、多思考它的应用场景。

9. 总结

好了,我们一路走来,认识了 Redis 这个“快手”数据工具:

  • 它是一个基于内存的键值对存储系统。
  • 它非常快,主要因为它把数据放在内存里。
  • 它不像传统数据库那样只有表格,而是提供了 String, List, Set, Hash, Sorted Set 等多种实用的数据结构。
  • 这些数据结构让 Redis 能高效地解决缓存、计数、排行榜、消息队列等各种实际问题。
  • 它通常作为传统数据库的有力补充,让你的应用程序更快更灵活。

Redis 是现代互联网应用中非常常见和重要的一个组件。掌握它,会为你的编程技能包增加一个非常有价值的工具。

希望这篇介绍能帮助你这个编程新手对 Redis 有一个初步的、清晰的认识。现在,就去试试看,让 Redis 成为你的新朋友吧!

祝你学习愉快,编程顺利!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部