【中间件快速入门】什么是Redis

现在后端开发会用到各种中间件,一不留神项目可能在哪天就要用到一个我们之前可能听过但是从来没接触过的中间件,这个时候对于开发人员来说,如果你不知道这个中间件的设计逻辑和使用方法,那在后面的开发和维护工作中可能就会比较吃力,所以我想根据我的经验,把后端开发中常用的中间件最简单的一层帮大家总结一下,包括它是干什么的,优势是什么,如何使用这三大部分,让大家对一些常用的中间件有一些基本的了解,不至于在工作中的项目中用到了这个中间件但却对它没有一点了解。

什么是redis

(来自维基百科)Redis(Remote Dictionary Server)是一个使用ANSI C编写的支持网络、基于内存分布式、可选持久性键值对存储数据库。根据月度排行网站DB-Engines.com的数据,Redis是最流行的键值对存储数据库。

Redis为什么叫Redis

Redis的全称是REmote DIctionary Service,即远程字典服务

Redis默认端口为什么是6379

6379其实对应手机9宫格键盘上的4个按键,来源是MERZ这个词:

  1. Redis内部原理

Redis一般用来干什么

Redis最常见的用途就是用作缓存,当你的系统需要缓存的组件时,Redis基本上就是不二的选择。除了缓存以外,Redis有时还被用来实现分布式锁,比如OpenStack的tooz就是用redis实现的分布式锁。另外在分布式系统中,Redis可以用来共享会话信息。

Redis的三种模式

Redis的三种模式主要包括主从模式(Master-Slave Replication)、哨兵模式(Sentinel)和集群模式(Cluster)。

主从模式

主从模式是一种数据备份和读写分离的模式。在这种模式下,有一个主节点(Master)负责处理所有的写操作,一个或多个从节点(Slave)负责处理读操作。从节点通过复制主节点的数据来保持与主节点的数据一致性。

  • 优点
    • 实现数据备份,提高数据安全性。
    • 读写分离,提高系统读取性能。
  • 缺点
    • 无法自动切换主从节点,主节点故障时需要手动切换。
    • 写操作仍然在主节点上进行,可能成为性能瓶颈。

哨兵模式

哨兵模式是在主从模式的基础上,增加了故障转移和监控的功能。哨兵节点(Sentinel)负责监控主从节点的状态,并在主节点故障时自动将从节点提升为主节点。

  • 优点
    • 实现自动故障转移,提高系统可用性。
    • 监控主从节点的状态,及时发现和解决问题。
  • 缺点
    • 哨兵节点需要额外的资源和维护成本。
    • 主从切换时可能会有短暂的服务中断。

集群模式

集群模式是一种分布式解决方案,它将数据分散存储在多个节点上,每个节点负责一部分数据的读写。集群模式通过哈希槽技术实现数据的分片和管理。

  • 优点
    • 实现数据的水平扩展,提高系统存储容量和性能。
    • 自动进行故障转移和负载均衡。
    • 支持动态添加或删除节点,易于扩展和维护。
  • 缺点
    • 配置和维护相对复杂。
    • 不支持跨节点的事务和某些复杂操作。

Redis持久化方式

Redis的持久机制有两种,第一种是快照,第二种是AOF日志。

快照是一次全量备份,AOF日志是连续的增量备份。快照是内存数据的二进制序列化形式,在存储上非常紧凑,而AOF日志记录的是内存数据修改的指令记录文本。AOF日志在长期的运行过程中会变得无比庞大,数据库重启时需要加载AOF日志进行指令重放,这个时间就会无比漫长,所以需要定期进行AOF重写,给AOF日志进行瘦身。

快照

Redis使用操作系统的多进程COW(Copy on Write)机制来实现快照持久化。

Redis在持久化时会调用glibc的函数fork产生一个子进程,快照持久化完全交给子进程来处理,父进程继续处理客户端请求。子进程刚刚产生时,它和父进程共享内存里面的代码段和数据段。这时你可以把父子进程想象成一个连体婴儿,它们在共享身体。这是Linux操作系统的机制,为了节约内存资源,所以尽可能让他们共享起来。在进程分离的一瞬间,内存的增长几乎没有明显变化。

子进程做数据持久化,不会修改现有的内存数据结构,它只是对数据结构进行遍历读取,然后序列化写到磁盘中。但是父进程不一样,它必须持续服务客户端请求,然后对内存数据结构进行不间断的修改。

这个时候就会使用操作系统的COW机制来尽心数据段页面的分离。数据段是由很多操作系统的页面(Page)组合而成,当父进程对其中一个页面的数据进行修改时,会将被共享的页面复制一份分离出来,然后对这个复制的页面进行修改。这是子进程相应的页面是没有变化的,还是进程产生时那一瞬间的数据。

随着父进程修改操作的持续进行,越来越多的共享页面被分离出来,内存就会持续增长,但是也不会超过原有数据内存的2倍大小。另外,Redis实例里冷数据占的比例往往是比较高的,所以很少会出现所有的页面都被分离的情况,被分离的往往只有其中一部分农业面。每个页面的大小只有4KB,一个Redis实例里面一般都会有成千上万个页面。

子进程因为数据没有变化,它能看到的内存里的数据在进程产生的一瞬间就凝固了,再也不会改变,这也是为什么Redis的持久化叫“快照”的原因。接下来子进程就可以非常安心地遍历数据,进行序列化写磁盘了。

AOF

AOF日志存储的是Redis服务器的顺序指令序列,AOF日志只记录对内存进行修改的指令记录。

Redis会在接收到客户端修改指令后,进行参数校验、逻辑处理,如果没问题,就立即将该指令文本存储到AOF日志中,也就是说,先执行指令才将日志存盘。这点不同于leveldb、hbase等存储引擎,它们都是先存储日志再做逻辑处理。

Redis在长期运行的过程中,AOF的日志会越来越长。如果实例宕机重启,重放整个AOF日志会非常耗时,导致Redis长时间无法对外提供服务,所以需要对AOF日志瘦身。

Redis提供了bgrewriteaof指令用于对AOF日志进行瘦身,其原理就是开辟一个子进程对内存进行遍历,转换成一系列Redis的操作指令,序列化到一个新的AOF日志文件中。序列化完毕后再将操作期间发生的增量AOF日志追加到这个新的AOF日志文件中,追加完毕后就立即替代旧的AOF日志文件了,瘦身工作就完成了。

Linux的glibc提供了fsync(int fd)函数可以将制定文件的内容强制从内核缓存刷到磁盘。只要Redis进程实时调用fsync函数就可以保证AOF日志不丢失。但是fsync是一个磁盘IO操作,它很慢!如果Redis执行一条指令就要fsync一次,那么Redis高新更能的地位就不保了。

所以在生产环境的服务器中,Redis通常是每隔1s左右执行一次fsync操作,这个1s的周期是可以配置的。这是在数据安全性和性能之间做的一个折中,在保持高新更能的同时,尽可能使数据少丢失。

Redis清除过期key的方式

Redis会将每个设置了过期时间的key放入一个独立的字典中,以后会定时遍历这个字典来删除到期的key。除了定时遍历之外,它还会使用惰性策略来删除过期的key。所谓惰性策略就是在客户端访问这个key的时候,Redis对key的过期时间进行检查,如果过期了就立即删除。如果说定时删除是集中处理,那么惰性删除就是零散处理。

定期删除

Redis默认每秒进行10次过期扫描,过期扫描不会遍历过期字典中所有的key,而是采用了一种简单的贪心策略,步骤如下:

  1. 从过期字典中随机选出20个key
  2. 删除这20个key中已经过期的key
  3. 如果过期的key的比例超过1/4,那就重复步骤1

同时,为了保证过期扫描不会出现循环过度,导致线程卡死的现象,算法还增加了扫描时间的上限,默认不会超过25ms。

惰性删除

在获取key时,先判断key是否过期,如果过期则删除。这种方式存在一个缺点:如果这个key一直未被使用,那么它一直在内存中,其实它已经过期了,会浪费大量的空间。

这两种策略结合起来以后,定时删除策略发生了一些改变,不再是每次扫描全部的key了,而是随机抽取一部分key进行检查,这样就降低了对CPU资源的损耗。

Redis string的设计

Redis的字符串叫“SDS”,也就是Simple Dynamic String。它的结构是一个带长度信息的字节数组。

struct SDS<T> {

    T capacity; // 数组容量

    T len; // 数组长度

    byte flags; // 特殊标志位,不用理睬它

    byte[] content; // 数组内容

}

上面的SDS结构使用了泛型T。为什么不直接用int呢?因为当字符串比较短时,len和capacity可以使用byte和short来表示,Redis为了对内存做极致的优化,不同长度的字符串使用不同的结构体来表示。

Redis的字符串有两种存储方式,在长度特别短时,使用embstr形式存储,而当长度超过44字节时,使用raw形式存储。

为了解释这种现象,我们首先来了解一下Redis对象头结构,所有的Redis对象都有下面的这个头结构。

struct RedisObject {

    int4 type; // 4 bits

    int4 encoding; // 4 bits

    int24 lru; // 24 bits

    int32 refcount; // 4 bytes

    void *ptr; // 8 bytes, 64-bit system

}

不同的对象具有不同的类型type(4bit)。同一个类型的type会有不同的存储形式encoding(4bit)。为了记录对象的LRU信息,使用了24个bit来记录LRU信息。每个对象都有个引用计数,当引用计数为0时,对象就会被销毁,内存被回收。ptr指针将指向对象内容(body)的具体存储位置。这样一个RedisObject对象头结构需要占据16字节的存储空间。

接着我们再看SDS结构体的大小,在字符串比较小时,SDS对象头结构的大小是capacity+3

,至少是3字节。意味着分配一个字符串的最小空间占用为19(即16+3)字节。

struct SDS {

    int8 capacity; // 1 byte

    int8 len; // 1 byte

    int8 flags; // 1 byte

    byte[] content; // 内联数组,长度为capacity

}

embstr将RedisObject对象头结构和SDS对象连续存在一起,使用malloc方法一次分配,而raw存储形式不一样,它需要两次malloc方法,两个对象头在内存地址上一般是不连续的。

内存分配器jemalloc、tcmalloc等分配内存大小的单位都是2/4/8/16/32/64字节等,为了能容纳一个完整的embstr对象,jemalloc最少会分配32字节的空间,如果字符串再稍微长一点,那就是64自己的空间。如果字符串总体超出了64字节,Redis认为它是一个大字符串,不再适合使用embstr存储,而该使用raw形式。

当内存分配了64字节空间时,那这个字符串长度最大可以是多少呢?这个长度就是44字节。

为什么是44字节呢?64字节中,除了RedisObject的16字节和SDS的3字节,留给content的长度最多只有45(即64 - 19)字节了。字符串又是以NULL结尾,所以embstr形式最大能容纳的字符串长度就是44字节。

Redis如何使用

Reids主要通过Redis Cli进行操作,连接方式为

redis-cli -h {host} -p {port}

然后就是在命令行内使用各种get和set命令去操作数据了,具体就不在这里展示了,可以等真正要用的时候去现搜索一下。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 (57)改进“尽最大努力交付”的服务

前言 计算机网络中的“尽最大努力交付”服务是网络层的一种数据传输方式。这种服务的特点是网络层只负责尽力将数据报从源端传输到目的端&#xff0c;而不保证数据传输的可靠性。 一、标记与分类 为数据分组打上标记&#xff1a; 给不同性质的分组打上不同的标记&#x…

【opencv】第9章 直方图与匹配

第9章 直方图与匹配 9.1 图像直方图概述 直方图广泛运用于很多计算机视觉运用当中&#xff0c;通过标记帧与帧之间显著的边 缘和颜色的统计变化&#xff0c;来检测视频中场景的变化。在每个兴趣点设置一个有相近 特征的直方图所构成“标签”,用以确定图像中的兴趣点。边缘、色…

爬虫基础之爬取某站视频

目标网址:为了1/4螺口买小米SU7&#xff0c;开了一个月&#xff0c;它值吗&#xff1f;_哔哩哔哩_bilibili 本案例所使用到的模块 requests (发送HTTP请求)subprocess(执行系统命令)re (正则表达式操作)json (处理JSON数据) 需求分析: 视频的名称 F12 打开开发者工具 or 右击…

第五天 Labview数据记录(5.1 INI配置文件读写)

5.1 INI配置文件读写 INI配置文件是一种简单的文本文件&#xff0c;通常用于存储软件的配置信息。它具有以下作用&#xff1a; 存储软件配置参数方便软件的维护和更新提高软件的灵活性和可扩展性便于用户修改和共享配置 5.1.1 前面板 1&#xff09;新建项目SaveData_Exampl…

springboot 文件下载

在springboot中&#xff0c;执行如下代码实现文件下载 GetMapping("/file/download/test")public void Download(HttpServletResponse response){try {String path "XXXXXXXXXXXX";//文件路径File file new File(path);// 读到流中InputStream inputStre…

PaddleSeg 从配置文件和模型 URL 自动化运行预测任务

git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹&#xff0c;寻…

三维激光扫描-用智能检测系统提升效率

当下&#xff0c;企业对生产效率和质量控制的要求越来越高。传统的检测方法往往难以满足高精度、快速响应的需求。三维激光扫描技术结合智能检测系统&#xff0c;为工业检测带来了革命性的变革。 传统检测方法的局限性 传统检测方法主要依赖于人工测量和机械检测工具&#xf…

WebAssembly视频检测在社区创作平台的落地与实践 | 得物技术

一、背景&现状 创作者服务平台作为得物为社区创作者提供的PC端视频发布入口&#xff0c;地位非常重要。且随着功能的升级迭代&#xff0c;用户群体也越来越多。但我们偶尔会收到如下反馈&#xff1a; 视频损坏&#xff0c;无法播放视频模糊曝光度问题黑屏&#xff0c;只有…

Poetry shell --> poetry-plugin-shell

当前环境&#xff1a;Poetry (version 2.0.1) python Python 3.11.8 根据&#xff1a;https://python-poetry.org/docs/managing-environments/#bash-csh-zsh 在新版本的 poetry 执行 poetry shell 会报错 这个功能目前需要使用 poetry-plugin-shell 插件 关于 poetry-plugin-s…

《论文翻译》KIMI K1.5:用大语言模型扩展强化学习

文章目录 KIMI K1.5技术报告摘要 1. 引言2. 方法&#xff1a;基于大语言模型的强化学习2.1 强化学习提示集整理2.2 长思维链监督微调2.3 强化学习2.3.1 问题设定2.3.2 策略优化2.3.3 长度惩罚2.3.4 采样策略2.3.5 训练方法的更多细节 2.4 长到短&#xff1a;短思维链模型的上下…

Linux 安装 Nirgam

目录 Linux 安装 Nirgam声明安装 错误修正⭐修正后需要重新编译 参考资料 Linux 安装 Nirgam 声明 ⭐make失败调整重试前一定先 make clean 一下&#xff01;&#xff01;&#xff01;特别感谢一篇博客园的博客&#xff08;参考文献1&#xff09;&#xff0c;帮我解决了很多问…

分享一款开源好用的博客管理系统

ThriveX 现代化博客管理系统 &#x1f389; &#x1f525; 首先最重要的事情放第一 开源不易&#xff0c;麻烦占用 10 秒钟的时间帮忙点个免费的 Star&#xff0c;再此万分感谢&#xff01; 下面开始进入主题↓↓↓ &#x1f308; 项目介绍&#xff1a; Thrive 是一个简而不…

Kafka 深入服务端 — 时间轮

Kafka中存在大量的延迟操作&#xff0c;比如延时生产、延时拉取和延时删除等。Kafka基于时间轮概念自定义实现了一个用于延时功能的定时器&#xff0c;来完成这些延迟操作。 1 时间轮 Kafka没有使用基于JDK自带的Timer或DelayQueue来实现延迟功能&#xff0c;因为它们的插入和…

九、CSS工程化方案

一、PostCSS介绍 二、PostCSS插件的使用 项目安装 - npm install postcss-cli 全局安装 - npm install postcss-cli -g postcss-cli地址&#xff1a;GitHub - postcss/postcss-cli: CLI for postcss postcss地址&#xff1a;GitHub - postcss/postcss: Transforming styles…

FFPlay命令全集合

FFPlay是以FFmpeg框架为基础&#xff0c;外加渲染音视频的库libSDL构建的媒体文件播放器。 ffplay工具下载并播放视频&#xff0c;可以辅助卡看流信息。 官网下载地址&#xff1a;http://ffmpeg.org/download.html#build-windows 下载build好的exe程序&#xff1a; 此处下载…

wangEditor富文本编辑器,Laravel上传图片配置和使用

文章目录 前言步骤1. 构造好前端模版2. 搭建后端存储3. 调试 前言 由于最近写项目需要使用富文本编辑器&#xff0c;使用的是VUE3.0版本所以很多不兼容&#xff0c;实际测试以后推荐使用wangEditor 步骤 构造好前端模版搭建后端存储调试 1. 构造好前端模版 安装模版 模版安…

利用 SAM2 模型探测卫星图像中的农田边界

将 Segment Anything Model Version 2 应用于卫星图像以检测和导出农业地区田地边界的分步教程 &#x1f31f; 简介 手动绘制田地边界是最耗时的任务之一&#xff0c;其准确性取决于绘制者的表现。然而&#xff0c;精确的边界检测在很多领域都有应用。例如&#xff0c;假设您…

数据库管理-第287期 Oracle DB 23.7新特性一览(20250124)

数据库管理287期 20245-01-24 数据库管理-第287期 Oracle DB 23.7新特性一览&#xff08;20250124&#xff09;1 AI向量搜索&#xff1a;算术和聚合运算2 更改Compatible至23.6.0&#xff0c;以使用23.6或更高版本中的新AI向量搜索功能3 Cloud Developer包4 DBMS_DEVELOPER.GET…

第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)

1.并发编程的三个重要特性 并发编程有三个至关重要的特性&#xff0c;分别是原子性、有序性和可见性 1.1 原子性 所谓原子性是指在一次的操作或者多次操作中&#xff0c;要么所有的操作全部都得到了执行并 且不会受到任何因素的干扰而中断&#xff0c;要么所有的操作都不执行…

mysql-06.JDBC

目录 什么是JDBC: 为啥存在JDBC: JDBC工作原理&#xff1a; JDBC的优势&#xff1a; 下载mysql驱动包&#xff1a; 用java程序操作数据库 1.创建dataSource: 2.与服务端建立连接 3.构造sql语句 4.执行sql 5.关闭连接&#xff0c;释放资源 参考代码&#xff1a; 插…