分布式中间件:Redis介绍
目录
Redis 概述
Redis 的特点
高性能
丰富的数据结构
持久化
分布式特性
简单易用
Redis 的数据结构
字符串(String)
哈希(Hash)
列表(List)
集合(Set)
有序集合(Sorted Set)
Redis 的应用场景
缓存
消息队列
分布式锁
计数器
排行榜
在当今的分布式系统开发中,中间件起着至关重要的作用。其中,Redis 作为一款高性能的键值对存储数据库,在缓存、消息队列、分布式锁等多个领域都有着广泛的应用。本文将带您深入了解 Redis 的基本概念、特点、数据结构以及常见的应用场景,帮助您全面认识这个强大的分布式中间件。
Redis 概述
Redis(Remote Dictionary Server)是一个开源的、使用 C 语言编写的、支持网络、可基于内存也可持久化的日志型、键值对存储数据库。它由 Salvatore Sanfilippo 开发,于 2009 年首次发布。Redis 以其高性能、丰富的数据结构和简单易用的特点,迅速在开发者社区中流行起来,成为分布式系统中不可或缺的一部分。
Redis 的特点
高性能
Redis 是基于内存的数据库,数据存储在内存中,读写速度极快。官方给出的测试数据显示,Redis 可以达到 10 万级别的 QPS(每秒查询率),这使得它非常适合处理高并发的读写请求。
丰富的数据结构
Redis 支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。不同的数据结构适用于不同的业务场景,开发者可以根据具体需求选择合适的数据结构来存储和处理数据。
持久化
Redis 支持两种持久化方式:RDB(Redis Database)和 AOF(Append Only File)。RDB 是将 Redis 在某个时间点的数据快照保存到磁盘上,AOF 则是将 Redis 的写操作以日志的形式记录下来。通过持久化机制,Redis 可以在服务器重启后恢复数据,保证数据的安全性和可靠性。
分布式特性
Redis 提供了主从复制、哨兵和集群等分布式解决方案。主从复制可以实现数据的备份和读写分离,哨兵可以自动监控 Redis 节点的状态并进行故障转移,集群则可以将数据分散存储在多个节点上,提高系统的扩展性和可用性。
简单易用
Redis 的 API 非常简单,易于学习和使用。它提供了多种客户端库,支持多种编程语言,如 Java、Python、C# 等,方便开发者在不同的项目中使用 Redis。
Redis 的数据结构
字符串(String)
字符串是 Redis 最基本的数据结构,它可以存储任意类型的数据,如文本、数字、二进制数据等。字符串类型的操作非常简单,常见的操作包括设置值(SET)、获取值(GET)、递增(INCR)、递减(DECR)等。以下是一个使用 Python 客户端操作 Redis 字符串的示例:
哈希(Hash)
哈希是一个键值对的集合,类似于 Python 中的字典。哈希类型适合存储对象,每个对象可以有多个属性。常见的操作包括设置字段值(HSET)、获取字段值(HGET)、获取所有字段和值(HGETALL)等。以下是一个使用 Java 客户端操作 Redis 哈希的示例:
列表(List)
列表是一个有序的字符串列表,类似于 Python 中的列表。列表可以从两端进行插入和删除操作,适合实现队列和栈等数据结构。常见的操作包括从左侧插入元素(LPUSH)、从右侧插入元素(RPUSH)、从左侧弹出元素(LPOP)、从右侧弹出元素(RPOP)等。
集合(Set)
集合是一个无序且唯一的字符串集合,类似于 Python 中的集合。集合支持交集、并集、差集等操作,适合实现去重、共同好友等功能。常见的操作包括添加元素(SADD)、删除元素(SREM)、获取所有元素(SMEMBERS)等。
有序集合(Sorted Set)
有序集合是一个有序的字符串集合,每个元素都有一个分数(score),根据分数进行排序。有序集合适合实现排行榜、热门列表等功能。常见的操作包括添加元素(ZADD)、获取指定范围的元素(ZRANGE)、获取元素的分数(ZSCORE)等。
Redis 的应用场景
缓存
Redis 最常见的应用场景就是作为缓存。由于 Redis 的高性能和快速读写能力,可以将经常访问的数据存储在 Redis 中,减少对数据库的访问压力,提高系统的响应速度。例如,将用户信息、商品信息等缓存到 Redis 中,当用户访问这些信息时,首先从 Redis 中获取,如果 Redis 中不存在,则从数据库中获取并更新到 Redis 中。
消息队列
Redis 的列表数据结构可以用于实现简单的消息队列。生产者可以将消息通过 LPUSH 命令插入到列表的左侧,消费者可以通过 RPOP 命令从列表的右侧弹出消息进行处理。Redis 的列表还支持阻塞操作,当列表为空时,消费者可以阻塞等待,直到有新的消息到来。
分布式锁
在分布式系统中,多个进程或线程可能会同时访问共享资源,为了保证数据的一致性,需要使用分布式锁。Redis 可以通过 SETNX(Set if Not eXists)命令来实现分布式锁。当一个进程或线程需要访问共享资源时,首先尝试使用 SETNX 命令在 Redis 中设置一个锁,如果设置成功,则表示获取到了锁,可以进行操作;操作完成后,使用 DEL 命令释放锁。
计数器
Redis 的字符串类型支持原子性的递增和递减操作,非常适合实现计数器功能。例如,统计网站的访问量、文章的阅读量等,可以使用 INCR 命令对计数器进行递增操作。
排行榜
Redis 的有序集合数据结构可以用于实现排行榜功能。每个元素对应一个分数,根据分数进行排序。例如,游戏中的玩家排行榜、商品的销售排行榜等,可以使用 ZADD 命令添加元素和分数,使用 ZRANGE 命令获取排行榜信息。
Redis 作为一款高性能、功能丰富的分布式中间件,在分布式系统中有着广泛的应用。通过本文的介绍,我们了解了 Redis 的基本概念、特点、数据结构以及常见的应用场景。在实际开发中,我们可以根据具体的业务需求,合理地使用 Redis,提高系统的性能和可用性。在后续的文章中,我们将继续深入学习 Redis 的持久化、分布式等高级特性,以及如何在项目中使用 Redis 进行开发。
相关文章:
分布式中间件:Redis介绍
目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串(String) 哈希(Hash) 列表(List) 集合(Set) 有序集合&…...
服务器和本地电脑之间如何传输文件
在服务器和本地电脑之间传输文件可以通过多种方式实现,常见的方法包括使用 SFTP(安全文件传输协议)、SCP(安全复制协议)、FTP(文件传输协议)、rsync、以及 云存储 等工具。以下是几种常见的方法…...

经验分享:用一张表解决并发冲突!数据库事务锁的核心实现逻辑
背景 对于一些内部使用的管理系统来说,可能没有引入Redis,又想基于现有的基础设施处理并发问题,而数据库是每个应用都避不开的基础设施之一,因此分享个我曾经维护过的一个系统中,使用数据库表来实现事务锁的方式。 之…...

嵌入式学习前要了解的基础知识
一、电压和电流 在嵌入式开发中,电压和电流是两个基本的电气概念,对于理解和设计电子电路至关重要。它们直接影响到嵌入式系统的性能、功耗、可靠性和安全性。 电压(Voltage) 电压是电场力推动电荷移动的能力,通常以…...
RTC、直播、点播技术对比|腾讯云/即构/声网如何选型 — 2025 版
前言 作为一个有多年实战经验的开发者,在音视频技术领域我深刻体会到 RTC(实时通信)、直播和点播三者的不同。虽然它们的核心都涉及音视频内容的传输,但在实际应用中,它们的技术实现、使用场景以及所面临的挑战各不相…...

《白帽子讲 Web 安全》之文件操作安全
目录 引言 (一)文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中,部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验,试图以此阻止非法文件上传…...
yolov8训练模型、测试视频
yolov8先训练生成best.pt文件,用这个生成的模型进行视频的测试 因为本来用的代码生成的测试视频打不开,格式应该是损坏了,或者部分帧没有正常保存吧。 修改了一下代码,现状可以正常打开生成的视频了。 1、训练代码train.py im…...
03.网络编程套接字(二)
文章目录 简单的TCP网络程序 服务端创建套接字 服务端绑定 服务端监听 服务端获取连接 服务端处理请求 客户端创建套接字 客户端发起请求 服务器测试 单执行流服务器的弊端 多进程版的TCP网络程序 线程池版的TCP网络程序 简单的TCP网络程序 服务端创建套接字 我…...

一周学会Flask3 Python Web开发-Flask3之表单处理WTForms安装与定义WTForms表单类
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们平时开发项目,都会用到表单,编写表单,提交表单,验证表单,如果…...
Git基本命令索引
GIT基本命令索引 创建代码库修改和提交代码日志管理远程操作操作分支 创建代码库 操作指令初始化仓库git init克隆远程仓库git clone 修改和提交代码 操作指令查看文件状态git status文件暂存git add文件比较git diff文件提交git commit回滚版本git reset重命名或者移动工作…...

【论文阅读笔记】SL-YOLO(2025/1/13) | 小目标检测 | HEPAN、C2fDCB轻量化模块
目录 摘要 1 引言 2 相关工作 3 方法 3.1 为小目标检测增加一个头 3.2 优化网络结构 3.3 改进轻量化模块 3.3.1 C2fDCB 3.3.2 SCDown 4 实验 4.1 数据集 4.2 实验环境 4.3 与其他模型的比较 4.4 消融研究 ▲不同网络结构的分析 ▲不同模块的分析 ▲不同降采样…...

MySQL SQL 优化专题
MySQL SQL 优化专题 1. 插入数据优化 -- 普通插入(不推荐) INSERT INTO tb_user VALUES(1,tom); INSERT INTO tb_user VALUES(2,cat); INSERT INTO tb_user VALUES(3,jerry);-- 优化方案1:批量插入(推荐,不建议超过1…...

Mac上安装Pycharm
说明:仅供参考,是自己的安装流程,以免以后自己想不起来来看看的笔记 官网地址:https://www.jetbrains.com/pycharm/ 1、点击Download,跳转到下一个页面 2、MAC,选择Mac OS,在Pycharm Professio…...
flask框架基础入门学习教程
文章目录 前言1. 环境搭建1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境(可选但推荐)1.4 安装 Flask 2. 第一个 Flask 应用3. 路由和视图函数3.1 基本路由3.2 动态路由3.3 路由参数类型 4. 请求和响应4.1 获取请求数据4.2 响应对象 5. 模板渲染6.…...

Qt显示一个hello world
一、显示思路 思路一:通过图形化方式,界面上创建出一个控件显示。 思路二:通过编写C代码在界面上创建控件显示。 二、思路一实现 点开 Froms 的 widget.ui,拖拽 label 控件,显示 hello world 即可。 qmake 基于 .…...
MySQL快速搭建主从复制
一、基于位点的主从复制部署流程 确定主库Binlog是否开启修改主从server_id主库导出数据从库导入数据确定主库备份时的位点在从库配置主库信息查看复制状态并测试数据是否同步 二、准备阶段(主库和从库配置都需要修改) 1、确定主库Binlog是否开启 2、修改主从se…...
力扣-动态规划-674 最长连续递增序列
思路 dp数组定义:以i为结尾的最长连续递增序列递推公式: if(nums[i-1] < nums[i]) dp[i] dp[i-1] 1; dp数组初始化:都为1遍历顺序:顺序时间复杂度: 代码 class Solution { public:int findLengthOfLCIS(v…...

在笔记本电脑上用DeepSeek搭建个人知识库
最近DeepSeek爆火,试用DeepSeek的企业和个人越来越多。最常见的应用场景就是知识库和知识问答。所以本人也试用了一下,在笔记本电脑上部署DeepSeek并使用开源工具搭建一套知识库,实现完全在本地环境下使用本地文档搭建个人知识库。操作过程共…...

leetcode 94. 二叉树的中序遍历
题目如下 做了那么多道难题,给自己放放松。通过代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int …...
YOLOv12:目标检测新时代的破局者
目录 一、YOLOv12 横空出世二、YOLOv12 的性能飞跃2.1 多规模优势2.2 对比超越 三、技术创新与原理剖析3.1 区域注意力模块(Area Attention,A2)3.2 残差高效层聚合网络(R-ELAN)3.3 架构优化细节 四、实验验证与结果分析…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...