Redis(非关系型数据库)的作用 详细解读
edis(Remote Dictionary Server)是一个开源的、高性能的、基于内存的数据结构存储系统。它具有极高的读写性能,并且能够支持多种数据结构的存储。Redis 最初的设计目标是作为一个缓存解决方案,但随着其功能的不断扩展,Redis 被广泛应用于各种场景,成为许多大型互联网系统中不可或缺的组件。
本文将详细探讨 Redis 的多种作用,包括它作为缓存、消息队列、会话存储、实时数据分析、排行榜等方面的应用,以及 Redis 在高可用性和分布式场景下的作用。
1. Redis作为缓存
1.1 缓存的基本概念
缓存是指将数据存储在离用户更近的地方(通常是内存中),从而加速数据访问速度,减少后端系统的负载。缓存通常用于存储频繁访问的数据,避免重复计算或查询,提高系统的性能。
Redis 作为一个高性能的内存存储系统,天然适合充当缓存系统。与传统数据库相比,Redis 的读写速度快得多,因此它能够显著减少数据访问的延迟,提升应用的响应速度。
1.2 Redis缓存的应用场景
Redis 在缓存领域的应用非常广泛,常见的场景包括:
-
数据库缓存:在数据库查询操作频繁的系统中,Redis 可以缓存数据库查询结果。通过将查询结果存储到 Redis 中,下次相同的查询可以直接从 Redis 中获取,从而避免了数据库的重复查询。
-
页面缓存:对于一些静态或半静态的页面,Redis 可以将渲染结果缓存起来。当有多个用户请求相同页面时,Redis 可以直接返回缓存的页面,从而减少了 Web 服务器和数据库的负载。
-
对象缓存:Redis 不仅支持基本的键值对缓存,还支持哈希、列表、集合等复杂数据结构,因此可以缓存更多类型的数据,如用户会话、商品信息、购物车内容等。
1.3 Redis缓存的优势
- 低延迟:Redis 基于内存存储,读取数据的速度非常快,响应延迟通常在毫秒级别。
- 高并发:Redis 支持高并发的读写操作,能够同时处理数万甚至数百万的请求。
- 丰富的数据类型:Redis 支持字符串、哈希、列表、集合、有序集合等多种数据类型,能够灵活地处理各种缓存需求。
- 持久化:Redis 提供了两种持久化方式(RDB 快照和 AOF 日志),即使在发生故障时,缓存数据也不会丢失。
1.4 缓存穿透与缓存雪崩
-
缓存穿透:指的是用户请求的数据根本不在缓存中,且无法通过后端系统查询到。例如,恶意用户或攻击者通过不断请求不存在的数据,使得缓存失效,并且频繁访问数据库。这种情况会给后端数据库带来巨大的压力。
解决方法:可以使用布隆过滤器(Bloom Filter)来拦截不存在的请求,避免无效查询频繁访问数据库。
-
缓存雪崩:指的是缓存中存储的数据大量失效,导致大量请求直接访问数据库,造成数据库压力激增。通常是因为缓存的过期时间设置得过短,或者缓存失效时间集中。
解决方法:可以采用随机设置缓存过期时间,避免缓存失效时间的集中,同时在高并发场景下,使用互斥锁来防止缓存穿透。
2. Redis作为消息队列
2.1 消息队列的基本概念
消息队列是一种用于解耦系统组件、实现异步处理的技术。它通过将消息放入队列中,允许生产者将消息发送到队列,消费者则从队列中取出消息并处理。消息队列可以有效地缓解系统的压力,提升系统的吞吐量。
Redis 提供了列表(List)类型以及发布/订阅(Pub/Sub)功能,使其能够很好地充当消息队列的角色。
2.2 Redis消息队列的实现方式
Redis 提供了多种方式实现消息队列:
-
基于列表的队列:使用 Redis 列表类型的 LPUSH 和 RPOP 命令,生产者将消息推送到队列的左端,消费者从队列的右端弹出消息。这是一种典型的先进先出(FIFO)队列。
LPUSH queue message # 生产者推送消息到队列
RPOP queue # 消费者从队列中弹出消息
基于发布/订阅的队列:Redis 的发布/订阅模式允许生产者将消息发布到一个频道,消费者订阅该频道并接收消息。该模式适用于广播消息和实时通知系统。
PUBLISH channel message # 生产者发布消息
SUBSCRIBE channel # 消费者订阅频道接收消息
2.3 Redis消息队列的优势
- 高效性:Redis 基于内存存储,消息的推送和弹出操作速度非常快,能够高效地处理大量的消息。
- 高可用性:通过 Redis Sentinel 或 Redis Cluster,消息队列可以在分布式环境中实现高可用性和负载均衡。
- 支持多种消息模型:Redis 支持队列模型(List)和发布/订阅模型(Pub/Sub),可以根据不同的应用场景选择最合适的方式。
2.4 消息队列的应用场景
- 异步任务处理:将耗时的任务放入队列,由后台消费者异步处理,避免影响用户体验。
- 任务调度:定时任务或批量处理任务可以通过 Redis 实现任务调度和消息的传递。
- 事件通知系统:使用 Redis 的发布/订阅模式来实现实时通知,如消息推送、系统报警等。
3. Redis作为会话存储
3.1 会话存储的基本概念
会话存储是指在 Web 应用中保存用户会话信息的机制。通常,用户在与 Web 应用交互时,会创建一个会话,服务器会为每个用户分配一个唯一的标识符(如 session_id),并将该用户的会话信息存储在服务器中。
在传统的单机 Web 应用中,可以将会话数据存储在内存中,问题是如果应用被水平扩展到多个节点,如何共享会话数据成为一个问题。Redis 的出现,解决了这一问题。
3.2 Redis在会话存储中的应用
Redis 通过提供高速的读写性能和支持分布式存储,使得它成为存储会话数据的理想选择。通过将会话信息存储在 Redis 中,不仅能够支持分布式系统中的会话共享,还能够提升会话存储的读取和更新效率。
会话存储的典型应用场景包括:
- Web 应用的用户认证:通过 Redis 存储用户的登录状态、权限信息等。
- 分布式会话管理:在分布式环境下,多个 Web 服务器共享 Redis 存储的会话数据,确保用户请求能够被正确路由到相应的服务器。
3.3 Redis在会话存储中的优势
- 高效的存储与读取:Redis 提供的高效读写能力可以保证会话数据的快速获取和更新。
- 易于扩展:在需要扩展 Web 应用时,Redis 作为外部存储可以轻松支持新的应用节点。
- 持久化:Redis 提供的持久化机制可以确保会话数据不丢失,尤其是在使用 AOF 和 RDB 进行持久化时,可以保障数据的安全性。
4. Redis用于实时数据分析
4.1 实时数据分析的需求
在现代互联网应用中,实时数据分析已经成为了一种重要的需求。实时数据分析通常涉及对大量数据进行即时处理、统计和查询。例如,如何统计某一页面的访问量、某个事件的参与人数、某个商品的购买量等。
Redis 提供了多种数据结构,如计数器、位图、HyperLogLog、Sorted Set 等,这些数据结构能够高效地支持实时数据统计。
4.2 Redis在实时数据分析中的应用
-
计数器:通过 Redis 字符串类型实现高效的计数器,例如,统计页面访问量、商品点击量等。使用 Redis 的 INCR 命令可以快速地对某个计数器进行递增操作。
INCR page_views # 递增页面访问量
去重计数:Redis 的 HyperLogLog 数据结构可以高效地进行去重计数。例如,统计唯一用户的数量。
PFADD unique_users user_id # 记录唯一用户
PFCOUNT unique_users # 获取唯一用户的计数
活跃用户统计:Redis 位图(Bitmap)可以用来统计活跃用户数量。例如,可以使用 Redis 位图记录用户是否在某天访问了应用,从而统计活跃用户数。
SETBIT active_users date user_id # 记录用户是否活跃
BITCOUNT active_users # 统计活跃用户数
排行榜:Redis 的有序集合(Sorted Set)可以用于实现排行榜,支持按分数进行排序,例如游戏中的排名、社交网络中的点赞数等。
ZADD leaderboard score user_id # 添加或更新排行榜数据
ZREVRANGE leaderboard 0 10 WITHSCORES # 获取前 10 名
4.3 Redis实时数据分析的优势
- 高效性:Redis 在内存中存储数据,因此可以高效地处理大规模的实时数据。
- 低延迟:由于 Redis 是内存数据库,数据读取和写入的延迟非常低,适合实时分析。
- 灵活性:Redis 提供了丰富的数据结构,可以根据不同的业务需求选择最合适的数据结构来存储和处理数据。
5. Redis在高可用性和分布式系统中的作用
5.1 高可用性和容错
在生产环境中,Redis 通过 Sentinel 提供高可用性(HA)。当主节点发生故障时,Sentinel 可以自动切换到备份节点,确保 Redis 服务的高可用性。
5.2 Redis Cluster
Redis Cluster 通过数据分片(sharding)实现水平扩展,能够将数据分散到多个 Redis 节点上,支持高并发的访问。Redis Cluster 支持自动故障转移,保证了系统的高可用性和数据的一致性。
6. 总结
Redis 是一个非常强大的工具,它不仅仅是一个缓存系统,它在消息队列、会话存储、实时数据分析等多个领域都有广泛应用。Redis 的高效性、丰富的数据结构以及强大的持久化、分布式特性,使它成为许多现代互联网系统中不可或缺的一部分。在生产环境中,合理地使用 Redis 可以大大提升系统的性能、可靠性和扩展性。
相关文章:
Redis(非关系型数据库)的作用 详细解读
edis(Remote Dictionary Server)是一个开源的、高性能的、基于内存的数据结构存储系统。它具有极高的读写性能,并且能够支持多种数据结构的存储。Redis 最初的设计目标是作为一个缓存解决方案,但随着其功能的不断扩展,…...

互联网视频推拉流EasyDSS视频直播点播平台视频转码有哪些技术特点和应用?
视频转码本质上是一个先解码再编码的过程。在转码过程中,原始视频码流首先被解码成原始图像数据,然后再根据目标编码标准、分辨率、帧率、码率等参数重新进行编码。这样,转换前后的码流可能遵循相同的视频编码标准,也可能不遵循。…...
python之多元线性回归
目录 前言实战 前言 多元线性回归是回归分析中的一种复杂模型,它考虑了多个输入变量对输出变量的影响。与一元线性回归不同,多元线性回归通过引入多个因素,更全面地建模了系统关系。 多元线性回归模型的表达式为: f ( X ) K T …...

学习threejs,使用设置lightMap光照贴图创建阴影效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshLambertMaterial…...

一,SQL注入解题(猫舍)
封神台 第一章:为了女神小芳! Tips: 通过sql注入拿到管理员密码! 尤里正在追女神小芳,在得知小芳开了一家公司后,尤里通过whois查询发现了小芳公司网站 学过一点黑客技术的他,想在女神面前炫炫技。于是他…...

海康大华宇视视频平台EasyCVR私有化部署视频平台海康ISUP是什么?如何接入到EasyCVR?
在现代安防领域,随着技术的发展和需求的增加,对于视频监控系统的远程管理和互联互通能力提出了更高的要求。海康威视的ISUP协议(以及功能相似的EHOME协议)因此应运而生,它们为不具备固定IP接入的设备提供了一种有效的中…...

Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚
我的个人主页 我的专栏:Java-数据结构,希望能帮助到大家!!!点赞❤ 收藏❤ 前言:在 Java编程的广袤世界里,数据结构犹如精巧的建筑蓝图,决定着程序在数据处理与存储时的效率、灵活性以…...

windows下安装wsl的ubuntu,同时配置深度学习环境
写在前面,本次文章只是个人学习记录,不具备教程的作用。个别信息是网上的,我会标注,个人是gpt生成的 安装wsl 直接看这个就行;可以不用备份软件源。 https://blog.csdn.net/weixin_44301630/article/details/1223900…...

开展网络安全成熟度评估:业务分析师的工具和技术
想象一下,您坐在飞机驾驶舱内。起飞前,您需要确保所有系统(从发动机到导航工具)均正常运行。现在,将您的业务视为飞机,将网络安全视为飞行前必须检查的系统。就像飞行员依赖检查表一样,业务分析师使用网络安全成熟度评估来评估组织对网络威胁的准备程度。这些评估可帮助…...
Maven Surefire 插件简介
Maven Surefire 插件是 Maven 构建系统中的一个关键组件,专门用于在构建生命周期中执行单元测试。 它通常与 Maven 构建生命周期的测试阶段绑定,确保所有单元测试在项目编译后和打包前被执行。 最新版本 Maven Surefire 插件的最新版本为 3.5.2。 使…...

基于微信小程序的平价药房管理系统+LW参考示例
1.项目介绍 系统角色:管理员、医生、普通用户功能模块:用户管理、医生管理、药品分类管理、药品信息管理、在线问诊管理、生活常识管理、日常提醒管理、过期处理、订单管理等技术选型:SpringBoot,Vue,uniapp等测试环境…...
react 前端最后阶段静态服务器启动命令
这个错误是因为你还没有安装 serve 工具。让我们一步步解决: 首先全局安装 serve: npm install -g serve如果上面的命令报错,可能是因为权限问题,可以尝试: 安装完成后,再运行: Windows 下使用…...
Flink中普通API的使用
本篇文章从Source、Transformation(转换因子)、sink这三个地方进行讲解 Source: 创建DataStream本地文件SocketKafka Transformation(转换因子): mapFlatMapFilterKeyByReduceUnion和connectSide Outpu…...
高性能 ArkUI 应用开发:复杂 UI 场景中的内存管理与 XML 优化
本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。 主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。 本文为原创内容,任何形式的转载必须注明出处及原作者。 在开发高性能 ArkUI 应…...

用天翼云搭建一个HivisionIDPhoto证件照处理网站
世人不必记我,我不记世人。 HivisionIDPhoto证件照处理网站 世人不必记我,我不记世人。项目地址项目搭建与修改前端后端遇到的坑 成果图 前段时间工作需要频繁处理证件照,当时同事推荐一个证件照小程序(要看广告)&…...

【算法一周目】滑动窗口(2)
目录 水果成篮 解题思路 代码实现 找到字符串中所有字母异位词 解题思路 代码实现 串联所有单词的子串 解题思路 代码实现 最小覆盖子串 解题思路 代码实现 水果成篮 题目链接:904. 水果成篮 题目描述: 你正在探访一家农场,农场…...
Zustand:一个轻量级的React状态管理库
文章目录 前言一、安装Zustand二、使用Zustand三、实际案例结语 前言 在现代Web开发中,状态管理是一个常见的需求,特别是在构建大型或复杂的单页面应用程序(SPA)时。React等框架虽然提供了基本的状态管理功能,但对于复…...
C++练级计划->《单例模式》懒汉和饿汉
目录 单例模式是什么? 单例模式的应用: 饿汉单例模式: 1.实现: 2.理解: 懒汉单例模式: 1.实现: 2.理解: 懒汉和饿汉的优缺点 饿汉模式的优点: 饿汉模式的缺点&a…...
SQL for XML
关系数据模型与SQL SQL for XML 模式名功能RAW返回的行作为元素,列值作为元素的属性AUTO返回表名对应节点名称的元素,每列的属性作为元素的属性输出输出,可形成简单嵌套结构EXPLICIT通过SELECT语法定义输出XML结构PATH列名或列别名作为XPAT…...

如何使用GCC手动编译stm32程序
如何不使用任何IDE(集成开发环境)编译stm32程序? 集成开发环境将编辑器、编译器、链接器、调试器等开发工具集成在一个统一的软件中,使得开发人员可以更加简单、高效地完成软件开发过程。如果我们不使用KEIL,IAR等集成开发环境,…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...