Redis 核心特性与应用场景:从底层原理到分布式系统应用

一、Redis 的核心特性

1、基于内存的数据结构存储

Redis从我们学习到现在肯定听到的最多的就是它主要是基于内存保存和操作数据,操作内存的话访问延迟比较低,访问速度快,但是属于易失存储,当我们将热点数据保存在Redis当中的时候,当用户访问就可以直接拿走,不用再每次都要访问MySQL了

2、支持多种数据结构

我们所知道的MySQL就是以表的形式存储数据的,就是关系型数据库,但是Redis支持多种数据结构,可以适合多种业务场景,属于非关系型数据库,它支持一下几种方式

数据结构 基本特点 常见应用
String 保存字符串,也可以用于整数计数等操作 缓存、验证码、计数器
Hash 保存多个字段与对应的值 用户信息、对象属性
List 有序列表,支持从两端插入和弹出 简单队列
Set 保存不重复的成员 去重、集合运算、点赞用户集合
Sorted Set 成员关联分数,支持按分数排序 排行榜
Stream 消息流,支持消费者组等功能 消息处理、异步任务

3、支持编程能力:Lua 脚本

Redis不仅可以使用命令的方式来操作,还可以通过lua脚本在Redis服务端执行操作,这样的能力有什么用呢:可以批量执行一些操作,带有一些逻辑,就例如一个业务需要执行多个Redis命令,每一次执行命令都需要客户端与Redis进行一次网络通信,就会产生额外的通信开销,这个时候我们就可以使用lua脚本,将多个操作组合起来,再服务端一次执行

4、 支持扩展:Redis Modules

Redis Modules 是 Redis 提供的模块扩展机制,可以通过 C 等支持的开发接口,为 Redis 增加额外的数据类型或命令等能力

可以通过扩展实现一些特定以及专门的功能

5、 支持持久化:RDB 与 AOF

前面不是说Redis主要是写在内存中的嘛,内存是数据容易丢失的,但是我们的Redis还可以支持持久化,Redis是内存为主,硬盘为辅的这样一个形式,当我们进程结束或者系统重启的时候,就会将数据写到硬盘上面,相当于是备份了,当重启之后,再从硬盘之中写回来

RDB:快照持久化

可以理解为是给当前的数据状态拍一张快照,可以保存某个时刻的数据状态,生产的文件通常比较紧凑,适合用于备份和数据恢复,但是Redis在两张快照之间发生了故障,那么还是会有数据的丢失的

AOF:追加文件持久化

AOF 会记录改变数据集的写操作,以便在恢复时重新执行这些操作,这个就可以通过重写操作恢复数据,数据保护程度与刷盘策略等配置有关,日志可能会占用较多的磁盘空间,也会产生响应的维护成本

因此,Redis 使用内存不意味着它完全没有持久化能力;支持持久化也不意味着它绝对不会丢失数据。

在实际开发中,需要根据业务重要程度选择持久化策略。对于订单、支付等核心业务数据,仍然需要设计合适的数据库持久化、事务和备份方案

6、 支持集群与数据分片

这个也就是类似于分库分表,当我们的数据持续的增长,单个节点就可能无法满足存储容量或者访问负载的要求,这个时候我们就可以引入多个主机,部署多个节点,每一个节点负责一部分的数据

7 、支持高可用

为了防止一些数据的故障,以及提高可用性,我们可以使用主从复制和故障转移等机制

例如:

复制代码
             主节点
                |
             数据复制
                |
         +------+------+
         |             |
         v             v
       从节点 A       从节点 B

主节点可以将数据复制到从节点。当主节点出现故障时,配置了相应故障转移机制的系统可以将某个从节点提升为新的主节点

二、Redis 为什么快?

1,Redis主要访问内存

2,核心功能都是比较简单的逻辑

3,从网络角度,Redis使用IO多路复用的方式(使用一个线程,管理多个socket)

4,多使用单线程模型,可以减少不必要的线程之间的竞争开销

三、Redis 的常见应用场景

1 、应用场景一:缓存热点数据

缓存是Redis最常见的应用场景之一,就例如电商网站中的热门产品,我们就可以采用之前讲过的缓存命中以及未命中的这样一个机制(命中:Redis当中有就直接访问,未命中:没有就先访问MySQL然后再将数据写进Redis)来减少查询MySQL的次数

2、 应用场景二:Session 会话存储

之前讲过的cookie以及session是存储用户信息,管理用户会话状态的一种机制,就会出现下面这种情况:当我们的第一次访问到达应用服务器a中,然后session就会保存在a的服务器当中,但是当我们第二次访问的时候,由于负载均衡机制,将我们的会话划分到应用服务器b当中了,但是b当中摸鱼保存我们的session,那我们就无法获取上一次读取的会话,也就可能出现没办法返回对应的数据,那么常见的解决办法就是将会话数据存放在Redis等共享存储中,来保证a,b都可以拿到session

复制代码
浏览器
   |
   v
负载均衡
   |
   +--------+--------+
   |                 |
   v                 v
应用服务器 A       应用服务器 B
   |                 |
   +--------+--------+
            |
            v
          Redis
        共享会话数据

3 、应用场景三:消息队列

有些操作不需要再用户请求期间完成所有的操作,也就是所谓的回头等通知,这个时候就可以考虑消息机制,也就是生产者消费者模型

例如,生产者可以将任务放入一个队列,消费者再从队列中获取任务进行处理。

复制代码
业务请求
   |
   v
生产者
   |
   v
Redis 消息结构
   |
   v
消费者
   |
   v
执行后台任务

这种方式可以在合适的场景中帮助系统解耦(一个模块对另一个模块的依赖程度),并将部分耗时工作异步化

六、总结

通过本文,我们从 Redis 的核心特性出发,进一步理解了它为什么能够用于多种实际业务。

首先,Redis 主要利用内存保存和操作数据,并提供多种数据结构,适合处理大量需要快速访问的数据。

其次,Redis 支持 Lua 脚本、模块扩展、RDB 与 AOF 持久化、数据分片以及高可用相关机制,使它不仅能够用于简单缓存,也可以在分布式系统中承担更丰富的职责。

最后,我们学习了 Redis 的常见应用场景,包括缓存热点数据、共享 Session、消息处理等。

对于 Java 后端开发者来说,需要记住的不是所有命令,而是每种特性能够解决什么问题

相关推荐
Oiiouui1 小时前
Godot-GridGame架构数据层篇
架构·godot·1024程序员节
Random Glow1 小时前
一条 SQL 从输入到返回,中间经历了什么
数据库·后端·mysql·性能优化·innodb·1024程序员节
宝绿特塑业再生科技1 小时前
板材挤出过程振动与尺寸波动:户外家具行业转向再生料后,工艺稳定性成为核心议题
科技·1024程序员节·户外家具·再生塑料·塑木桌椅·hdpe再生颗粒
comedate1 小时前
【SMLib】SMLib 五层架构深度解析:SMLib / SM_API / SM_API_USD / SmPyLib 各管什么
架构·cad·1024程序员节·openusd·smlib·nurbs
纪念 2291 小时前
C++ 算法(四)
1024程序员节
餐赢计餐饮策划设计1 小时前
如何判断国潮养生设计是否适合自己?
python·1024程序员节
lzx_0021 小时前
Linux 开发工具(六) 版本管理器git的简单使用
git·1024程序员节
讯捷蓝达1 小时前
华为 2288H V5 服务器不开机,显示 “888“ 是不是通病?
1024程序员节
Tsuki_tl1 小时前
【优选算法 — 双指针】经典例题题解+算法总结
算法·蓝桥杯·力扣·刷题·双指针·1024程序员节·优选算法