2023.8.1 Redis 的基本介绍

news2025/1/12 8:55:43

目录

 Redis 的介绍

Redis 用作缓存和存储 session 信息

Redis 用作数据库

消息队列

消息队列是什么?

Redis 用作消息队列


 Redis 的介绍

特点:

  • 内存中存储数据:奠定了 Redis 进行访问和存储时的快
  • 可编程性:支持使用 Lua 编写脚本,这些脚本可以在 Redis 服务器端执行。通过脚本,可以实现复杂的数据操作和逻辑,比如批量操作、事务、原子性操作等
  • 可扩展性:Redis 原有的功能基础上通过 C、C++、Rust 这些语言编写 Redis 扩展,Redis自身已经提供很多数据结构和命令,可通过扩展让 Redis 支持更多数据结构和命令
  • 持久化:在内存中存储数据可能因为进程退出或系统重启导致数据的丢失,但Redis以内存为主、硬盘为辅,硬盘对数据进行备份,Redis 重启则会重新加载硬盘中备份数据到内存上,从而保证持久化
  • 支持集群:Redis 提供了一种分布式架构,允许将数据分布在多个节点上,以实现数据的水平扩展和高可用性。一个 Redis 的所能存储的数据空间是有限的,引入多个主机,部署多个 Redis 节点,对数据进行分散存储,扩大存储空间
  • 高可用性:Redis 支持主从结构,从节点相当于主节点的备份,当哪一个节点故障时,Redis 集群可以自动进行故障转移,将一个从节点提升为新的主节点,以保持服务的可用性。故障转移过程中,集群会重新分配数据槽,并重新配置主从关系

基本解释:

相较于单机程序直接通过变量在内存中存储数据,当我们想在分布式系统中让多个服务器共享同一份数据又想让数据存储在内存中,Redis 便是一个很好的选择!

具体解释:

进程具有隔离性,每个进程都是被隔离开的,进程 A 无法直接读进程 B 中的数据,但一个分布式系统往往会涉及到多个进程,且这多个进程都分布在不同的主机上,那么当我们想访问其他进程中的变量,这是十分困难的。而 Redis 则针对我们上述的需求点进行了一个封装。网络作为进程间的通信关键介质,Redis 就是基于网络可以把自己内存中的变量给别的进程,甚至别的主机的进程进行使用!


设计初心:

Redis 最初就是用来作为一个“消息中间件”(消息队列)来使用的,分布式系统下的生产者消费者模型,但很少会使用 Redis 来作为消息中间件,因为业界有更多专业的消息中间件进行使用!当前 Redis 主要还是被用作数据库和缓存!

Redis 用作缓存和存储 session 信息

在 Web 应用程序中,session 用于跟踪和存储用户的会话状态信息!


传统做法:

  • 将 session 信息存储在应用程序的内存中,但是当进行分布式部署应用程序时便会存在问题,当用户再次发起登录请求时,负载均衡器应该去哪台服务器上寻找用户之前登录的 session 信息
  • 当然我们可用通过 userId 来进行服务器的分配,每个 userId 绑定一个服务器,从而该用户的所有请求将访问同一台服务器,。但是一旦程序重启,便会丢失会话!


Redis 缓存做法:

  • 将所有 session 会话都存储到 Redis 上,让所有服务器从 Redis 中拿去相应的 session 信息,同时即使程序重启,由于 Redis 的持久性,会话也不会消失!

Redis 用作数据库

基本点:

  • 因为 Redis 是在内存中进行存储,所以其访问速度十分的快,相较于 MySQL 是在硬盘中进行存储,其访问速度是十分慢的。从而当在一些对性能要求很高的互联网产品中,Redis 也能被当作数据库进行使用!
  • Redis 与 MySQL 相比 其最大的劣势为存储空间有限,从而对于一些性能要求不高且需要较多存储空间的互联网产品,MySQL 还是作为首要选择!
  • 当然我们也可以将 Redis 和 MySQL 结合起来使用,从而达到存储空间又大且访问速度又快的需求。‘ 二八原则 ’ ——> 20% 的热点数据能满足 80% 的访问需求。从而我们可以将热点数据放到 Redis 中进行存储,以满足我们大部分的访问需求!但是我们还得承担相应的代价,其一是系统的复杂程度大大提高!,其二是当数据发生修改,还涉及到 Redis 和 MySQL 之间的数据同步问题!可利用该点将 Redis 用作缓存!

场景模拟:

存储用户访问量、点赞数量,我们选择使用 Redis 进行存储还是直接在内存中创建一个 Hashmap 存储呢?

  • 引入 Redis 进行存储会更慢,因为 redis 的存储 先通过网络再操作内存,而变量可直接在内存操作
  • 引入 Redis 可以保持数据持久化,同时也利于扩展为分布式系统


总结:

 我们可以根据互联网产品具体的情况进行分析和取舍,权衡利弊选择一个合适的存储方式!

消息队列

消息队列是什么?

基本解释:

  • 消息队列是一种通信模式,用于应用程序和系统组件之间传递消息,其提供了一种可靠的、异步的通信机制,使得不同的应用程序或系统之间能够解耦、可靠地交换数据

特点:

  • 异步通信:发送者和接收者之间是异步的,发送者不需要等待接收者处理消息即可执行后续操作
  • 解耦:发送者和接收者之间通过消息队列进行通信,互不直接依赖或了解对方存在,这种解耦使得系统组件能够独立地进行扩展
  • 可靠性:消息队列通常提供持久化机制,确保消息在接收过程中不会丢失,即使接收者当前不可用,消息也会在其重新上线后被接收
  • 削峰填谷:消息队列能够平衡系统的负载,当消息发送过快,队列可以缓冲消息并按照接收者的处理能力进行消费,从而防止系统过载
  • 顺序保证:有些消息队列支持按照特定的顺序发送和接收消息,确保消息按照发送的顺序被接收和处理

应用场景:

  • 分布式系统
  • 微服务框架
  • 异步处理
  • 任务调度
  • 日志处理
  • 事件驱动系统

Redis 用作消息队列

  • Redis由于其高性能和支持丰富的数据结构,它也被广泛用于构建轻量级的消息队列系统

利用方式:

  • 列表诗句结构:Redis 的列表(List)数据结构非常适合实现简单的消息队列。通过将消息作为元素插入到列表的头部或尾部,并使用 rpush(从尾部插入)和 lpop(从头部弹出)等操作,可以实现消息的入队和出队
  • 利用发布/订阅功能:Redis 的发布/订阅(Pub/Sub)功能可以用于实现更复杂的消息队列。发布者将消息发布到指定的频道,而订阅者可以订阅感兴趣的频道,以接收相应的消息。这种方式可以支持多个订阅者同时接收消息,并且允许发布者和订阅者之间解耦。但需要注意的是,Redis的发布/订阅功能是一种广播机制,即一个消息会被所有订阅了相应频道的订阅者接收到

总结:

相对于更高级功能和更复杂的消息处理逻辑,需要用到专门的消息队列中间件,如RabbitMQ、Apache Kafka等,这些中间件提供了更丰富的功能和更强大的扩展性,适用于更复杂的消息处理场景!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/981381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mp4压缩视频不改变画质?跟我这样压缩视频大小

在当今数字化时代,视频文件变得越来越普遍,然而,这些文件通常都很大,给存储和传输带来了困难,为了解决这个问题,许多人都希望将视频压缩得更小,而又不牺牲画质,下面就来看看具体应该…

前端基础5——UI框架Layui

文章目录 一、基本使用二、管理后台布局2.1 导航栏2.2 主题颜色2.3 字体图标 三、栅格系统四、卡片面板五、面包屑六、按钮七、表单八、上传文件九、数据表格9.1 table模块常用参数9.2 创建表格9.3 表格分页9.4 表格工具栏9.5 表格查询9.5.1 搜索关键字查询9.5.2 选择框查询 9.…

RK3568平台开发系列讲解(音视频篇)H264 的编码结构

🚀返回专栏总目录 文章目录 一、H264 的编码结构1.1、帧类型1.2、GOP1.3、Slice沉淀、分享、成长,让自己和他人都能有所收获!😄 📢视频编码的码流结构其实就是指视频经过编码之后得到的二进制数据是怎么组织的,换句话说,就是编码后的码流我们怎么将一帧帧编码后的图像…

【Cisco Packet Tracer】管理方式,命令,接口trunk,VLAN

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

日200亿次调用,喜马拉雅网关的架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中,很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近,尼恩指导一个小伙伴简历,写了一个《API网关项目》,此项目帮这个小伙拿到 字节/阿里/微博/…

【2023最新版】MySQL安装教程

目录 一、MySQL简介 二、MySQL安装 1. 官网 2. 下载 3. 安装 4. 配置环境变量 配置前 配置中 配置后 5. 验证 一、MySQL简介 MySQL是一种开源的关系型数据库管理系统(RDBMS),它被广泛用于存储和管理结构化数据。MySQL提供了强大的功…

Scrapy简介-快速开始-项目实战-注意事项-踩坑之路

scrapy项目模板地址:https://github.com/w-x-x-w/Spider-Project Scrapy简介 Scrapy是什么? Scrapy是一个健壮的爬虫框架,可以从网站中提取需要的数据。是一个快速、简单、并且可扩展的方法。Scrapy使用了异步网络框架来处理网络通讯&…

[管理与领导-75]:IT基层管理者 - 辅助技能 - 4- 乌卡时代(VUCA )的职业规划

目录 一、什么是职业规划的主要内容 二、乌卡时代的职业规划特点 2.1 时代特点 2.2 个人能力要求 三、乌卡时代如何做好职业规划 一、什么是职业规划的主要内容 职业规划是一个有目标和有策略的过程,通过此过程,个人能够发展和管理自己的职业生涯。…

GPDB-内核原理-如何指定发送数据目的地

GPDB-内核原理-如何指定发送数据目的地 GPDB是一个分布式数据库,数据存放在各个segment上。Master用于接收用户请求,并将执行计划发送到各个segment上去执行。各个segment将数据发送个master汇总并返回用户。当进行join,join条件不是分布键时…

3.3.2 【MySQL】客户端和服务器通信中的字符集

3.3.2.1 编码和解码使用的字符集不一致的后果 我们知道字符 我 在 utf8 字符集编码下的字节串长这样: 0xE68891 ,如果一个程序把这个字节串发送到另一个程序里,另一个程序用不同的字符集去解码这个字节串,假设使用的是 gbk 字符集…

【Ubuntu搭建MQTT Broker及面板+发布消息、订阅主题】

Ubuntu搭建MQTT Broker及面板发布消息、订阅主题 配置curl数据源 curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash开始安装 sudo apt-get install emqx启动 sudo emqx start使用面板 根据自己的服务器是否开始了防火墙放行端口(1808…

【系统设计系列】 DNS和CDN

系统设计系列初衷 System Design Primer: 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版: https://github.com/donnemarti…

MIT6.828实验记录-Lab1

1.Lab1 刚刚入门,难度确实很大,大量的参考资料,知识点涉及的较深,好在每个实验,作者都给出了很多提示,让繁琐的实验变得有趣起来。逐个exercise进行,知识点有些断片,所以特意花点时…

excel中删除重复项

数据如图: 要删除姓名这一列的重复项,操作: (1)选中姓名这一列(2)点击“数据”(3)点击“删除重复项" 这是excel会自动检测出还有别的关联列 直接默认,点击删除重复项...弹出下面的界面 因为我们只要删除“姓名”列的重复值&…

C++智能指针之unique_ptr(保姆级教学)

目录 unique_ptr 概述 涉及程序 初始化 手动初始化 std::make_unique函数(C14) unique_ptr常规操作 不支持操作:该指针不支持拷贝和赋值操作;所以不能拷贝到容器里 移动语义std::move(); release(); reset(); *解应用…

【计算机网络】 子网划分

文章目录 IP地址分类子网掩码网关广播地址非默认子网掩码子网划分常见问题 IP地址分类 学会十进制和二进制的相互转换可以很快速的有规律的记住 子网掩码 又叫网络掩码,地址掩码,子网络遮罩,就是说把子网络遮起来,不让外界窥探到…

“安全即服务”为网络安全推开一道门

8月30日,三六零(下称“360”)集团发布了2023年半年报,其中安全业务第二季度收入6.54亿元,同比增长98.76%,环比增长157.16%,安全第二增长曲线已完全成型!特别值得一提的是&#xff0c…

【Unittest】Requests实现小程序项目接口测试

文章目录 一、搭建接口测试框架二、初始化日志三、定义全局变量四、封装接口五、编写测试用例六、生成测试报告 一、搭建接口测试框架 目录结构如下。 二、初始化日志 在utils.py文件中编写如下如下代码,初始化日志。 # 导入app.py全局变量文件 import app import l…

基于Zookeeper搭建Kafka高可用集群(实践可用)

目录 一、Zookeeper集群搭建 1.1 下载 & 解压 1.2 修改配置 1.3 标识节点 1.4 启动集群 1.5 集群验证 二、Kafka集群搭建 2.1 下载解压 2.2 拷贝配置文件 2.3 修改配置 2.4 启动集群 2.5 创建测试主题 2.6 写入数据测试 一、Zookeeper集群搭建 为保证集群高可…

SV中的随机化约束

1.多个变量相互依赖,如何进行随机化? 采用solve before (1)constraint c_valid_write_data {solve access_type before data;solve burst_length before data;(access_type TVIP_AXI_WRITE_ACCESS) -> data.size() burst…