Redis 深度解析:从核心原理到生产实践
Redis 深度解析:从核心原理到生产实践
一、Redis 核心定位与数据结构
1. 核心能力矩阵深度解析
Redis 作为高性能内存数据库,核心能力覆盖缓存、数据存储、消息中间件等场景,其设计哲学围绕速度优先、内存高效、功能丰富展开:
内存存储特性
- 纯内存操作:基于内存寻址的 O (1) 复杂度数据操作,单节点 QPS 可达 10 万 +
- 持久化方案:RDB(快照)与 AOF(日志)双模式,支持数据持久化与故障恢复
- 单线程模型:基于事件驱动的单线程架构,避免多线程上下文切换开销,通过 I/O 多路复用(epoll)处理高并发请求
分布式能力
- 主从复制:支持一主多从架构,从节点可用于读扩展与故障转移
- 集群模式(Redis Cluster):通过哈希槽(Hash Slot)实现数据分片,支持动态扩缩容
- 哨兵(Sentinel):自动监控主节点状态,实现故障自动转移(Failover)
2. 核心数据结构与应用场景
数据结构 | 底层实现 | 典型应用场景 | 性能特性 |
---|---|---|---|
String | 动态字符串(SDS) | 计数器、缓存对象序列化值 | SET/GET O(1) |
Hash | 压缩列表(ziplist)/ 哈希表 | 存储对象属性(如用户信息:name/age/email) | HSET/HGET O(1) |
List | 双向链表 / 压缩列表 | 消息队列(LPUSH/RPOP)、最新列表(如微博时间线) | LPUSH O(1) |
Set | 哈希表 / 整数集合(intset) | 去重(用户登录记录)、交集计算(共同关注) | SADD O(1) |
Sorted Set | 跳表(SkipList) | 排行榜(如用户积分排名)、范围查询(如最近 30 天活跃用户) | ZADD O(logN) |
二、服务注册发现全流程深度剖析
1. 服务注册与生命周期管理
注册流程核心逻辑
// Redis 客户端注册实例(伪代码)
public void registerService(String serviceName, Instance instance) {// 构建实例数据(JSON 序列化)String instanceJson = JSON.toJSONString(instance);// 使用 Hash 结构存储服务实例(key: service:{serviceName}:instances)jedis.hset("service:" + serviceName + ":instances", instance.getInstanceId(), instanceJson);// 维护实例心跳(使用 String 结构存储最后心跳时间)jedis.setex("instance:" + instance.getInstanceId() + ":heartbeat", 10, String.valueOf(System.currentTimeMillis()));
}// 服务发现逻辑(获取可用实例)
public List<Instance> discoverService(String serviceName) {// 获取所有实例 IDSet<String> instanceIds = jedis.hkeys("service:" + serviceName + ":instances");List<Instance> instances = new ArrayList<>();for (String instanceId : instanceIds) {// 检查心跳是否有效(当前时间 - 最后心跳时间 < 15秒)if (System.currentTimeMillis() - Long.parseLong(jedis.get("instance:" + instanceId + ":heartbeat")) < 15000) {instances.add(JSON.parseObject(jedis.hget("service:" + serviceName + ":instances", instanceId), Instance.class));}}return instances;
}
心跳机制优化
-
客户端每 5 秒发送心跳(默认),服务端通过
EXPIRE
命令维护键存活时间 -
服务端定时任务(每秒执行)扫描过期心跳键,自动剔除失效实例:
-- Lua 脚本实现失效实例清理 local serviceKeys = redis.call('KEYS', 'service:*:instances') for _, serviceKey in ipairs(serviceKeys) dolocal instanceIds = redis.call('HKEYS', serviceKey)for _, instanceId in ipairs(instanceIds) doif not redis.call('EXISTS', 'instance:' .. instanceId .. ':heartbeat') thenredis.call('HDEL', serviceKey, instanceId)endend end
三、缓存管理核心实现深度解析
1. 缓存写入与淘汰策略
缓存写入流程
public void setCache(String key, Object value, long ttl) {// 序列化值(如 JSON 或 Hessian)byte[] valueBytes = serialize(value);if (ttl > 0) {jedis.setex(key.getBytes(), (int) ttl, valueBytes);} else {jedis.set(key.getBytes(), valueBytes);}// 记录缓存元数据(可选,用于统计)jedis.hset("cache:meta", key, String.valueOf(System.currentTimeMillis()));
}
内存淘汰策略对比
策略 | 描述 | 适用场景 |
---|---|---|
noeviction | 内存不足时拒绝写入请求 | 不允许数据丢失的场景 |
allkeys-lru | 从所有键中移除最近最少使用(LRU)的键 | 通用缓存场景(默认策略) |
volatile-ttl | 从设置了过期时间的键中移除存活时间最短(TTL)的键 | 需优先淘汰过期数据的场景 |
allkeys-random | 随机移除键 | 测试或非关键数据场景 |
生产环境配置建议
# redis.conf 关键配置
maxmemory-policy allkeys-lru # 采用 LRU 淘汰策略
maxmemory-samples 10 # LRU 采样数量(提高淘汰准确性)
maxmemory 4gb # 限制最大内存为 4GB
四、生产环境最佳实践深度指南
1. 集群部署与性能优化
三节点主从集群架构
节点角色 | IP 地址 | 端口 | 数据分片 |
---|---|---|---|
主节点 | 192.168.1.1 | 6379 | 槽 0-5460 |
从节点 | 192.168.1.2 | 6379 | 复制主节点 1 |
主节点 | 192.168.1.3 | 6379 | 槽 5461-10922 |
从节点 | 192.168.1.4 | 6379 | 复制主节点 3 |
主节点 | 192.168.1.5 | 6379 | 槽 10923-16383 |
从节点 | 192.168.1.6 | 6379 | 复制主节点 5 |
性能优化参数
# 网络优化
tcp-backlog 511 # 调整 TCP backlog 队列长度
tcp-keepalive 300 # 开启 TCP 心跳检测(单位:秒)# 内存优化
memlock yes # 锁定内存防止交换(swap)
hash-max-ziplist-entries 512 # Hash 结构使用压缩列表的最大条目数
2. 故障诊断与调优手册
典型故障处理流程
场景 1:缓存穿透(大量无效请求击穿缓存)
-
现象:数据库 QPS 激增,Redis 命中率骤降(<10%)
-
诊断步骤
- 查看 Redis 日志是否有大量
GET
不存在的键 - 使用
redis-cli monitor
监控请求模式 - 统计无效键分布(如通过布隆过滤器预检测)
- 查看 Redis 日志是否有大量
-
解决方案
-
缓存空值(设置短 TTL,如 5 分钟):
if (value == null) {jedis.setex(key, 300, ""); // 空值缓存 5 分钟 }
-
布隆过滤器拦截:
// 初始化布隆过滤器(假设误判率 0.01%,元素数量 100万) BloomFilter bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 1000000, 0.01); // 请求前校验 if (!bloomFilter.mightContain(key)) {return null; // 直接拒绝无效请求 }
-
场景 2:缓存雪崩(大量键同时过期)
- 现象:Redis 内存使用率骤降,数据库压力瞬间增大
- 解决方案
- 随机化 TTL:
ttl = baseTtl + random(10000)
(如基础 TTL 30 分钟,随机波动 10 秒内) - 二级缓存:本地缓存(如 Caffeine)+ Redis 分布式缓存,防止全量穿透
- 熔断降级:通过 Hystrix 或 Sentinel 限制数据库访问流量
- 随机化 TTL:
五、核心源码与算法深度解析
1. 内存管理机制
jemalloc 分配策略
-
Redis 默认使用 jemalloc 作为内存分配器,其按大小将内存划分为小(<32KB)、大(>32KB)块
-
小对象通过预分配的 slab 池快速分配,大对象直接调用系统
malloc
-
配置示例:
# 开启 jemalloc 统计 jemalloc.stats true # 调整小对象 slab 大小 jemalloc.slab_max 64
LRU 算法实现
- Redis 3.0 后采用近似 LRU(采样随机键淘汰),通过
maxmemory-samples
参数控制采样数量(默认 5) - Redis 4.0 引入 LFU(最近最少频率) 策略,通过键的访问频率(
lru2
模式)更精准淘汰冷数据
六、高频面试题深度解析
1. 架构设计相关
问题:Redis 为什么采用单线程模型?
解析:
- 单线程避免了多线程上下文切换和锁竞争开销,充分利用内存操作的原子性
- 瓶颈在于网络 I/O 而非 CPU(内存操作速度远快于网络传输)
- 通过 I/O 多路复用(epoll)处理并发请求,单线程即可支撑高并发
问题:主从复制与集群模式的区别?
维度 | 主从复制 | 集群模式(Redis Cluster) |
---|---|---|
数据分片 | 全量复制(主从数据相同) | 哈希槽分片(数据分布在不同节点) |
读写能力 | 主写从读 | 每个主节点可读写 |
自动故障转移 | 需 Sentinel 支持 | 内置自动故障转移 |
最大节点数 | 理论无限制(受限于网络) | 建议不超过 1000 个节点 |
2. 性能优化相关
问题:如何优化 Redis 高并发下的响应延迟?
解决方案:
-
避免大键(如超过 10KB 的 String 值),拆分为多个小键
-
减少 Lua 脚本执行时间(控制在 1ms 内),避免阻塞事件循环
-
启用
tcp-nodelay
减少网络延迟:# redis.conf 配置 tcp-nodelay yes
-
部署时绑定 CPU 核心,避免跨核调度开销
七、缓存高级特性深度应用
1. 分布式锁实现
RedLock 算法实践
public boolean tryLock(String lockKey, String clientId, long timeout) {long start = System.currentTimeMillis();// 尝试获取所有主节点锁(假设 5 节点集群)int successCount = 0;for (Jedis jedis : jedisCluster.getShards()) {String result = jedis.set(lockKey, clientId, "NX", "PX", timeout);if ("OK".equals(result)) {successCount++;}}// 多数节点获取成功且总耗时 < 超时时间return successCount > 3 && (System.currentTimeMillis() - start) < timeout;
}public void unlock(String lockKey, String clientId) {String script = "if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end";jedisCluster.eval(script, 1, lockKey, clientId);
}
2. 数据管道(Pipeline)优化
批量操作性能对比
操作方式 | 10 万次 SET 耗时(ms) | 带宽利用率 |
---|---|---|
单命令执行 | 约 20000 ms | 低(每次请求独立) |
Pipeline 批量 | 约 200 ms | 高(一次传输多个命令) |
代码示例
try (JedisPipeline pipeline = jedis.pipelined()) {for (int i = 0; i < 10000; i++) {pipeline.set("key:" + i, "value:" + i);}pipeline.sync(); // 一次性发送所有命令
}
总结与展望
本文从 Redis 的核心数据结构、分布式机制、生产实践及源码原理等维度进行了深度解析,揭示了其在高并发场景下的性能优势与设计哲学。在实际应用中,需结合业务特点选择合适的数据结构、持久化策略与集群架构,并通过监控(如 Prometheus 采集 redis_info
指标)持续优化系统性能。
未来 Redis 的发展将聚焦于:
- 云原生支持:更好地适配 Kubernetes 集群,实现自动化扩缩容
- 多模数据支持:融合时序数据、地理空间数据等更多数据类型
- 边缘计算:轻量化部署版本,满足边缘节点低延迟数据处理需求
理解 Redis 的底层原理与最佳实践,不仅能解决缓存领域的实际问题,更为构建高性能分布式系统提供了可复用的架构经验。
相关文章:
Redis 深度解析:从核心原理到生产实践
Redis 深度解析:从核心原理到生产实践 一、Redis 核心定位与数据结构 1. 核心能力矩阵深度解析 Redis 作为高性能内存数据库,核心能力覆盖缓存、数据存储、消息中间件等场景,其设计哲学围绕速度优先、内存高效、功能丰富展开: …...
从零搭建高可用分布式限流组件:设计模式与Redis令牌桶实践
一、需求背景与设计目标 在分布式系统中,面对突发流量时需要一种精准可控的流量控制手段。我们的组件需要具备: 多维度限流(用户/IP/服务节点/自定义表达式)分布式环境下精准控制开箱即用的Spring Boot Starter集成高扩展性的架…...
基于霍尔效应传感器的 BLDC 电机梯形控制方案详解
基于霍尔效应传感器的 BLDC 电机梯形控制方案解读 使用霍尔效应传感器的无刷直流(BLDC)电机梯形控制 一、系统核心架构与技术优势 (一)BLDC 电机与霍尔传感器控制原理 BLDC 电机作为永磁同步电机的一种,其核心特征是转子反电动势为梯形波,定子电流为 120 电角度宽度的矩…...
Pikachu靶场-File Inclusion
文件包含漏洞(File Inclusion Vulnerability)是Web应用程序中的一种常见安全漏洞,通常由于开发者未对用户输入进行严格过滤,导致攻击者能够包含并执行恶意文件。这种漏洞主要分为两种类型: 1. 漏洞类型 本地文件包含&a…...
如何模拟黑客攻击(Red Teaming)以测试服务器安全性
模拟黑客攻击(Red Teaming)是评估服务器安全性的有效方法,但需严格遵循**合法授权**和**道德准则**。以下是专业且安全的操作流程: --- ### **1. 前期准备** - **法律授权** - 获得目标系统的**书面授权**,明确测…...
分页查询优惠券
文章目录 概要整体架构流程技术细节小结 概要 接口分析 一个典型的带过滤条件的分页查询,非常简单。按照Restful风格设计即可,我们关注的点有两个: 请求参数 返回值格式 请求参数包含两部分,一个是分页参数,另一…...
QTcpSocket 和 QUdpSocket 来实现基于 TCP 和 UDP 的网络通信
在 Qt 中,您可以通过 QTcpSocket 和 QUdpSocket 来实现基于 TCP 和 UDP 的网络通信。以下是如何使用 Qt 实现这两种通信方式的简要示例。 1. TCP 网络通信 TCP 是面向连接的协议,确保数据的可靠传输。下面是一个简单的 TCP 客户端和服务器示例。 TCP …...
从岗位依附到能力生态:AI革命下“什么叫就业”的重构与价值
在人工智能(AI)技术深刻重塑社会生产关系的当下,“就业”这一概念正经历着从“职业绑定”到“能力变现”的范式转移。本文将从传统就业观的解构、AI赋能艺术教育的价值逻辑、以及未来就业形态的进化方向三个维度,探讨技术驱动下就业的本质变革,并揭示AI技术如何通过教育创…...
2025上海车展 | 移远通信全栈车载智能解决方案重磅亮相,重构“全域智能”出行新范式
2025年4月23日至5月2日,第二十一届上海国际汽车工业展览会在国家会展中心(上海)盛大启幕。作为车载智能解决方案领域的领军企业,移远通信以“全域智能 驭见未来”为主题,携丰富的车载解决方案及客户终端惊艳亮相8.2馆8…...
LVGL在VScode的WSL2中仿真
目录 一、前言 二、开始部署 1.拉取github的库 2.在WSL安装一些必要的库或者包 3.开始编译 三、注意事项 一、前言 相信有不少兄弟因为苦于没有外设而无法学习LVGL,这里我提供一种WSL中仿真LVGL工程的方法。结果图如下: 二、开始部署 1.拉取github…...
React-组件和props
1、类组件 import React from react; class ClassApp extends React.Component {constructor(props) {super(props);this.state{};}render() {return (<div><h1>这是一个类组件</h1><p>接收父组件传过来的值:{this.props.name}</p>&…...
驱动开发系列53 - 一个OpenGL应用程序是如何调用到驱动厂商GL库的
一:概述 一个 OpenGL 应用程序调用 GPU 驱动的过程,主要是通过动态链接库(libGL.so)来完成的。本文从上到下梳理一下整个调用链,包含 GLVND、Mesa 或厂商驱动之间的关系。 二:调用关系 1. 首先一个 OpenGL 应用程序(比如游戏或图形渲染软件)在运行时会调用 OpenGL 提供…...
【python】一文掌握 markitdown 库的操作(用于将文件和办公文档转换为Markdown的Python工具)
更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 一、markitdown概述1.1 markitdown介绍1.2 MarkItDown支持的文件1.3 为什么是Markdown?二、markitdown安装2.1 pip方式安装2.2 源码安装2.3 docker方式安装三、基本使用3.1 命令行方式3.2 可选依赖项配置3.3 插件方…...
【网络入侵检测】基于Suricata源码分析NFQ IPS模式实现
【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全,欢迎关注与评论。 1. 概要 👋 本文聚焦于 Suricata 7.0.10 版本源码,深入剖析其 NFQ(Netfilter Queue)模式的实现原理。通过系统性拆解初始化阶段的配置流程、数据包监听机制的构建逻辑,以…...
驱动开发硬核特训 · Day 19:从字符设备出发,掌握 Linux 驱动的实战路径(含 gpio-leds 控制示例)
视频教程请关注 B 站:“嵌入式 Jerry” 一、背景说明:字符设备驱动的角色定位 在 Linux 内核驱动体系中,**字符设备驱动(Character Device Driver)**扮演着关键的桥梁作用,它直接向用户空间程序提供 read/…...
项目——高并发内存池
目录 项目介绍 做的是什么 要求 内存池介绍 池化技术 内存池 解决的问题 设计定长内存池 高并发内存池整体框架设计 ThreadCache ThreadCache整体设计 哈希桶映射对齐规则 ThreadCache TLS无锁访问 CentralCache CentralCache整体设计 CentralCache结构设计 C…...
几种查看PyTorch、cuda 和 Python 版本方法
在检查 PyTorch、cuda 和 Python 版本时,除了直接使用 torch.__version__ 和 sys.version,我们还可以通过其他方式实现相同的功能 方法 1:直接访问属性(原始代码) import torch import sysprint("PyTorch Versi…...
如何实现跟踪+分割的高效协同?SiamMask中的多任务损失设计
如何实现跟踪分割的高效协同?SiamMask中的多任务损失设计 一、引言二、三大分支损失函数详解2.1 分类分支损失2.2 回归分支损失2.3 Mask分支损失 三、损失加权策略与系数选择3.1 常见超参数设定3.2 动态权重(可选) 四、训练实践:平…...
MODBUS转EtherNetIP边缘计算网关配置优化:Logix5000与ATV340高效数据同步与抗干扰方案
一、行业背景 智能制造是当前工业发展的趋势,智能工厂通过集成各种自动化设备和信息技术,实现生产过程的智能化、自动化和高效化。在某智能工厂中,存在大量采用ModbusTCP协议的设备,如智能传感器、变频器等,而工厂的主…...
从代码学习深度学习 - 图像增广 PyTorch 版
文章目录 前言一、图像增广的基本概念二、PyTorch中的图像增广实现三、数据加载与处理四、模型训练与评估五、实验设置与执行六、实验结果与分析七、讨论总结前言 在深度学习中,数据是关键。尤其是在计算机视觉任务中,高质量且丰富多样的数据对模型性能有着决定性的影响。然…...
从机械应答到智能对话:大模型为呼叫注入智慧新动能
引言 在当今竞争激烈的商业环境中,高效和有效的客户沟通对于企业的成功至关重要。智能外呼系统已成为企业与潜在客户和现有客户互动的重要工具。最近,大模型(如大型语言模型或 LLMs)的出现为这些系统带来了显著的提升,…...
深入浅出 Python 协程:从异步基础到开发测试工具的实践指南
Python 的异步编程近年来越来越受欢迎,尤其在需要同时处理大量 I/O 请求的场景中,它展现了出色的性能。而协程是异步编程的核心,也是开发高效异步测试工具的关键技术。 这篇文章将用通俗的语言带你快速入门 Python 协程,结合实际…...
算法之分支定界
分支定界 分支定界概述核心思想与步骤常见变体复杂度分析案例分析1. 0-1背包问题2. 最短路径问题(分支定界法)3. 旅行商问题(TSP) 分支定界 概述 分支定界(Branch and Bound)是一种用于解决组合优化问题的…...
Hugging Face上面找开源的embedding模型
问题 想找一个支持中文的embedding模型(把一段文本转化成多维度的向量)。Hugging Face平台上面共享了很多开源模型,算是这年头(2025年),大家都把自己开源模式都往上放的地方了吧。现在去这个平台上面找一个…...
docker部署Jenkins工具
环境准备 1.当前安装在Windows系统下的Docker-Desktop 下载地址:Docker Desktop: The #1 Containerization Tool for Developers | Docker 2.下载后进行安装并进行配置启动docker 3.创建一个空的文件夹,用于后面的启动时做文件路径映射 下载镜像 d…...
Pgvector+R2R搭建RAG知识库
背景 R2R是一个采用Python编写的开源AI RAG框架项目,与PostgreSQL技术栈集成度高,运行需求资源少(主要是本人的Macbook air m1内存只有8G)的特点,对部署本地私有化化AI RAG应用友好。 Resource Recommendations Whe…...
Qt本地化 - installTranslator不生效
bool QCoreApplication::installTranslator(QTranslator *translationFile)注意这里输入的是QTranslator对象指针,如果QTranslator是局部变量,一旦离开其作用域就会导致翻译失效 错误代码示范: void ApplyTranslator(const QString& qmf…...
精益数据分析(19/126):走出数据误区,拥抱创业愿景
精益数据分析(19/126):走出数据误区,拥抱创业愿景 在创业与数据分析的探索之旅中,我们都渴望获取更多知识,少走弯路。今天,我依然带着和大家共同进步的想法,深入解读《精益数据分析…...
六、初始化与清理(Initialization cleanup)
六、初始化与清理(Initialization & cleanup) 本章内容主要介绍C中的 构造函数 和 析构函数 的作用与用法,以及默认构造、聚合初始化等相关特性 封装 和 *访问控制 *在提升库使用的便捷性方面迈出了重要的一步。在安全性方面࿰…...
Python - 爬虫-网页解析数据-库lxml(支持XPath)
lxml是 Python 的第三方解析库,完全使用 Python 语言编写,它对 Xpath 表达式提供了良好的支持,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高 XPath,全称XML Path Language,即XML…...
单片机 + 图像处理芯片 + TFT彩屏 触摸滑动条控件
触摸滑动条控件使用说明 一、项目概述 本项目基于单片机和RA8889/RA6809图形处理芯片的TFT触摸屏滑动条控件。该控件支持水平和垂直滑动条,可自定义外观和行为,并支持回调函数进行值变化通知。 硬件平台:51/ARM均可(测试时使用STC8H8K64U单…...
LeetCode每日一题4.24
2799. 统计完全子数组的数目 题目 问题分析 完全子数组 的定义:子数组中不同元素的数目等于整个数组不同元素的数目。 子数组 是数组中的一个连续非空序列。 思路 统计整个数组的不同元素数目: 使用 set 来获取整个数组的不同元素数目。 遍历所有子数…...
LeetCode238_除自身以外数组的乘积
LeetCode238_除自身以外数组的乘积 标签:#数组 #前缀和Ⅰ. 题目Ⅱ. 示例0. 个人方法一:暴力循环嵌套0. 个人方法二:前缀和后缀分别求积 标签:#数组 #前缀和 Ⅰ. 题目 给你一个整数数组 nums,返回 数组 answer &#…...
基于 Spring Boot 的银行柜台管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
LeetCode 2799.统计完全子数组的数目:滑动窗口(哈希表)
【LetMeFly】2799.统计完全子数组的数目:滑动窗口(哈希表) 力扣题目链接:https://leetcode.cn/problems/count-complete-subarrays-in-an-array/ 给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件&am…...
卡尔曼滤波解释及示例
卡尔曼滤波的本质是用数学方法平衡预测与观测的可信度 ,通过不断迭代逼近真实状态。其高效性和鲁棒性,通常在导航定位中,需要融合GPS、加速度计、陀螺仪、激光雷达或摄像头数据,来提高位置精度。简单讲,卡尔曼滤波就是…...
在vue项目中实现svn日志打印
在vue项目中实现svn日志打印 实现svnlog创建svn-log脚本 convert-svn-log.js配置命令 package 实现svnlog 项目工程 类似于git的conventional-changelog 创建svn-log脚本 convert-svn-log.js 在项目根目录创建convert-svn-log.js const fs require(fs-extra); const xml2j…...
使用vue2开发一个医疗预约挂号平台-前端静态网站项目练习
对于后端开发的我,最近一直在学习前端开发,除了要学习一些前端的基础知识外,肯定少不了一些前端项目练习,就通过前端的编程知识 就简单做一个医疗预约挂号前端静态页面。这个网站主要是使用了vue2 的相关技术实现的。 主要实现了这…...
Redis的过期删除策略和内存淘汰策略
🤔 过期删除和内存淘汰乍一看很像,都是做删除操作的,这么分有什么意思? 首先,设置过期时间我们很熟悉,过期时间到了,我么的键就会被删除掉,这就是我们常认识的过期删除,…...
Langchain检索YouTube字幕
创建一个简单搜索引擎,将用户原始问题传递该搜索系统 本文重点:获取保存文档——保存向量数据库——加载向量数据库 专注于youtube的字幕,利用youtube的公开接口,获取元数据 pip install youtube-transscript-api pytube 初始化 …...
服务器上安装node
1.安装 下载安装包 https://nodejs.org/en/download 解压安装包 将安装包上传到/opt/software目录下 cd /opt/software tar -xzvf node-v16.14.2-linux-x64.tar.gz 将解压的文件夹移动到安装目录(/opt/nodejs)下 mv /opt/software/node-v16.14.2-linux-x64 /opt/nodejs …...
React:什么是Hook?通俗易懂的讲讲
什么是Hook 1.Hook 是什么?2.React 内置的 Hook3. 自定义 Hook4. 总结 1.Hook 是什么? 可以理解为:函数组件的工具/功能插件 Hook是 React 16.8 以后提供的一种新特性, 让你在函数组件里“钩入”React 的功能(比如状态…...
树莓派安装GStreamer ,opencv支持, 并在虚拟环境中使用的安装方法
首先是我在树莓派中 使用OpenCV 读取网络视频流, 如海康威视 通过rtsp协议地址读取 会发生延迟和丢包的情况 后来使用ffmpeg和OpenCV 读取视频流 丢报的问题减少了 但是长时间运行 还是会造成延迟和卡顿 最后直接卡死画面 后来试了一下GStreamer 管道流 是树莓派支持的 但是原生…...
从节点重排看React 与 Vue3 的 Diff 算法
一个有趣的问题 之前我写了一篇狗教我 React——原理篇之 Diff 算法 - 掘金 (juejin.cn)简单介绍了 diff 算法,收到了一个有意思的疑问: 大佬讲得非常易懂,我有个疑惑就是都说 diff 处理节点前移比较差,比如 a→b→c→d 更新为 d→a→b→c,如果第一遍循环到第一个就截止了…...
【FAQ】PCoIP 会话后物理工作站本地显示器黑屏
# 问题 工作人员从家里建立了到办公室工作站的 PCoIP 连接,该工作站安装了 HP Anyware Graphics Agent,并且还连接了本地显示器。然后,远程用户决定去办公室进行本地工作,工作站显示器显示黑屏(有时没有信号ÿ…...
springboot基于hadoop的酷狗音乐爬虫大数据分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 本酷狗音乐爬虫大数据分析可视化系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Java语言、Hadoop、爬虫技术进行编写,使用了Spring Boot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。前台主要…...
基于大模型的食管平滑肌瘤全周期预测与诊疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、大模型技术原理与应用概述 2.1 大模型介绍 2.2 在医疗领域的应用现状 2.3 用于食管平滑肌瘤预测的可行性分析 三、食管平滑肌瘤术前预测 3.1 预测指标选取 3.2 数据收集与预处理 3.2.1 数据…...
26考研 | 王道 | 数据结构 | 第七章 查找
第七章 查找 文章目录 第七章 查找7.1 查找概念7.2 顺序查找7.3 折半查找7.4 分块查找7.5 二叉排序树7.6 平衡二叉树平衡二叉树的插入平衡二叉树的删除 7.7 红黑树7.7.1 为什么要发明红黑树?7.7.2 红黑树的定义和性质7.7.3 红黑树的插入和删除插入删除 7.8 B树和B树…...
Docker 部署 Redis:快速搭建高效缓存服务
Docker 部署 Redis:快速搭建高效缓存服务 引言 Redis 是一个高性能的键值数据库,广泛应用于缓存、消息队列、实时分析等领域。而 Docker 作为容器化技术的代表,能够帮助我们快速部署和管理应用程序。结合两者,我们可以轻松实现 …...
【缓存与数据库结合最终方案】伪从技术
实现伪从技术:基于Binlog的Following表变更监听与缓存更新 技术方案概述 要实现一个专门消费者服务作为Following表的伪从,订阅binlog并在数据变更时更新缓存,可以采用以下技术方案: 主要组件 MySQL Binlog监听:使…...