redis学习

下面我将用通俗易懂的语言,详细介绍 Redis 及其各类功能和数据结构。


什么是 Redis?

Redis 是一个高性能的开源内存数据库,常用于缓存、消息队列、会话存储等场景。它的数据是存储在内存中的,所以读写速度非常快。Redis 支持丰富的数据结构,并且可以持久化数据到磁盘,保证数据安全。


Redis 数据结构详解

1. 字符串(String)

  • 特点:最基本的数据类型,单个键对应一个值。

  • 应用:缓存、计数器、简单的对象存储。

  • 操作:设置(SET)、获取(GET)、自增(INCR)、追加(APPEND)。

  • 举例

    Code

    复制代码
    SET name "Tom"
    GET name          // 返回 "Tom"
    INCR age          // 年龄加1

2. 列表(List)

  • 特点:有序的字符串集合,可以像队列/栈一样操作。

  • 应用:消息队列、任务列表、最近访问记录。

  • 操作:从头插入(LPUSH)、从尾插入(RPUSH)、弹出(LPOP/RPOP)。

  • 举例

    Code

    复制代码
    LPUSH fruits "apple"
    RPUSH fruits "banana"
    LPOP fruits       // 返回 "apple"

3. 集合(Set)

  • 特点:无序且唯一的字符串集合。

  • 应用:标签、去重、共同好友等。

  • 操作:添加(SADD)、移除(SREM)、取交集(SINTER)、取并集(SUNION)。

  • 举例

    Code

    复制代码
    SADD tags "redis"
    SADD tags "database"
    SADD tags "redis" // 不会重复
    SMEMBERS tags     // 返回所有标签

4. 有序集合(Sorted Set)

  • 特点:每个元素都有一个分数,按照分数排序,元素不能重复。

  • 应用:排行榜、优先队列、定时任务。

  • 操作:添加(ZADD)、按分数范围查询(ZRANGEBYSCORE)、获取排名(ZRANK)。

  • 举例

    Code

    复制代码
    ZADD scores 100 "Tom"
    ZADD scores 80 "Jerry"
    ZRANGE scores 0 -1 // 分数从小到大返回所有

5. 哈希(Hash)

  • 特点:类比于字典或对象,适合存储结构化数据。

  • 应用:用户信息、对象属性。

  • 操作:设置字段(HSET)、获取字段(HGET)、获取所有字段(HGETALL)。

  • 举例

    Code

    复制代码
    HSET user:1 name "Tom"
    HSET user:1 age 20
    HGET user:1 name    // 返回 "Tom"
    HGETALL user:1      // 返回所有属性

进阶功能与应用场景

6. 发布订阅(Pub/Sub)

  • 特点:消息通信机制,发布者发布消息,订阅者接收消息。

  • 应用:聊天系统、实时通知。

  • 操作:发布(PUBLISH)、订阅(SUBSCRIBE)。

  • 举例

    Code

    复制代码
    SUBSCRIBE news      // 订阅频道
    PUBLISH news "Hello Redis!" // 发布消息

7. 消息队列

  • 特点:利用列表实现生产者-消费者模式。

  • 应用:异步任务处理、事件驱动系统。

  • 操作:生产者 LPUSH,消费者 RPOP/BPOP。

  • 举例

    Code

    复制代码
    LPUSH queue "task1"
    RPOP queue         // 消费任务

8. 地理空间(Geo)

  • 特点:存储地理坐标(经纬度),能进行距离、范围、附近查询。

  • 应用:附近的人、附近的商店。

  • 操作:添加(GEOADD)、距离查询(GEODIST)、范围查询(GEORADIUS)。

  • 举例

    Code

    复制代码
    GEOADD places 116.38 39.90 "Beijing"
    GEODIST places "Beijing" "Shanghai" // 查询两地距离

9. HyperLogLog

  • 特点:基数统计结构,极省空间,适合统计唯一数量。

  • 应用:UV统计、独立访问量。

  • 操作:添加(PFADD)、查询(PFCOUNT)。

  • 举例

    Code

    复制代码
    PFADD visitors "user1" "user2"
    PFCOUNT visitors  // 返回独立用户数

10. 位图(Bitmap)

  • 特点:以二进制位存储数据,适合布尔值集合。

  • 应用:签到、活跃用户标记。

  • 操作:设置(SETBIT)、获取(GETBIT)、统计(BITCOUNT)。

  • 举例

    Code

    复制代码
    SETBIT sign_in 1 1 // 用户1签到
    GETBIT sign_in 1   // 查询用户1是否签到
    BITCOUNT sign_in   // 统计签到人数

11. 位域(Bitfield)

  • 特点:操作指定长度的二进制字段,支持整型、计数等复杂操作。

  • 应用:密集数据存储、状态压缩。

  • 操作:BITFIELD

  • 举例

    Code

    复制代码
    BITFIELD mykey SET u8 0 100   // 从第0位开始设置一个8位无符号数为100
    BITFIELD mykey GET u8 0       // 获取该值

Redis 事务

  • 特点:原子性操作,一次执行多个命令。

  • 应用:保证一组操作要么全部成功要么全部失败。

  • 操作:MULTI、EXEC、WATCH。

  • 举例

    Code

    复制代码
    MULTI
    SET key1 "A"
    SET key2 "B"
    EXEC

持久化机制

  • RDB(快照):定时将内存数据保存到磁盘,适合冷备份。
  • AOF(追加日志):每个写操作都记录下来,重启时重放日志,适合高数据安全场景。
  • 混合模式:既用 RDB 又用 AOF,兼顾速度和安全。

主从复制(Replication)

  • 特点:主节点写数据,从节点同步数据,实现高可用和读写分离。
  • 应用:分布式部署、负载均衡。
  • 操作:配置 slaveof 或在配置文件中设置。

哨兵模式(Sentinel)

  • 特点:自动检测 Redis 实例是否可用,支持自动故障转移。
  • 应用:高可用架构。
  • 功能
    • 监控主节点
    • 自动主从切换
    • 通知管理员

Redis 集群

  • 特点:数据分片存储在多个节点上,支持高并发和大数据量。
  • 应用:大型分布式缓存、NoSQL数据库。

总结

Redis 是一款非常强大的内存数据库,支持丰富的数据结构和高可用特性。它不仅可以做缓存,还能做消息队列、计数器、排行榜、地理空间存储等多种应用。通过主从复制、哨兵和集群,能实现高可用和分布式架构。

我将用尽可能详细且通俗易懂的方式,为你全面剖析 Redis。这篇内容会很长,但读完它,你将对 Redis 有一个非常深刻和系统的理解。

我们将从"是什么"、"为什么"开始,然后逐一拆解它的所有核心特性和功能。


一、Redis 是什么?------ 超快的"内存"仓库

想象一下,你有一个超能力:你能把任何东西瞬间放进一个神奇的仓库,又能瞬间把它拿出来。这个仓库的唯一限制就是大小(内存),但它的存取速度极快,是普通仓库(硬盘数据库如 MySQL)的 10-100 倍。

这个神奇的仓库,就是 Redis

它的全称是 Re mote Di ctionary Server(远程字典服务器)。顾名思义,它本质上是一个存储在内存中的 Key-Value 数据存储系统,但功能远不止简单的字典那么简单。

核心特点:

  1. 基于内存:所有数据主要存储在内存(RAM)中,所以速度极快。

  2. 数据结构丰富:它不是简单的 Key-String,而是提供了字符串、列表、集合等多种复杂数据结构。

  3. 持久化:虽然数据在内存,但可以通过技术手段(RDB、AOF)将数据保存到磁盘,防止重启后数据丢失。

  4. 支持集群:可以搭建多台 Redis 服务器组成集群,处理海量数据和高并发请求。


二、为什么需要 Redis?------ 解决瓶颈

传统应用架构中,所有数据都从硬盘数据库(如 MySQL)读写。当访问量巨大时,磁盘 I/O 会成为瓶颈,导致应用变慢。

Redis 的典型应用场景:

  • 缓存:将热点数据(如商品信息、用户会话)放在 Redis 中,减轻后端数据库的压力。这是最常用的场景。

  • 排行榜:利用有序集合(Sorted Set)轻松实现实时更新的排行榜。

  • 计数器:利用原子操作快速实现点赞数、阅读量、秒杀库存等。

  • 消息队列:利用列表(List)实现简单的异步任务队列。

  • 社交关系:利用集合(Set)实现共同关注、好友推荐等。


三、核心数据结构详解(Redis 的"武器库")

这是 Redis 最强大的地方。它不像 MySQL 那样需要先建表,你可以直接使用这些数据结构。

1. 字符串(String)

最简单的类型,一个 Key 对应一个 Value。

  • 可以存什么:不仅是文本,也可以是数字(整数/浮点数)甚至是二进制数据(如图片序列化后的数据)。

  • 常用命令

    • SET key value:设置值

    • GET key:获取值

    • INCR key:将键存储的整数值增加 1(原子操作)

    • DECR key:将键存储的整数值减 1(原子操作)

    • MSET key1 value1 key2 value2:批量设置

    • MGET key1 key2:批量获取

  • 应用场景

    • 缓存SET user:1001 '{"name": "Alice", "age": 30}'

    • 计数器INCR article:readcount:1001 (给文章ID为1001的阅读量+1)

    • 分布式锁SET lock:order 1 NX EX 30 (NX:键不存在时才设置,EX:设置过期时间30秒)

2. 列表(List)

一个简单的字符串列表,按插入顺序排序。你可以从左边或右边添加/移除元素,像个双端队列。

  • 特点:有序、可重复。

  • 常用命令

    • LPUSH key value:从左边插入一个元素

    • RPUSH key value:从右边插入一个元素

    • LPOP key:从左边弹出一个元素

    • RPOP key:从右边弹出一个元素

    • LRANGE key start stop:获取指定范围内的元素

  • 应用场景

    • 消息队列 :生产者 LPUSH taskqueue task1,消费者 RPOP taskqueue

    • 最新列表LPUSH news latest_news,用 LRANGE news 0 4 获取最新5条新闻。

3. 集合(Set)

是 String 类型的无序集合 ,且元素不可重复。它支持交集、并集、差集等集合操作。

  • 特点:无序、唯一、支持集合运算。

  • 常用命令

    • SADD key member:添加一个或多个元素

    • SREM key member:移除一个或多个元素

    • SMEMBERS key:获取所有元素

    • SINTER key1 key2:计算 key1 和 key2 的交集

    • SISMEMBER key member:判断 member 是否是 key 的成员

  • 应用场景

    • 标签系统 :给用户打标签 SADD user:1001:tags tag1 tag2

    • 共同好友SINTER user:1001:friends user:1002:friends 计算两个用户的共同好友。

4. 有序集合(Sorted Set / ZSet)

和 Set 一样也是 String 类型元素的集合,且不允许重复。但每个元素都会关联一个 double 类型的分数(score)。Redis 正是通过分数来为集合中的成员进行从小到大排序的。成员是唯一的,但分数可以重复。

  • 特点:唯一、有序(按分数排序)。

  • 常用命令

    • ZADD key score member:添加一个或多个元素(带分数)

    • ZRANGE key start stop [WITHSCORES]:按分数从低到高返回指定排名范围的元素

    • ZREVRANGE key start stop [WITHSCORES]:按分数从高到低返回(用于排行榜)

    • ZRANK key member:获取 member 的排名(从0开始,按分数升序)

  • 应用场景

    • 排行榜ZADD leaderboard 100 "Alice" 90 "Bob",用 ZREVRANGE leaderboard 0 2 WITHSCORES 获取前三名。

    • 带权重的队列:分数可以作为优先级。

5. 哈希(Hash)

是一个键值对集合,非常适合存储对象。

  • 可以理解为 :一个 Key 对应一个 field-value 的映射表。

  • 常用命令

    • HSET key field value:设置哈希表字段的值

    • HGET key field:获取哈希表字段的值

    • HGETALL key:获取哈希表中所有字段和值

    • HMSET key field1 value1 field2 value2:批量设置多个字段

  • 应用场景

    • 存储对象HMSET user:1001 name "Alice" age 30 email "alice@example.com"。这比将整个对象序列化成 JSON 字符串再存为 String 更高效,可以单独修改某个字段。

四、高级功能与特性

1. 发布订阅(Pub/Sub)

一种消息通信模式:发送者(发布者)发送消息,接收者(订阅者)接收消息。发布者和订阅者没有直接关联。

  • 命令

    • SUBSCRIBE channel:订阅一个或多个频道

    • PUBLISH channel message:向指定频道发布消息

  • 应用场景:实时消息系统、实时聊天室、系统通知广播。

  • 注意 :消息是非持久化的,如果客户端中途下线,会丢失这段时间的消息。

2. 消息队列(Stream)

这是 Redis 5.0 引入的更强大的消息队列功能,旨在弥补 Pub/Sub 不能持久化消息的缺陷。它提供了消息持久化、消费者组(Consumer Group)等更接近专业消息队列(如 Kafka)的功能。

  • 核心概念:每条消息都有一个唯一的 ID,支持多消费者组,每个消费者组可以独立消费同一条消息,并记录各自的消费位移。

  • 应用场景:需要可靠消息传递的异步任务、流处理。

3. 地理空间(Geospatial)

用于存储地理位置信息,并计算位置间的距离、查找范围内的地点等。

  • 底层实现:基于有序集合(ZSet),将二维的经纬度编码成一个分数(score)。

  • 常用命令

    • GEOADD key longitude latitude member:添加地理位置

    • GEODIST key member1 member2 [unit]:计算两地距离

    • GEORADIUS key longitude latitude radius unit:查找指定半径内的地点

  • 应用场景:附近的人、附近的车、摇一摇。

4. HyperLogLog

用于做基数统计 的算法。它的优点是,输入元素的数量或体积非常大时,计算基数所需的空间总是固定且很小

  • 什么是基数?:一个集合中不重复元素的个数。例如 {1, 3, 5, 7, 5, 3, 1} 的基数是 4。

  • 特点:统计结果不是精确的,有小于 1% 的误差,但内存占用极小(每个 HyperLogLog 键只需 12 KB)。

  • 命令

    • PFADD key element:添加元素

    • PFCOUNT key:计算基数

    • PFMERGE destkey sourcekey:合并多个 HyperLogLog

  • 应用场景:统计网站的 UV(独立访客数),统计搜索关键词的不重复数量。

5. 位图(Bitmap)与位域(Bitfield)
  • 位图(Bitmap):通过操作字符串的每一位(bit)来实现的。实际上它不是一种单独的数据类型,而是基于 String 类型的一系列位操作。

    • 命令SETBIT key offset value, GETBIT key offset, BITCOUNT key

    • 应用场景:用户签到记录(每天1bit,一年只需365bit≈46字节)、活跃用户统计。

  • 位域(Bitfield):允许你对字符串中的多个位段进行设置、增加和获取操作,可以处理整数。可以把它看作是对位图功能的增强,能更高效地操作多个位。

    • 命令BITFIELD key ...

    • 应用场景:存储需要打包的小整数,如存储一个有多种状态标志的对象。


五、数据安全与可靠性

1. 事务(Transactions)

Redis 事务是一组命令的集合。事务中的所有命令都会按顺序串行化执行,执行过程中不会被其他客户端发送的命令打断。

  • 命令MULTI(开启事务) -> 输入多条命令 -> EXEC(执行事务) 或 DISCARD(取消事务)。

  • 重要特点

    • 不保证原子性 :Redis 事务在执行中如果某条命令出错,不会回滚之前已执行的命令。它只是确保这组命令被连续执行。

    • 没有隔离级别:因为命令是串行执行,所以不存在并发问题。

2. 持久化(Persistence)

为了解决内存数据掉电易失的问题,Redis 提供了两种将数据持久化到硬盘的机制:

  • RDB(Redis Database)

    • 原理 :在指定的时间间隔内,生成内存数据的快照 (Snapshot),保存为一个压缩的二进制文件(.rdb)。

    • 优点

      • 文件紧凑,适合做灾难恢复(可以远程传输备份)。

      • 最大化 Redis 性能(父进程 fork 一个子进程来完成持久化,主进程不进行任何 I/O 操作)。

      • 重启恢复大数据集时速度比 AOF 快。

    • 缺点

      • 可能会丢失最后一次快照之后的数据(比如 5 分钟持久化一次,服务器宕机就会丢失近 5 分钟的数据)。

      • fork 子进程时,如果数据量巨大,可能会导致服务暂停几毫秒甚至几秒。

  • AOF(Append Only File)

    • 原理 :记录每一次写操作命令(如 SET, HSET),以日志的形式追加到文件末尾。

    • 优点

      • 数据安全性更高。你可以配置为每秒同步一次,最多丢失一秒的数据。

      • AOF 文件易于解读,容易修复。

    • 缺点

      • AOF 文件通常比 RDB 文件大。

      • 根据同步策略的不同,AOF 的运行速度可能慢于 RDB。

生产环境通常同时开启 RDB 和 AOF。用 AOF 保证数据不丢失,作为数据恢复的第一选择;用 RDB 做不同程度的冷备。


六、高可用与集群

1. 主从复制(Replication)

一个主节点(Master)可以拥有一个或多个从节点(Slave)。主节点负责写数据,从节点自动同步主节点的数据,主要负责读数据。

  • 作用

    • 数据冗余:实现了数据的热备份。

    • 读写分离:主库写,从库读,分担服务器负载。

    • 高可用基石:是哨兵和集群模式实现的基础。

2. 哨兵模式(Sentinel)

Redis 官方提供的高可用 解决方案。它由一个或多个 Sentinel 实例组成的系统,用于监控主从节点,并在主节点发生故障时,自动将一个从节点升级为新的主节点,让应用方无感知地完成故障切换。

  • 功能

    1. 监控:持续检查主从服务器是否正常运行。

    2. 通知:当被监控的某个节点出现问题时,可以通过 API 通知管理员。

    3. 自动故障转移:如果主节点宕机,Sentinel 会启动一次选举,将一个从节点提升为主节点,并让其他从节点复制新的主节点,并通知客户端新的主节点地址。

  • 架构:通常 Sentinel 需要至少 3 个实例来保证自身的健壮性。

3. 集群模式(Cluster)

Redis 3.0 后推出的分布式解决方案。当数据量巨大,单机内存不足时,就需要使用集群。

  • 原理

    • 数据分片:Cluster 将数据自动分片到多个节点上。整个数据库被分为 16384 个槽(slot),每个节点负责一部分槽。

    • 高可用:每个分片实际上也是主从结构(一个主节点,N个从节点),主节点故障时,其从节点会自动接替它,保证了在部分节点故障时集群的整体可用性。

  • 与哨兵模式的区别

    • 哨兵 :解决高可用问题,主从模式所有节点数据都一样,是数据的全量复制。

    • 集群 :解决海量数据+高并发+高可用的问题,是数据的分片存储。


总结

Redis 是一个功能极其丰富的内存数据存储系统,远不止一个简单的 Key-Value 缓存。它的强大之处在于:

  1. 丰富的数据结构:针对不同场景提供了最合适的"武器",让你在设计系统时游刃有余。

  2. 极致的性能:内存存储和单线程无锁设计带来了惊人的吞吐量。

  3. 完善的可靠性:通过持久化和复制机制保证数据安全。

  4. 高可用与扩展性:通过哨兵和集群模式应对各种规模的应用场景。

相关推荐
小郝 小郝10 分钟前
【51单片机】萌新持续学习中《矩阵 密码锁 点阵屏》
嵌入式硬件·学习·51单片机
没有bug.的程序员25 分钟前
MyBatis 初识:框架定位与核心原理——SQL 自由掌控的艺术
java·数据库·sql·mybatis
胡萝卜3.033 分钟前
数据结构初阶:详解单链表(一)
数据结构·笔记·学习·单链表
Databend38 分钟前
Databend 亮相 DTCC 2025:存算分离架构引领湖仓一体化
数据库
回家路上绕了弯1 小时前
ClickHouse 深度解析:从核心特性到实战应用,解锁 OLAP 领域新势能
数据库·后端
张铁铁是个小胖子1 小时前
mysql是怎样运行的(梳理)
数据库·mysql
YJlio2 小时前
第17章|PowerShell 安全警报——高分学习笔记(运维实战向)
笔记·学习·安全
没有bug.的程序员2 小时前
JVM 学习与提升路线总结:从入门到精通的系统化指南
java·jvm·学习·提升
许泽宇的技术分享3 小时前
当自然语言遇上数据库:Text2Sql.Net的MCP革命如何重新定义开发者与数据的交互方式
数据库·.net·text2sql·mcp