Redis基础解析 | 从原理到实践,一篇文章通晓全局

本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!


背景介绍

Redis,作为一款开源的、内存中的数据结构存储系统,以其卓越的性能和丰富的功能,在开发者社区中赢得了广泛的赞誉和应用。它支持多种数据类型,如字符串、列表、集合、哈希表和有序集合等,并且提供了多种功能,如发布/订阅、事务、Lua脚本等。Redis不仅可以用作数据库、缓存和消息中间件,还可以作为数据结构服务器,在多种场景下发挥着巨大的作用。

无论您是Redis的新手还是资深用户,本文都将为您提供有价值的信息和实用的技巧。让我们一起探索Redis的奥秘,为构建高效、稳定的数据存储系统助力!

文章大纲

在本文中,我们将为您呈现一篇全面而深入的Redis技术指南。从Redis的基础知识到高级集群管理,再到数据持久化与恢复策略,本文旨在帮助读者全面了解并掌握Redis的核心技术和应用实践。

下图便是总体文章的大纲: 本文将带您深入了解Redis的各项功能和技术细节。我们将从Redis的入门知识开始,逐步探讨其安装、连接、集群管理等方面的内容。

同时,我们还将重点关注Redis的持久化机制,包括RDBAOF两种持久化方式,以及如何在Redis重启后恢复之前的内存数据。此外,我们还将介绍Redis的数据导入导出方式,帮助您在实际应用中更加灵活地迁移和备份数据。

Redis入门概览

在高速的数据处理领域,Redis以其卓越的读写性能和多样化的数据结构,赢得了开发者的广泛赞誉。其读取速度高达110,000次/秒,写入速度也达到了81,000次/秒,这样的性能表现让Redis在众多数据存储系统中脱颖而出。

Redis核心特点

  • 存储模型 :在众多NOSQL系统中,Redis以其独特的魅力和实用性脱颖而出。与传统的MySQL二维表格存储方式不同,Redis是一个开源的、基于ANSI C语言编写的key-value存储系统。

  • 持久化:Redis的数据也是主要存储在计算机内存中,这使得它拥有极高的读写性能。但Redis并不满足于此,它进一步引入了数据持久化的机制,Redis会周期性地更新数据到磁盘或将修改操作记录到追加文件中,从而确保了数据的持久化。

  • 原子性:Redis的所有操作都是原子性的,这意味着在执行过程中不会被其他操作打断,从而保证了数据的一致性和准确性。此外,Redis还支持多个操作的合并执行,进一步提高了原子性操作的效率和灵活性。

  • 数据结构:高性能和原子性操作外,Redis还支持多种数据结构,包括字符串、列表、哈希、集合和有序集合等。这些丰富的数据结构使得Redis能够轻松应对各种复杂的数据处理需求,为开发者提供了极大的便利。

  • 主从复制:Redis的主从复制(集群)是一种数据冗余和故障恢复机制,它通过将一台Redis服务器(主节点)的数据复制到其他Redis服务器(从节点)来实现。这种复制是单向的,只能从主节点复制到从节点。

  • 其他功能:它还支持数据的过期时间设置、事务处理、消息订阅等实用功能,使得Redis在多个场景中都能发挥出巨大的作用。

Redis常用场景

数据缓存(提高访问性能)

当应用程序需要从数据库中读取数据时,如果直接从数据库查询,可能会因为数据库读写次数的限制而导致性能瓶颈。而Redis将数据存储在内存中,使得数据读取操作可以直接从内存中获取,大大提高了数据访问速度。同时,由于内存中的数据读写速度远超数据库,因此Redis的读写效率非常高。

缓存的两种形式

页面缓存经常用在CMS(content manage system)内存管理系统里面。数据缓存经常会用在页面的具体数据里面。

  • 页面缓存:第一次从数据库中读取,然后生成一个静态页面,以后所有的读取,只加载这个静态页面就可以了。
  • 数据缓存:由于一个页面有几种需要从不同的缓存中读取数据的模块,所以不适合使用页面缓存。

会话缓存(临时数据存储)

Redis作为会话缓存(Session Cache)。会话缓存主要用于保存Web会话信息,以便在用户浏览网站的不同页面之间保持数据的一致性和状态。下面,我们将对Redis支持的会话缓存功能进行简要介绍。

在Web应用程序中,当用户首次访问网站时,服务器会为用户创建一个新的会话,并将该会话的ID发送给用户的浏览器。用户的浏览器会在后续的请求中携带这个会话ID,以便服务器能够识别并恢复用户的会话。服务器会将用户的会话数据存储在Redis中,并使用会话ID作为键。当用户发送请求时,服务器会从Redis中根据会话ID获取用户的会话数据,从而恢复用户的状态。

会话缓存的主要目的是在用户访问网站期间,保存用户的状态信息。这些信息可能包括用户的身份验证信息、购物车内容、个性化设置等。这些信息通常以键值对的形式存储在Redis中,每个用户的会话都有一个唯一的键,通常是一个会话ID,与之关联的值则是用户的会话数据。

排行榜/计数器

排行榜在社交媒体、游戏、电商平台等场景中非常常见,用于展示用户、商品、话题等的排名情况。Redis通过其有序集合(Sorted Set)数据结构,为排行榜的实现提供了高效且灵活的方案。

排行榜场景

Redis的有序集合(Sorted Set)是一种特殊的集合,其中的每个元素都与一个分数(score)相关联,并且元素按照分数进行排序。这使得Redis非常适合用于实现排行榜。

Redis的有序集合(Sorted Set)
  • 添加元素和分数:ZADD命令可以向有序集合中添加元素和对应的分数。如果元素已存在,可以通过该命令更新其分数。

  • 获取排行榜:使用ZRANGE或ZREVRANGE命令可以按照分数从低到高或从高到低获取排行榜中的元素。

  • 更新元素分数:使用ZINCRBY命令可以原子地增加或减少元素的分数,实现排行榜的实时更新。

计数器场景

计数器常用于记录某种事件的发生次数,如用户访问量、点击量、点赞数等。Redis提供了对整数的原子操作,使得计数器功能的实现变得非常简单和高效。

  • 初始化计数器:使用SET命令可以为计数器设置一个初始值,通常为0。
  • 增加计数器:使用INCR命令可以原子地将计数器的值增加1。如果需要增加多个单位,可以使用INCRBY命令。
  • 获取计数器值:使用GET命令可以获取计数器的当前值。

消息队列

Redis提供了多种数据结构来实现消息队列,其中最常用的包括List结构、PubSub(发布/订阅)和Stream结构。 ![在这里插入图片描述](img-blog.csdnimg.cn/direct/a29e...

List列表实现方案

Redis的List是一个双向链表,可以从两端插入和弹出数据。生产者可以使用LPUSH命令将消息推送到队列的左侧,消费者则可以使用RPOP或BRPOP命令从队列的右侧取出消息。

  • 优点:实现简单,支持消息的有序性,且可以持久化。
  • 缺点:只支持单一消费者消费数据,且消息一旦被消费就会从列表中删除,不支持重复消费。

PubSub(发布/订阅)实现方案

PubSub是一种基于频道的发布/订阅模型。生产者发布消息到频道,消费者订阅频道并接收消息。

  • 优点:支持多生产者、多消费者模型,且消费者之间互不影响。
  • 缺点:不支持消息的持久化,如果消费者在消息发布后没有立即接收,消息将会丢失。此外,PubSub模型也不支持消息的确认机制,无法确保消息被成功消费。

Stream结构(Redis 5.0及以后版本)

Stream是Redis 5.0及以后版本引入的一种新的数据结构,用于存储和处理消息。它提供了消息的持久化、有序性、唯一ID和消费者组等特性。生产者使用XADD命令发布消息到Stream,消费者则使用XREAD命令从Stream中读取消息。

  • 优点:支持消息的持久化、有序性和唯一ID,确保消息的可靠传递。同时,Stream还支持消费者组模型,可以实现消息的负载均衡和消息的确认机制。
  • 缺点:相较于List和PubSub,Stream的实现更为复杂,需要更多的配置和管理。

Redis安装指引

Redis的下载地址

bash 复制代码
$ wget http://download.redis.io/releases/redis-x.y.z.tar.gz
$ tar xzf redis-x.y.z.tar.gz
$ cd redis-x.y.z
$ make$cd..
$ ln -s redis-x.y.z redis

配置后台运行

Redis 默认并不以守护进程(即后台服务)的方式运行,这可能会影响到其在服务器上的持续运行和稳定性。为了改变这一默认设置,您可以通过编辑 Redis 的配置文件来启用守护进程模式。以下是详细的步骤说明:

Redis 的配置文件。假设您的 Redis 配置文件位于 /data/redis/redis.conf,您可以运行以下命令来编辑它:

bash 复制代码
sudo vim /data/redis/redis.conf

在打开的配置文件中,您需要找到与守护进程相关的配置项。通常,这个配置项叫做 daemonize。将其值从 no 修改为 yes,以启用守护进程模式。

conf 复制代码
daemonize yes

注意,在修改配置文件并保存更改后,您可能需要重新启动 Redis 服务以使更改生效。具体的重启命令取决于您的操作系统和 Redis 的安装方式,但通常类似于以下命令:

bash 复制代码
sudo systemctl restart redis

或者

bash 复制代码
sudo /etc/init.d/redis restart

或者如果您是直接使用 redis-server 命令启动的,您可能需要先停止当前运行的 Redis 实例,然后再使用修改后的配置文件重新启动它。

配置日志地址

在配置日志(log)文件的存储位置时,默认情况下,日志信息会实时显示在命令行终端的窗口中,这对于即时监控和调试非常有用。然而,为了满足不同的需求,您还可以选择将日志信息重定向至特定的文件路径,编辑Redis配置文件vim /data/redis/redis.conf

c 复制代码
logfile "/data/redis/logs/redis.log" 

配置pid

Redis 作为守护进程运行时,默认会将进程ID文件(pid file)保存在 /var/run/redis.pid。然而,在复杂的系统环境中,特别是当运行多个 Redis 实例时,为了避免冲突,管理员可能需要自定义 pid 文件的存储位置。这可以通过修改 Redis 配置文件中的 pidfile 指令来实现,确保每个 Redis 实例都有其独特的 pid 文件和监听端口。

例如,如果您想将 pid 文件保存在 /data/redis/redis1.pid,您可以在 Redis 配置文件中设置:

conf 复制代码
pidfile /data/redis/redis1.pid

配置端口和接收请求IP

在配置Redis服务器时,我们需要首先确定它将监听哪个端口以便接收客户端的连接请求。默认情况下,Redis使用端口6379,这是一个广为人知的默认端口,但为了安全起见,您也可以在配置文件中使用port指令来指定其他端口。

c 复制代码
# 设置Redis监听的端口  
port 6379  
  
# 在生产环境中,建议将Redis绑定到本地回环地址,以限制访问  
bind 127.0.0.1

除了端口外,我们还需要考虑Redis服务器应该绑定到哪些IP地址上。bind指令用于指定Redis应该监听哪些IP地址上的连接请求。如果不设置bind指令或将其设置为0.0.0.0,Redis将会监听所有可用的网络接口,这意味着它将接受来自任何IP地址的连接请求。

在生产环境中,出于安全考虑,我们通常建议将Redis绑定到本地回环地址127.0.0.1(也被称为localhost),这样Redis就只会接受来自同一台机器上的连接请求。

连接Redis建立通信桥梁

当Redis服务器和客户端位于同一台机器上时,你可以直接使用redis-cli命令来连接服务器,而无需任何额外的参数。这是连接到本地Redis服务器的最简单方法:

bash 复制代码
redis-cli

执行上述命令后,你将进入Redis的交互式终端,可以在其中执行各种Redis命令。

连接到远程Redis服务器

如果Redis服务器和客户端位于不同的机器上,你需要提供Redis服务器的地址和端口(默认为6379)来建立连接。这可以通过在redis-cli命令后添加-h(主机名)和-p(端口号)参数来实现:

bash 复制代码
redis-cli -h <hostname> -p <port>

其中,<hostname>是Redis服务器的IP地址或主机名,<port>是Redis服务器的端口号。

修改Redis配置文件(redis.conf)

如果客户端无法直接连接到Redis服务器,除了检查网络连接和防火墙设置外,有时还需要修改Redis的配置文件(通常是redis.conf)。以下是一些可能需要关注的配置项:

绑定地址(bind) :默认情况下,Redis可能只监听本地地址(如127.0.0.1),这意味着只有本地客户端可以连接。要允许远程连接,你可以将bind指令更改为监听所有可用的网络接口(使用0.0.0.0)或特定的IP地址。

conf 复制代码
bind 0.0.0.0

或者,如果你只想让某些特定的IP地址或网络接口可以连接,可以列出它们:

conf 复制代码
bind 192.168.1.100 10.0.0.1

密码认证(requirepass) :如果Redis服务器启用了密码认证,你需要在连接时提供密码。这可以通过在redis-cli命令后添加-a参数来实现:

bash 复制代码
redis-cli -h <hostname> -p <port> -a <password>

或者,在redis.conf文件中设置密码:

conf 复制代码
requirepass yourpassword

Redis启动过程

服务器配置初始化

在启动服务器流程的第一步,我们将执行全局服务器配置的初始化。这一步是为了确保服务器能够按照预设的规范进行运作,包括但不限于端口设置、日志级别、安全协议等关键参数。

加载定制配置文件

随后,系统会尝试加载用户指定的配置文件。若用户已明确指定了配置文件路径,系统将优先读取并使用该文件中的设置。若用户未指定,系统将自动采用预设的默认配置,以保证服务的顺利启动和稳定运行。

服务器环境准备与初始化

在加载配置文件后,我们会对服务器环境进行准备和初始化。这一步骤涉及到服务器资源的分配、内部状态的设置以及服务依赖的加载等关键任务,确保服务器能够在最佳状态下接受和处理来自客户端的请求。

数据库连接与数据加载

系统将尝试与数据库建立连接,并加载所需的数据。这一步骤对于依赖数据库的应用至关重要,因为它确保了服务器能够实时访问和更新数据库中的数据,从而为用户提供最新、最准确的信息。

网络监听与请求处理

服务器将开始进入网络监听状态,等待并处理来自客户端的请求。在这一阶段,服务器会持续监听指定的网络端口,一旦接收到请求,就会立即启动相应的处理逻辑,确保客户端的请求能够得到快速、准确的响应。

相关推荐
xo1988201126 分钟前
鸿蒙人脸识别
redis·华为·harmonyos
初晴~1 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581361 小时前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳1 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾1 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
星就前端叭2 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
小林coding3 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
AI理性派思考者3 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu
从善若水3 小时前
【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧
开发语言·后端·rust
机器之心4 小时前
终于等来能塞进手机的文生图模型!十分之一体量,SnapGen实现百分百的效果
人工智能·后端