首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Redis#2】初识 Redis

【Redis#2】初识 Redis

作者头像
IsLand1314
发布2025-06-10 15:25:49
发布2025-06-10 15:25:49
930
举报
文章被收录于专栏:学习之路学习之路

一、基本概述

Redis 官方文档

1. 简介

Redis 是由意大利程序员 Salvatore Sanfilippo 开发的,最初是为了提高 LLOOGG.com 网站的性能。现在由 Redis Labs 维护,并得到了社区和企业的广泛支持。

Redis 最显著的特点是:

  • 高性能
  • 支持多种数据结构
  • 持久化能力
  • 分布式特性(主从复制、哨兵模式、集群)
  • 丰富的客户端支持(几乎支持所有主流编程语言)
2. 基本概念

Redis 是一个非常流行的开源内存数据库(In-memory Data Store) ,它被广泛用于缓存、消息队列、实时数据处理等场景。Redis 的全称是 REmote DIctionary Server ,即远程字典服务器

Redis 是定义变量,即在内存中存储数据,适用于分布式系统,如果是单机程序,直接通过变量存储数据的话比 Redis 更好

  • 功能:基于网络可以把自己内存中的变量给 其他进程或者其他主机进程 进行使用
  • Redis 的初心设计:最初就是用来作为一个 “消息中间件” (消息队列)的分布式系统下的生产者消费者模型,,但是遗憾的是,现在很少有这样的使用场景,反而是有更加专业的消息中间件来取代 Redis 的功能,不过 Redis 依旧是被使用十分广泛的中间件

Redis VS MySQL

  • 不可否认,MySQL 确实是一个很不错的数据库软件,但是它最大的问题在于,它的访问速度比较慢,这个慢是相较于在内存当中的,因为 MySQL 本质上是存储在磁盘上的,而如果使用 Redis 作为数据库,必然会比在 磁盘 上要快很多,因为这是在 内存 当中的
  • 但是 Redis 就一定比 MySQL 要强吗?这必然也不是的,Redis 和 MySQL 比起来最大的劣势在于,它的存储空间是有限的,这是一个很严重的问题,这就意味着,虽然有很多需要用到高性能的地方,但是终究是少数,大多数的业务其实都不需要用到特别高的性能

补充

  • MySQL 主要是通过 “表” 的方式来存储组织数据的,关系型数据库
  • Redis 主要是通过 “键值对” 的方式来存储组织数据的,非关系型数据库

那么有什么特别好的方案呢?可以中和一下 Redis 和 MySQL 的优点,并且还能有一个比较好的解决方案?那就是把 Redis 和 MySQL 结合起来进行使用,也就是我们平时所说的 “二八原则”

二八原则(理解)

  • 所谓二八原则,说的是 20% 的热点数据可以满足 80% 数据的要求,所以一个比较好的解决方案是,如果能够把 MySQL 当中比较常用的数据缓存到 Redis 当中,这样就能对于大多数的请求都能得到数据,而对于不常用的数据再到对应的磁盘去读取,这就是一个比较不错的解决方案
3. Redis 的场景

Redis 是工作在分布式系统中的,它在这个环境中才能发挥出它应有的实力,如果只是单纯的单机程序,那么本质上来说如果使用变量来进行数据的存储其实是一个比较不错的解决方式,此时其实是比使用 Redis 更加优秀的选择

我们在学习操作系统的时候知道,在进行进程的通信时,不能直接进行数据的访问,这是因为进程和进程之间是可以进行数据的隔离的,数据要被进程进行隔离的,而有一种进程通信是借助网络进行通信,所以 Redis 本质上来说就可以把自己内存中的变量给其他的进程,甚至可以直接用其他主机的进程来进行数据的访问,这样就解决了刚才所说的场景,这也是 Redis 的一个使用场景

二、功能特性

特性

描述

内存优先

数据主要存储在内存中,读写速度极快(微秒级响应)

多种数据类型

支持字符串、哈希、列表、集合、有序集合、位图、HyperLogLog、地理空间等

原子操作

所有操作都是原子的,支持事务

持久化

提供 RDB 和 AOF 两种持久化方式,可将内存数据保存到磁盘

主从复制

支持读写分离,提升系统可用性和扩展性

高可用(Sentinel)

可通过哨兵机制实现自动故障转移

分布式集群

支持 Redis Cluster,自动分片数据

发布/订阅

支持消息发布与订阅功能,可用于构建消息队列

1. 在内存中存储数据
  • In-memory data structures 在内存中存储数据 support for strings, hashes, lists, sets, sorted sets, streams, and more.
    • key 都是 string
    • value 则可以是上述的数据结构

    MySQL 中主要是通过表的方式来进行存储组织数据的,这种也叫做是一种关系型数据库,而在 Redis 中,则更多的是使用一种 键值对 的方式来进行数据的组织和存储,这种叫做是非关系型数据库

Redis 支持的数据类型🧱

1)String(字符串):最基本的类型,可以是文本或二进制数据。示例:SET name "Tom"GET name

2)Hash(哈希):存储对象,类似 Map。示例:HSET user:1000 name Tom age 25

3)List(列表):有序的字符串列表,常用作队列或栈。示例:LPUSH queue item1

4)Set(集合):无序不重复的字符串集合。示例:SADD tags redis database

5)Sorted Set(有序集合):类似 Set,但每个元素都有一个分数用于排序。示例:ZADD leaderboard 100 Tom

6)Bitmaps(位图):对 String 的位操作,适合统计类场景(如用户登录天数)。

7)HyperLogLog:用于基数统计,比如统计独立访问人数。

8)Geospatial(地理空间):存储地理位置信息,支持距离计算、范围查询等。

9)Streams(流):Redis 5.0 引入的消息队列结构,支持消息持久化和消费者组。

2. 编程能力

针对于 Redis 的操作,可以通过一些简单的交互式的命令来进行操作,也可以通过一些脚本的方式,批量化的执行一些操作,或者是带有逻辑,更重要的是,可以使用一个 Lua 的脚本语言,来进行编写

3. 扩展能力

Redis 还提供了一组原生的API,借助这个API就可以使得在原有的基础上进行扩展,例如可以使用C、C++或者是 Rust 来进行编写扩展,本质上来说就是一个动态链接库(dll、so),通过扩展,就可以让 Redis 支持更多的数据结构和和命令

4. 持久化

Redis 的数据是存储在内存中的,但是内存是有弊端的,比如它的内容是很容易被丢失的,当进程退出或者是系统重启的时候,就会把信息进行丢失,那为了解决这样的问题

  • Redis 还会把数据再硬盘上进行存储一次,内存为主,硬盘为辅,那么硬盘中的数据其实就是相当于对于 Redis 的内存数据进行了一个备份,那么当 Redis 重启的时候,就会在加载硬盘中进行备份数据的加载,就会让 Redis 的内存恢复到原来重启前的状态

Redis 将数据持久化到磁盘的功能如下:

  1. RDB(Redis Database Backup)
    • 定时生成快照,把整个数据库保存为一个 .rdb 文件。
    • 优点:恢复速度快、文件紧凑。
    • 缺点:可能丢失最近未保存的数据。
  2. AOF(Append Only File)
    • 记录所有写操作命令,以日志形式追加写入文件。
    • 优点:数据更安全,可配置同步策略(每秒、每次写都落盘)。
    • 缺点:体积大,恢复速度慢。

通常建议同时启用 RDB 和 AOF,兼顾性能与安全性。

5. 支持集群

Redis 作为是一个分布式系统的中间件,它的另外一个能力是可以支持集群,这是一个相当重要的能力,这代表的是可以进行 水平扩展,换句话说就是 支持分表分库 这样的类似操作

本质上来说,这是因为 Redis 能够存储的数据是有限的(内存空间有限),这就意味着如果有太多的数据是不能放在一个 Redis 当中的,因此就有了集群的概念,操作方式:可以引入多个主机,部署多个 Redis 节点,每个 Redis 的节点来存储数据的一部分

6. 高可用

Redis 自身也是支持主从结构的,从属节点就相当于是对于主节点的备份,那这就意味着当主节点出现问题的时候,可以直接让从属节点对于主节点进行替换,这样就可以满足主节点的要求,而不会导致程序出错

7. 快

这个我们一直都在提,那么 为啥 Redis 快呢?原因如下:

  1. Redis 的数据是存储在 内存 当中的,就比访问硬盘的数据库要快很多。
  2. Redis 的核心功能都是一些比较基础的逻辑,一些核心功能都是存储在一些操作内存的数据结构,那这就意味着不需要和 MySQL 一样调用复杂的接口和进行条件判断
  3. 从网络的角度来讲,Redis 使用的是 IO多路复用 的方式
  4. 从 Redis 的线程模型来说,它本身是一个单线程的模型,虽然在高版本的 Redis 当中确实引入了 多线程
    • 这样的单线程模型,减少了不必要的线程之间的竞争开销。
    • 注意:线程提高了效率的前提是 CPU 密集型的任务,此时使用多线程可以充分的利用 CPU 多核资源
  5. Redis 是使用 C语言 进行开发的,虽然这个理由并不太好,但也勉强算是它快的理由吧

**注意:**在对 redis 的优点进行理解,很多都是相较于 mysql 的

  • 但是如果直接和内存中的操作变量相比,就没有优势了,甚至更慢了!!
  • redis 是先通过网络!!再操作内存

是否引入一个技术,一定要想清楚来龙去脉,想清楚能够解决啥问题,引入了啥问题。

千万不能 “无脑” 使用。不能有“锤子思维”

是否要使用 redis? ===> 对症下药,具体问题具体分析,要结合实际的需求来确定!!!

例如:

此时引入 redis 的缺点,会更慢,但是也有如下的优势

  • 但是有了 redis 之后,可以通过网络,把数据单独存储。
  • 后续应用服务器重启,不会影响到数据内容。
  • 未来要扩展成分布式系统,使用 redis 是更佳的选择。

补充:💬 为什么说 “使用 C 语言开发” 是原因之一?

✅ C 语言的优势:

  1. 接近硬件,执行效率高
    • C 是一种系统级语言 ,直接编译为机器码,没有虚拟机或解释器的额外开销。
    • Redis 可以更精细地控制内存和 CPU 资源,提升性能。
  2. 内存管理可控
    • C 语言允许手动管理内存(malloc/free),Redis 利用这一点实现高效的内存分配策略(比如使用 jemalloc)。
    • 减少内存碎片,提高内存利用率。
  3. 低延迟、高性能
    • 相比 Python、Java 等语言,C 编写的程序具有更低的延迟和更高的吞吐量。
    • 这对于像 Redis 这样的数据库中间件非常重要。
  4. 可移植性强
    • C 语言代码可以在各种平台上编译运行,Redis 可以轻松部署到不同操作系统(如 Linux、macOS)

🔍 举个例子对比

语言

特点

性能表现

C

接近硬件、手动内存管理、无垃圾回收

极快、低延迟

Java

自动内存管理、JVM 抽象层

中等偏快,有 GC 延迟风险

Python

动态类型、易开发

慢,不适合高性能场景

如果 Redis 是用 Python 或 Java 实现的,即使逻辑一样,性能也会大打折扣,尤其是在高并发场景下。

三、应用场景

场景

说明

缓存

减少对后端数据库的压力,提升访问速度

会话管理

存储用户的 session 数据

消息队列

使用 List 或 Stream 实现异步任务队列

排行榜

利用 Sorted Set 快速获取排名

限流器

利用计数器 + 过期时间限制请求频率

分布式锁

多节点协调资源访问,如 Redlock 算法

实时数据分析

如在线人数、热点数据统计等

1. 作为数据库

在大多数情况下,考虑到数据存储,优先考虑的是 容量(大数据存储),但是在一些极端的场景下,也不排除需要比较快的场景

例如

  • 在一些搜索引擎的项目当中,对于搜索的性能要求是非常高的,那么此时从数据库中进行读取的效率就不高,所以在搜素引擎中是不可以使用 MySQL 这样的内容的
  • 因此就需要把这些要进行检索的数据都存储在内存当中,这样就可以使用类似于 Redis 这样的内存级别的数据库来帮助完成
  • 当然,使用这样的内存数据库,存储大量的数据,需要不少的 硬件资源

注意:Redis 当中存储的是全量数据,这里的数据是不可以进丢弃的

2. 作为缓存

使用 MySQL 进行存储数据,优点是内存大,但是缺点是很慢,由于二八原则的存在,所以我们可以把 热点数据 从 MySQL 中拿出来,存储在 Redis 中,而 Redis 就提供了这样 缓存 的功能。

  • Redis 中存储的是部分的数据,全量数据还是以 MySQL 为主,哪怕 Redis 的数据丢掉了,也还可以从 MySQL 中加载回来
  • 注意:这和上面的 Redis 作为数据库是不一样的,这个数据库是一种对于 MySQL 这样的硬盘级别的数据库的内容的一种备份
3. 作为会话存储对象

在 HTTP 的学习中,知道了 HTTP 是一个无状态的协议,因此引入的解决方案是使用了一个 cookie来进行解决,cookie 可以实现用户身份信息的保存,此时就在浏览器的这一段存储了一个用户的身份标识(sessionID),再通过 session 配合,才能够在服务器端这里真正存储的用户数据

  • 之前 senssion 是存储在应用服务器上的
  • 现在可以运用 Redis存储 session 信息,实现高效调用

用户访问网页的思考如下:

那这意味着什么?假设现在有一个浏览器想要进行登录操作,而在服务端是采用的是负载均衡的模式,那么在负载均衡器要分配到各个应用服务器,那么服务器怎么进行 cookie 的识别呢?

下面提供两种解决的方式

  1. 让负载均衡器把 同一个用户的请求始终放到同一个机器上,不能轮询,而是使用 ID 进行取模的方式来解决,进行机器的分配
  2. 把会话的数据单独拿出来,放到一个或者一组独立的机器上进行存储,这个其实就是 Redis ,那这也就意味着,当应用程序重启的时候会话不会丢失
4. 作为消息队列

Redis 作为消息队列的场景其实不多,因为 Redis 的初心虽然是设计为一个消息队列,来支持一个生产者和消费者的模型,但是事实上,它并没有被广泛的使用,因此 Redis 作为消息队列的这场景在实际的应用场景中并不多

强调:这里的消息队列(服务器)不是 Linux 进程间通信的那个消息队列

Linux 消息队列 和 Redis 消息队列区别

特性

Linux 消息队列

Redis 消息队列

所属层级

内核层(系统级)

应用层(网络服务)

使用范围

同一台机器的进程间通信

跨机器、跨网络的客户端通信

消息大小限制

一般较小(如 8KB)

很大(取决于内存)

持久化

不支持

支持(可选)

容错性

弱(系统重启丢失)

强(可持久化)

分布式支持

不支持

支持(Redis Cluster 或哨兵)

易用性

较复杂(需要系统调用)

简单(Redis 协议 + 客户端 API)

性能

极快(无网络开销)

快(受网络影响)

典型用途

进程协作、系统内部通信

分布式任务调度、事件通知、异步处理

小结Linux 消息队列 是操作系统为本地进程间通信提供的高效机制,而 Redis 消息队列 则是基于内存数据库构建的应用层消息系统,适用于跨网络、分布式的场景

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、基本概述
    • 1. 简介
    • 2. 基本概念
    • 3. Redis 的场景
  • 二、功能特性
    • 1. 在内存中存储数据
    • 2. 编程能力
    • 3. 扩展能力
    • 4. 持久化
    • 5. 支持集群
    • 6. 高可用
    • 7. 快
  • 三、应用场景
    • 1. 作为数据库
    • 2. 作为缓存
    • 3. 作为会话存储对象
    • 4. 作为消息队列
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档