当前位置: 首页 > news >正文

【中间件快速入门】什么是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 bitsint4 encoding; // 4 bitsint24 lru; // 24 bitsint32 refcount; // 4 bytesvoid *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 byteint8 len; // 1 byteint8 flags; // 1 bytebyte[] 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命令去操作数据了,具体就不在这里展示了,可以等真正要用的时候去现搜索一下。

相关文章:

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

现在后端开发会用到各种中间件&#xff0c;一不留神项目可能在哪天就要用到一个我们之前可能听过但是从来没接触过的中间件&#xff0c;这个时候对于开发人员来说&#xff0c;如果你不知道这个中间件的设计逻辑和使用方法&#xff0c;那在后面的开发和维护工作中可能就会比较吃…...

Pandas基础02(DataFrame创建/索引/切片/属性/方法/层次化索引)

DataFrame数据结构 DataFrame 是一个二维表格的数据结构&#xff0c;类似于数据库中的表格或 Excel 工作表。它由多个 Series 组成&#xff0c;每个 Series 共享相同的索引。DataFrame 可以看作是具有列名和行索引的二维数组。设计初衷是将Series的使用场景从一维拓展到多维。…...

适配Android16

Android16新特性 Android 16带来了许多新特性和改进&#xff0c;提升了系统的流畅度、用户体验和安全性。对于应用开发者来说&#xff0c;适配Android 16可以确保应用在该版本上的兼容性和性能&#xff0c;同时也可以利用其新特性为用户提供更好的服务。以下是Android 16的一些…...

.NET MAUI进行UDP通信(二)

上篇文章有写过一个简单的demo&#xff0c;本次对项目进行进一步的扩展&#xff0c;添加tabbar功能。 1.修改AppShell.xaml文件&#xff0c;如下所示&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <Shellx:Class"mauiDemo.AppShel…...

生信软件管家——conda vs pip

pip vs conda&#xff1a; 安装过python包的人自然两种管理软件都用过&#xff0c; Pip install和Conda install在Python环境中用于安装第三方库和软件包&#xff0c;但它们在多个方面存在显著的区别 总的来说&#xff1a; pip是包管理软件&#xff0c;conda既是包管理软件&…...

从替代到覆盖:暴雨信创服务器打开市场新局面

进入2025年,全球局势更加变幻莫测,高科技领域越来越受到全球局势影响。美国前任总统拜登在卸任前,特别颁布限制GPU产品出口法案。新任总统特朗普上任第一天,废除了多项之前法案,但显示技术交流的内容一条没变。 在如此艰难的局面下,我国信创市场的发展显得尤为重要,国家也从政策…...

HTML5 常用事件详解

在现代 Web 开发中&#xff0c;用户交互是提升用户体验的关键。HTML5 提供了丰富的事件机制&#xff0c;允许开发者监听用户的操作&#xff08;如点击、拖动、键盘输入等&#xff09;&#xff0c;并触发相应的逻辑处理。本文将详细介绍 HTML5 中的常用事件&#xff0c;包括鼠标…...

使用 Pipeline 提高 Redis 批量操作性能

使用 Pipeline 提高 Redis 批量操作性能 在 Redis 中&#xff0c;Pipeline&#xff08;管道&#xff09; 是一种用于提高批量操作性能的技术。它允许客户端一次性发送多个命令到 Redis 服务器&#xff0c;而不需要等待每个命令的单独响应&#xff0c;从而减少了**网络往返&…...

ElasticSearch-文档元数据乐观并发控制

文章目录 什么是文档&#xff1f;文档元数据文档的部分更新Update 乐观并发控制 最近日常工作开发过程中使用到了 ES&#xff0c;最近在检索资料的时候翻阅到了 ES 的官方文档&#xff0c;里面对 ES 的基础与案例进行了通俗易懂的解释&#xff0c;读下来也有不少收获&#xff0…...

每日一题--合并二叉树

合并二叉树 问题描述 已知两颗二叉树&#xff0c;将它们合并成一颗二叉树。合并规则是&#xff1a;如果节点存在于两棵树中&#xff0c;则将节点值相加&#xff1b;如果某个节点在一棵树中不存在&#xff0c;则直接使用另一棵树的节点值。例如&#xff1a; 两颗二叉树如下&a…...

【喜讯】海云安荣获“数字安全产业贡献奖”

近日&#xff0c;国内领先的数字化领域独立第三方调研咨询机构数世咨询主办的“2025数字安全市场年度大会”在北京成功举办。在此次大会上&#xff0c;海云安的高敏捷信创白盒产品凭借其在AI大模型技术方面的卓越贡献和突出的技术创新能力&#xff0c;荣获了“数字安全产业贡献…...

数字转中文大写JAVA

一般在收据打印过程中&#xff0c;可能会要求展示中文大写金额&#xff0c;以下提供两种实现。 1正常代码逻辑处理 优点&#xff1a;易理解&#xff0c;好维护 缺点&#xff1a;代码较长 package com.test;import java.math.BigDecimal;public class NumberToChinese {priv…...

如何使用 pytest-html 创建自定义 HTML 测试报告

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 测试 Python 代码对于提高代码质量、检测漏洞或意外行为至关重要。 但测试结果又该…...

思科交换机telnet配置案例

目录 1.telnet简述2.网络拓扑3.设备说明4.网络配置4.1 电脑PC ip设置4.2 网络交换机telnet配置 5.小结 1.telnet简述 Telnet是远程登录服务的一个协议&#xff0c;该协议定义了远程登录用户与服务器交互的方式。它允许用户在一台联网的计算机上登录到一个远程分时系统中&#…...

LabVIEW进行可靠性测试时有哪些常见的问题

在进行LabVIEW开发和测试时&#xff0c;尤其是用于可靠性测试&#xff0c;可能会遇到一些常见的问题。以下是一些常见问题及其解决方法&#xff1a; 1. 数据采集卡与硬件兼容性问题 问题描述&#xff1a;某些数据采集卡&#xff08;DAQ&#xff09;与硬件设备的兼容性问题可能…...

三年级数学知识边界总结思考-下册

目录 一、背景二、过程1.位置与方向小学三年级课本上位置与方向的知识点、由来、作用和意义一、位置与方向的知识点二、位置与方向的由来三、位置与方向的作用和意义 2.复试统计表小学三年级课本上复式统计表的知识点、由来、作用和意义一、复式统计表的知识点二、复式统计表的…...

假期学习【Java程序】的实施方案

一、前期准备 1.1 设定明确的学习目标 在假期开始之前&#xff0c;明确学习Java的具体目标至关重要。这些目标应该具体、可衡量且符合实际。例如&#xff0c;如果你是初学者&#xff0c;可以设定目标为掌握Java的基础语法、理解面向对象编程的核心概念&#xff0c;并能够编写…...

Java 大视界 -- Java 大数据中的知识图谱构建与应用(62)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

Macos下交叉编译安卓的paq8px压缩算法

官方没有android的编译方法&#xff0c;自己编写脚本在macos下交叉编译. 下载源码&#xff1a; git clone https://github.com/hxim/paq8px.git 稍旧的ndk并不能编译成功&#xff0c;需要下载最新的ndkr27c, 最后是使用clang来编译。 编译build.sh export ANDROID_NDK/Vol…...

npm启动前端项目时报错(vue) error:0308010C:digital envelope routines::unsupported

vue 启动项目时&#xff0c;npm run serve 报下面的错&#xff1a; error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:67:19) at Object.createHash (node:crypto:133:10) at FSReqCallback.readFileAfterClose [as on…...

设计模式-建造者模式、原型模式

目录 建造者模式 定义 类图 优缺点 角色 建造者模式和工厂模式比较 使用案例 原型模式 定义 类图 优缺点 应用场景 应用类型 浅克隆 深克隆 建造者模式 定义 将一个复杂的对象的构造与它的表示分离&#xff0c;使同样的构建过程可以创建不同的表示&#xff0c;…...

Android vendor.img中文件执行权问题

问题 Android 9、11往vendor.img增加文件&#xff0c;烧写到设备后发现增加的可执行文件没有执行权限。经过漫长查找&#xff0c;终于找到了问题的根源&#xff0c;谨以此篇献给哪些脚踏实地的人们。 根本原因 system/core/libcutils/fs_config.cpp文件&#xff0c;fs_confi…...

MATLAB 如何避免复杂shp文件对inpolygon的影响

**任务描述&#xff1a;**当我想用inpolygon函数将属于非洲的pixel选出来时&#xff0c;发现因为周边小岛的影响&#xff0c;pixel选取有问题&#xff0c;如下图。 第一种解决办法&#xff1a; 首先将复杂shp文件查分成简单的shp文件&#xff0c;即将不相交的元素分离开 [QGIS…...

Golang Gin系列-8:单元测试与调试技术

在本章中&#xff0c;我们将探讨如何为Gin应用程序编写单元测试&#xff0c;使用有效的调试技术&#xff0c;以及优化性能。这包括设置测试环境、为处理程序和中间件编写测试、使用日志记录、使用调试工具以及分析应用程序以提高性能。 为Gin应用程序编写单元测试 设置测试环境…...

【论文阅读】Equivariant Diffusion Policy

Northeastern University 2Boston Dynamics AI Institute 摘要 近期研究表明&#xff0c;扩散模型是一种有效的方法&#xff0c;可用于在行为克隆中学习由演示数据产生的多模态分布。然而&#xff0c;这种方法的一个缺点是需要学习去噪函数&#xff0c;这比学习显式策略要复杂…...

[ACTF2020 新生赛]BackupFile1

题目 翻译&#xff0c;尝试找出源文件&#xff01; 扫目录使用参数-e * python dirsearch.py -u http://0c3b21c0-d360-4baa-8b97-aa244f4c4825.node5.buuoj.cn:81/ -e * 最终扫描到一个文件名为&#xff1a;/index.php.bak的文件&#xff0c;把备份文件下载下来 源码 <?…...

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion(原理介绍)

手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion&#xff08;原理介绍&#xff09; 目录 手撕Diffusion系列 - 第九期 - 改进为Stable Diffusion&#xff08;原理介绍&#xff09;DDPM 原理图Stable Diffusion 原理Stable Diffusion的原理解释Stable Diffusion 和 Diffus…...

ASP.NET Core WebAPI的异步及返回值

目录 Action方法的异步 Action方法参数 捕捉URL占位符 捕捉QueryString的值 JSON报文体 其他方式 Action方法的异步 Action方法既可以同步也可以异步。异步Action方法的名字一般不需要以Async结尾。Web API中Action方法的返回值如果是普通数据类型&#xff0c;那么返回值…...

doris: CSV导入数据

本文介绍如何在 Doris 中导入 CSV 格式的数据文件。Doris 支持灵活的 CSV 格式配置&#xff0c;包括自定义分隔符、字段包围符等&#xff0c;并提供多种导入方式以满足不同场景的数据导入需求。 导入方式​ Doris 支持以下方式导入 CSV 格式数据&#xff1a; Stream LoadBro…...

数据标注开源框架 Label Studio

数据标注开源框架 Label Studio Label Studio 是一个开源的、灵活的数据标注平台&#xff0c;旨在帮助开发者和数据科学家轻松创建高质量的训练数据集。它支持多种类型的数据&#xff08;如文本、图像、音频、视频等&#xff09;以及复杂的标注任务&#xff08;如分类、命名实体…...

Next.js 实战 (十):中间件的魅力,打造更快更安全的应用

什么是中间件&#xff1f; 在 Next.js 中&#xff0c;中间件&#xff08;Middleware&#xff09;是一种用于处理每个传入请求的功能。它允许你在请求到达页面之前对其进行修改或响应。 通过中间件&#xff0c;你可以实现诸如日志记录、身份验证、重定向、CORS配置、压缩等任务…...

js/ts数值计算精度丢失问题及解决方案

文章目录 概念及问题问题分析解决方案方案一方案二方案其它——用成熟的库 概念及问题 js中处理浮点数运算时会出现精度丢失。js中整数和浮点数都属于Number数据类型&#xff0c;所有的数字都是以64位浮点数形式存储&#xff0c;整数也是如此。所以打印x.00这样的浮点数的结果…...

Linux之Tcp粘包笔记

目录 一.网络传输四层模型 二.数据传输中数据包传输的两个限制概念 三.数据传输的中粘包问题 四.数据组装的原因 Nagle算法原理: 五.关闭Nagle优化处理粘包问题吗&#xff1f; 六.粘包处理方法 a.设置消息边界&#xff1a; b.定义消息长度&#xff1a; 七.UDP是否会出…...

StarRocks 安装部署

StarRocks 安装部署 StarRocks端口&#xff1a; 官方《配置检查》有服务端口详细描述&#xff1a; https://docs.starrocks.io/zh/docs/deployment/environment_configurations/ StarRocks架构&#xff1a;https://docs.starrocks.io/zh/docs/introduction/Architecture/ Sta…...

【深度学习|迁移学习】渐进式学习策略 (Progressive Learning Strategy)详述(一)

【深度学习|迁移学习】渐进式学习策略 (Progressive Learning Strategy)详述&#xff08;一&#xff09; 【深度学习|迁移学习】渐进式学习策略 (Progressive Learning Strategy)详述&#xff08;一&#xff09; 文章目录 【深度学习|迁移学习】渐进式学习策略 (Progressive L…...

关注搜索引擎蜘蛛压力

以前在建站的时候&#xff0c;他们说蜘蛛来抓取的频率越多越好&#xff0c;因为蜘蛛来抓取说明了网站更新速度快&#xff0c;受搜索引擎的欢迎&#xff0c;但是在最近的网站统计中&#xff0c;发现很多蜘蛛爬取的频次非常的高&#xff0c;比如有的蜘蛛一天能来网站几万次&#…...

Windows上通过Git Bash激活Anaconda

在Windows上配置完Anaconda后&#xff0c;普遍通过Anaconda Prompt激活虚拟环境并执行Python&#xff0c;如下图所示&#xff1a; 有时需要连续执行多个python脚本时&#xff0c;直接在Anaconda Prompt下可以通过在以下方式&#xff0c;即命令间通过&&连接&#xff0c;…...

【架构面试】一、架构设计认知

涉及分布式锁、中间件、数据库、分布式缓存、系统高可用等多个技术领域&#xff0c;旨在考查候选人的技术深度、架构设计能力与解决实际问题的能力。 1. 以 Redis 是否可以作为分布式锁为例&#xff1a; 用 Redis 实现分布式锁会存在哪些问题&#xff1f; 死锁&#xff1a;如果…...

【Redis】常见面试题

什么是Redis&#xff1f; Redis 和 Memcached 有什么区别&#xff1f; 为什么用 Redis 作为 MySQL 的缓存&#xff1f; 主要是因为Redis具备高性能和高并发两种特性。 高性能&#xff1a;MySQL中数据是从磁盘读取的&#xff0c;而Redis是直接操作内存&#xff0c;速度相当快…...

解决vsocde ssh远程连接同一ip,不同端口情况下,无法区分的问题

一般服务器会通过镜像分身或者容器的方式&#xff0c;一个ip分出多个端口给多人使用&#xff0c;但如果碰到需要连接同一user&#xff0c;同一个ip,不同端口的情况&#xff0c;vscode就无法识别&#xff0c;如下图所示&#xff0c;vscode无法区分该ip下不同端口的连接&#xff…...

Java设计模式—观察者模式

观察者模式 目录 观察者模式1、什么是观察者模式&#xff1f;2、观察者模式优缺点及注意事项&#xff1f;3、观察者模式实现&#xff1f;4、手写线程安全的观察者模式&#xff1f; 1、什么是观察者模式&#xff1f; - 实例&#xff1a;现实生活中很多事物都是依赖存在的&#x…...

Lua 环境的安装

1.安装Lua运行环境 本人采用的是在windows系统中使用cmd指令方式进行安装&#xff0c;安装指令如下&#xff1a; winget install "lua for windows" 也曾使用可执行程序安装过&#xff0c;但由于电脑是加密电脑&#xff0c;最后都已失败告终。使用此方式安装可以安…...

MySQL回表详解:原理、优化与实践

1. 简介 在MySQL的查询过程中&#xff0c;“回表”&#xff08;又叫“二次查询”&#xff09;是一个常见的概念&#xff0c;尤其在使用覆盖索引&#xff08;covering index&#xff09;或联合索引&#xff08;composite index&#xff09;时&#xff0c;回表操作常常会对查询性…...

算法——位运算

位运算知识点 01.01. 判定字符是否唯一 面试题 01.01. 判定字符是否唯一 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool isUnique(string astr) {//鸽巢原理if(astr.size()>26) return false;int bitmap 0;for(auto ch:astr){char i ch-a;//判断…...

CVE-2025-0411 7-zip 漏洞复现

文章目录 免责申明漏洞描述影响版本漏洞poc漏洞复现修复建议 免责申明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 此漏洞 &#xff08;CVSS SCORE 7.0&#xff09; 允许远程攻击者绕…...

深度学习笔记——循环神经网络之LSTM

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络LSTM知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作…...

超分辨率体积重建实现术前前列腺MRI和大病理切片组织病理学图像的3D配准

摘要: 磁共振成像(MRI)在前列腺癌诊断和治疗中的应用正在迅速增加。然而,在MRI上识别癌症的存在和范围仍然具有挑战性,导致即使是专家放射科医生在检测结果上也存在高度变异性。提高MRI上的癌症检测能力对于减少这种变异性并最大化MRI的临床效用至关重要。迄今为止,这种改…...

React第二十五章(受控组件/非受控组件)

React 受控组件理解和应用 React 受控组件 受控组件一般是指表单元素&#xff0c;表单的数据由React的 State 管理&#xff0c;更新数据时&#xff0c;需要手动调用setState()方法&#xff0c;更新数据。因为React没有类似于Vue的v-model&#xff0c;所以需要自己实现绑定事件…...

Vue演练场基础知识(七)插槽

为学习Vue基础知识&#xff0c;我动手操作通关了Vue演练场&#xff0c;该演练场教程的目标是快速体验使用 Vue 是什么感受&#xff0c;设置偏好时我选的是选项式 单文件组件。以下是我结合深入指南写的总结笔记&#xff0c;希望对Vue初学者有所帮助。 文章目录 十五. 插槽插槽…...

16 分布式session和无状态的会话

在我们传统的应用中session存储在服务端&#xff0c;减少服务端的查询压力。如果以集群的方式部署&#xff0c;用户登录的session存储在该次登录的服务器节点上&#xff0c;如果下次访问服务端的请求落到其他节点上就需要重新生成session&#xff0c;这样用户需要频繁的登录。 …...