Redis学习总结(持续更新)
Redis
目前在学习redis,遇到的一些问题会放在这里,加深自己的印象。
1. Redis缓存相较于传统Session存储的特点
Session的存储方式:
通常,传统的Session是存储在应用服务器的内存中,比如Tomcat的Session管理器。用户登录后,服务器生成一个Session ID,通过Cookie返回给客户端,之后的请求都带着这个Session ID,服务器根据Session ID查找对应的Session会话数据。这种方式在单机环境下没问题,但在分布式或集群环境中会有问题,因为Session默认存储在单个服务器上,用户如果被负载均衡到其他服务器,就会找到不到Session,导致需要重新登录。
Redis的存储方式:
Redis作为缓存服务器,可以用来存储Session数据,这样所有应用服务器都可以访问同一个Redis实例,解决了分布式Session的问题。此外,Redis是内存数据库,读写速度很快,适合高并发场景。而且Redis支持持久化,数据不会因为服务器重启而丢失,还能设置过期时间自动清理数据,这些都是传统Session存储不具备的优点。
Redis缓存相较于传统Session存储具有以下显著优点,尤其适合现代分布式和高并发场景:
- 分布式支持:
- 传统Session:存储在单台服务器的内存中,用户请求必须路由到同一服务器(依赖负载均衡的
Sticky Session
),难以扩展为集群。 - Redis:集中存储所有Session数据,后续请求被负载均衡到服务器B。若Session存在Redis中,B可以直接读取,无需用户重新登录。
- 传统Session:存储在单台服务器的内存中,用户请求必须路由到同一服务器(依赖负载均衡的
- 高性能与低延迟:
- 传统Session:内存读写虽快,但受限于单机性能,高并发时可能成为瓶颈。
- Redis:基于内存的键值数据库,支持每秒数十万次操作,且通过多路复用和非阻塞I/O优化高并发访问。
- 持久化与可靠性:
- 传统Session:服务器重启或宕机会导致 Session 数据丢失(内存数据易失性)。
- Redis:支持RDB(快照)和AOF(追加日志)两种持久化机制,确保数据安全故障恢复后仍可保留Session。
- 自动过期与资源管理:
- 传统Session:需手动清理过期 Session,否则内存可能被无效数据占满。
- Redis:支持通过EXPIRE命令自动删除过期Session,避免内存泄漏,简化资源管理。
- 代码示例:
// 设置 Session 过期时间为 30 分钟
stringRedisTemplate.expire("session:token123", 30, TimeUnit.MINUTES);
- 扩展性与灵活性:
- 传统Session:存储内容受限(通常为序列化对象),难以存储复杂结构数据。
- Redis:支持多种数据结构(String、Hash、List、Set 等),可灵活存储用户状态、权限信息、临时缓存等。
- 代码示例:
// 更新用户昵称
stringRedisTemplate.opsForHash().put("user:token123", "nickname", "NewName");
- 高可用与容灾:
- 传统Session:单点故障风险高,服务器宕机导致服务不可用。
- Redis:支持主从复制、哨兵和集群模式,提供故障自动切换和数据冗余,保障高可用性。
- 跨平台与语言无关性:
- 传统Session:依赖特定语言或框架的实现(如 Java 的
HttpSession
),难以跨语言共享。 - Redis:通过统一协议(RESP)提供跨语言支持,不同服务(Java、Python、Go等)可共享同一份Session数据。
- 传统Session:依赖特定语言或框架的实现(如 Java 的
- 安全性增强:
- 传统Session:Session ID 通过 Cookie 传递,可能被劫持(如未启用 HTTPS)。
- Redis:可结合Token机制(如JWT)存储敏感信息,减少Cookie依赖,并通过加密传输提升安全性。
2. 缓存
2.1 什么是缓存
缓存(Cache)是一种临时存储数据的机制,用于加速对高频访问数据的读取。其核心思想是将计算结果或数据库查询结果保存在访问速度更快的存储介质(如内存)中,避免重复执行耗时操作(如复杂计算、数据库查询),从而提升系统性能。
2.2 为什么需要缓存
- 减少数据库压力:避免频繁查询数据库,降低其负载。
- 提升响应速度:内存访问速度远高于磁盘或网络请求(如数据库)。
- 应对高并发:通过缓存热点数据,支撑更多用户同时访问。
- 提高系统可用性:即使数据库短暂不可用,缓存仍可提供部分服务。
2.3 Redis缓存的优势
Redis是一种内存数据库,支持多种数据结构(String、Hash、List、Set等),常被用作高性能缓存解决方案。其优势包括:
- 超高性能:数据存储在内存中,读写速度极快。
- 丰富的数据结构:灵活支持多种数据格式,适应不同场景。
- 持久化:通过 RDB/AOF 机制,可持久化数据到磁盘。
- 分布式支持:天然适合集群化部署,支撑高可用和高并发。
2.4 缓存设计注意事项
- 缓存穿透:
- 问题:查询不存在的数据(如无效 ID),导致请求直接压到数据库。
- 解决:缓存空值 + 布隆过滤器(Bloom Filter)。
- 缓存雪崩:
- 问题:大量缓存同时过期,导致数据库瞬时压力激增。
- 解决:随机化过期时间(如基础 30 分钟 ± 随机 5 分钟)。
- 缓存击穿:
- 问题:热点 Key (就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了)过期瞬间,高并发请求直接访问数据库。
- 解决:互斥锁(如 Redis 的
SETNX
)或永不过期 + 后台异步更新。
3.缓存更新策略
在处理缓存更新策略时,主要目标是确保缓存数据与底层数据源(数据库)保持一致性,同时优化系统性能。以下是常见的缓存更新策略及其使用场景:
3.1 Cache-Aside(旁路缓存)
原理:
- 读操作:先查缓存,命中则返回;未命中则查数据库,并将结果写入缓存。
- 写操作:直接更新数据库,然后删除或更新缓存。
步骤:
- 读流程:
- 检查缓存是否存在数据。
- 缓存命中 → 返回数据。
- 缓存未命中 → 查询数据库 → 写入缓存 → 返回数据。
优点:
- 实现简单,缓存层与应用逻辑解耦。
- 避免写操作频繁触发缓存更新。
缺点:
- 短暂不一致:数据库更新后,缓存删除前可能有旧数据被读取。
- 需处理缓存穿透、雪崩等问题。
适用场景:读多写少,对一致性要求不苛刻的场景(如商品详情页)。
3.2 Read-Through(读穿透)
3.3 Write-Through(写穿透)
4. 缓存的三大问题
在使用缓存时,常见的三大问题包括缓存穿透、缓存击穿和缓存雪崩。这些问题可能导致数据库压力骤增甚至系统崩溃。
4.1 缓存穿透
定义:频繁查询数据库中不存在的数据,导致请求绕过缓存直接访问数据库。
原因:
- 恶意攻击:如用非法参数(如负数的用户ID)发起大量请求。
- 业务缺陷:代码逻辑未过滤无效查询,导致缓存和数据库均无数据。
解决思路:
- 布隆过滤器:在缓存层前加布隆过滤器,快速判断数据是否存在。
- 原理:利用位数组和哈希函数,判断元素是否“可能存在”或“一定不存在”。
- 实现:Redis 通过
RedisBloom
模块支持布隆过滤器。
- 缓存空值:对不存在的的数据缓存空值(null)并设置短过期时间(如5分钟),防止重复查询。
String key = "user:10000";
User user = cache.get(key);
if (user == null) {user = db.getUser(10000);if (user == null) {cache.set(key, "NULL", 5, TimeUnit.MINUTES); // 缓存空值} else {cache.set(key, user, 30, TimeUnit.MINUTES);}
}
注意事项:
- 布隆过滤器有误判率(可能误判存在),需权衡误判率与内存开销。
- 空值缓存需设置较短TTL,避免存储过多无效数据。
4.2 缓存击穿
定义:某个热点数据在缓存过期瞬间,大量并发请求直接穿透到数据库。
原因:热点数据过期后,高并发请求同时查询数据库重建缓存。
解决思路:
- 1. 逻辑过期:缓存不设置TTL,但在数据中存储过期时间,由异步线程主动刷新。
- 原理:逻辑过期的核心思路是在缓存数据中设置一个逻辑上的过期时间,而非实际的过期标识。当缓存数据在逻辑上过期后,并不会立即从缓存中删除,而是在后续查询时进行处理。
- 具体流程(结合图中线程情况说明):
- 查询缓存:当线程(图中线程1、线程3等)查询缓存时,首先判断缓存数据的逻辑过期时间。若发现逻辑时间已过期,进入下一步。
- 获取互斥锁:线程尝试获取互斥锁。只有获取到互斥锁的线程(如图线程1)才能进行后续操作,获取失败的线程(如图线程3)则直接返回过期数据。
- 重建缓存数据:获取到互斥锁的线程(线程1)开启新线程区查询数据库,重建缓存数据。这是因为主线程继续执行,先返回过期数据给调用方,避免长时间等待。新线程从数据库获取最新数据后,写入缓存,并重置逻辑过期时间。
- 释放锁:完成缓存数据重建和逻辑时间重置后,持有锁的线程(线程1)释放互斥锁。
- 后续查询:后续再有线程查询时,若缓存未过期则直接命中缓存获取数据;若逻辑过期,重复上述流程。
- 优点:
- 保证高可用性:在缓存数据重建过程中,未获取到锁的线程能快速返回过期数据,不会因等待重建而长时间阻塞,保证了系统的响应速度和可用性。
- 减少数据库压力:相较于所有请求在缓存未命中时都直接查询数据库,逻辑过期方案只有获取到互斥锁的线程才会去查询数据库重建缓存,降低里数据库的瞬时压力。
- 缺点:
- 数据一致性:在缓存逻辑过期到重建完成这段时间内,返回给用户的数据时过期的,可能导致数据短期不一致。
- 实现复杂度:需要额外维护逻辑过期时间,以及处理互斥锁相关逻辑,增加了代码实现的复杂度。
- 2. 互斥锁:
4.3 缓存雪崩
相关文章:
Redis学习总结(持续更新)
Redis 目前在学习redis,遇到的一些问题会放在这里,加深自己的印象。 1. Redis缓存相较于传统Session存储的特点 Session的存储方式: 通常,传统的Session是存储在应用服务器的内存中,比如Tomcat的Session管理器。用户…...
RabbitMQ从入门到实战-3(高可靠性)
文章目录 发送者可靠性发送者重连发送者确认(一般不会开启)指定returncallback和confrimfallbacktips MQ可靠性数据持久化LazyQueue(默认模式且不可更改) 消费者的可靠性消费者确认机制消费者失败重试业务幂等性唯一消息id业务判断…...
RTK 实时动态定位概述
01 引言 RTK(实时动态定位,Real-Time Kinematic)是一种高精度的卫星导航定位技术,通过差分校正方法,将GNSS(全球导航卫星系统)的定位精度从米级提升至厘米级(通常1-3厘米),广泛应用于测绘、无人机、自动驾驶、精准农业等领域。 02 概述 1. RTK的基本原理 RTK的核…...
Conda 环境离线迁移实战:解决生产环境网络限制的高效方案20250409
Conda 环境离线迁移实战:解决生产环境网络限制的高效方案 在生产环境无法联网的前提下,如何高效、安全地部署 Python 虚拟环境,是许多企业在实际运维中必须面对的问题。特别是当前常见的开发环境基于 Miniconda,生产环境使用 Ana…...
dify使用知识库
注意 要用向量模型 导入文件 选择向量模型 要下载好后,才可以导入模型, 这个模型没法在ollama中run 聊天工具添加知识库 效果...
HTTP:一.概述
http是干嘛的? 超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统…...
Appium工作原理及环境的搭建(1)
1、Appium的介绍: 一、什么是Appium Desktop? Appium Desktop是Appium项目的桌面版GUI工具,提供了一个友好的界面,用于启动Appium服务器、查看设备日志、与设备交互、调试自动化脚本等。相比于命令行工具,Appium Des…...
Interactron: Embodied Adaptive Object Detection(训练时进行更新参数) 还没看懂
Interactron: Embodied Adaptive Object Detection 创新点 这些方法通常存在两个主要的共同假设。第一,模型在固定的训练集上进行训练,并在预先录制的测试集上进行评估。第二,模型在训练阶段结束后保持冻结状态,即训练完成后不再…...
【Pandas】pandas DataFrame copy
Pandas2.2 DataFrame Conversion 方法描述DataFrame.astype(dtype[, copy, errors])用于将 DataFrame 中的数据转换为指定的数据类型DataFrame.convert_dtypes([infer_objects, …])用于将 DataFrame 中的数据类型转换为更合适的类型DataFrame.infer_objects([copy])用于尝试…...
Redis基础指令(Windows)
1.cmd命令行启动redis 直接cmd打开整个文件 1.1.启动server 输入指令: redis-server.exe redis.windows.conf 会进入serve端 1.2.启动客户端 !!重新打开一个cmd,方法和上面一样!! 之后输入 redis-…...
MV-DLS600P激光振镜立体相机(MV-DLS600P)重要参数解析
功能特性 采用激光振镜技术,亚毫米级图像采集精度 高能效激光模块配合精准曝光同步,性能更稳定 支持多帧融合,无惧金属工件表面反光干扰 支持RGB、深度图同步对齐输出,便于二次开发 配备窄带滤光片,抗干扰能力更强&…...
C语言【输出字符串中的大写字母】
题目 输出字符串中的大写字母 思路(注意事项) 纯代码 #include<stdio.h> #include<string.h>int main(){char str[20], ans[20];fgets(str, sizeof(str), stdin);str[strcspn(str, "\n")] \0;for (int i 0, j 0; i < strl…...
UniApp基于xe-upload实现文件上传组件
xe-upload地址:文件选择、文件上传组件(图片,视频,文件等) - DCloud 插件市场 致敬开发者!!! 感觉好用的话,给xe-upload的作者一个好评 背景:开发中经常会有…...
deque容器
1.定义 也叫双端数组,可以对头部进行插入和删除。 2.与vector区别 3.内部工作原理 他是把整个地址划分成多块小地址(缓冲区),然后有一个中控区去记录这些地址,然后访问的时候先通过中控区然后再转到相应的缓冲区&am…...
git 总结遇到的问题
git Push 报错 Push failed send-pack: unexpected disconnect while reading sideband packet Total 2269 (delta 418), reused 0 (delta 0), pack-reused 0 the remote end hung up unexpectedly 解决方案:增加 Git 的缓冲区,有时由于数据量大或网络…...
python基础语法11-文件读写
在 Python 中,文件操作是日常编程中的常见任务之一。Python 提供了简单且强大的工具来读取和写入文件。通过使用内置的 open() 函数、read()、readline()、write() 等方法,我们可以轻松实现对文件的操作。此外,Python 的 with 语句可以帮助我…...
Webstorm 使用搜不到node_modules下的JS内容 TS项目按Ctrl无法跳转到函数实现
将node_modules标记为不排除,此时要把内存改大,不然webstorm中途建立索引时,会因为内存不足,导致索引中途停止,造成后续搜索不出来 更改使用内存设置 内存调为4096 若出现搜不出来js内容时,请直接重启下该项…...
转行嵌入式,需要自学多久?
作为一个本硕都学机械,却阴差阳错进入嵌入式行业的老兵,这个问题我能聊一整天。十几年前我还在工厂车间穿着工装和机床打交道,偶然接触到单片机后就一发不可收拾。 转行这条路我走得异常艰辛,踩过的坑比写过的代码还多。去年我终…...
BLE 协议栈事件驱动机制详解
在 BlueNRG-LP 等 BLE 系统中,事件驱动是控制状态转移、数据交互和外设协作的基础。本文将深入讲解 BLE 协议栈中事件的来源、分发流程、处理结构与实际工程实践策略,帮助你构建稳定、可维护的 BLE 系统。 📦 一、BLE 事件的来源分类 BLE 协议栈中的事件严格来自协议栈本身…...
AI开发学习路线(闯关升级版)
以下是一份轻松版AI开发学习路线,用「闯关升级」的方式帮你从零开始变身AI开发者,每个阶段都配有有趣的任务和实用资源,保证不枯燥、可落地!👇 目录 🔰 新手村:打基础(1-2个月&…...
突破,未观测地区罕见极端降雨的估计
文章中文总结(重点为方法细节) 一、研究背景与目的 在无测站或短观测记录地区,传统极值理论(如GEV)难以估计稀有极端降雨事件;本文提出一种新的区域化极值估计方法:区域化 Metastatistical Ex…...
zk源码—4.会话的实现原理一
大纲 1.创建会话 (1)客户端的会话状态 (2)服务端的会话创建 (3)会话ID的初始化实现 (4)设置的会话超时时间没生效的原因 2.分桶策略和会话管理 (1)分桶策略和过期队列 (2)会话激活 (3)会话超时检查 (4)会话清理 1.创建会话 (1)客户端的会话状态 (2)服务端的会话创建…...
快排算法 (分治实现)
本算法采用将整个数组划分成三个部分 <key key >key 在数组全是同一个数字时,也能达到NlogN的时间复杂度 下面的板书中i为遍历数组的下标 left为<key的最右边的下标 right为>key的最左边的下标 例题1:912. 排序数组 - 力扣࿰…...
P9242 [蓝桥杯 2023 省 B] 接龙数列
这道题说要求最少删多少个使剩下的序列是接龙序列,这个问题可以转换为序列中最长的接龙序列是多少,然后用总长度减去最长接龙序列的长度就可以了,在第一个暴力版本的代码中我用了两个for循环求出了所有的接龙序列的长度,但是会超时…...
未来 AI 发展趋势与挑战(AGI、数据安全、监管政策)
从 ChatGPT 的火爆到国内 DeepSeek、通义千问、百川智能等模型的兴起,AI 正以前所未有的速度走入各行各业。而下一阶段,AI 是否会发展出真正的“通用智能”(AGI)?数据隐私、技术伦理又该如何应对?本文将带你全面洞察未来 AI 的技术趋势与落地挑战。 一、AGI 的曙光:通用…...
驱动开发硬核特训 · Day 6 : 深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比
🔍 B站相应的视屏教程: 📌 内核:博文视频 - 从静态绑定驱动模型到现代设备模型 主题:深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比 在上一节中,我们从驱动框架的历史演进出…...
MyBatis 动态 SQL 使用详解
🌟 一、什么是动态 SQL? 动态 SQL 是指根据传入参数,动态拼接生成 SQL 语句,不需要写多个 SQL 方法。MyBatis 提供了 <if>、<choose>、<foreach>、<where> 等标签来实现这类操作 ✅ 二、动态 SQL 的优点…...
数据结构实验4.1:链队列的基本操作
文章目录 一,问题描述二,基本要求三,算法分析链队列的存储结构设计基本操作的算法分析 四,示例代码五,实验操作六,运行效果 一,问题描述 编程实现有关链队列的下列基本操作。 (1&am…...
独立部署及使用Ceph RBD块存储
Ceph RBD(RADOS Block Device) 是 Ceph 分布式存储系统中的块存储组件,类似于 AWS EBS、iSCSI 等。它独立于 OpenShift 或 IBM CP4BA,是一个分布式存储系统,提供高性能、可扩展性和容错能力,适用于数据库、…...
C++初阶-C++入门基础
目录 编辑 1.C的简介 1.1C的产生和发展 1.2C的参考文档 1.3C优势和难度 1.4C学习的建议 2.C的第一个程序 2.1打印Hello world 2.2头文件 2.3namespace命名空间 2.4::作用域限定符 2.5namespace的延伸 2.6C的输入输出 3.总结 1.C的简介 …...
部署大模型不再难:DeepSeek + 腾讯云 HAI 实战教程
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
算法训练之位运算
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
初识Linux:常见指令与权限的理解,以及相关衍生知识
目录 前言 关于linux的简介 代码开源 网络功能强大 系统工具链完整 一、Linux下的基本指令 1.ls指令 2.pwd指令 3.cd指令 4.whoami指令 5.touch指令 6.mkdir指令 7.rm指令 8.man指令 9.cp指令 10.mv指令 11.nano指令 12.cat指令 13.tac指令 14.more指令 15.less指令 16.head指令…...
PostgreSQL-数据库的索引 pg_operator_oid_index 损坏
报错信息: 连接测试失败 Error connecting to database: Connection failed: ERROR: index "pg_operator_oid_index" contains unexpected zero page at block 3 Hint: Please REINDEX it. 这个错误表明 PostgreSQL 数据库的索引 pg_operator_oid_index …...
数字图像处理作业4
数字图像处理 作业4 Project 4:Image Restoration The scoring method for this project is as follows: 1.Implement a blurring filter using the equation(5.6-11,数字图像处理(…...
Simulink中Signal Builder在新版中找不到怎么办
在较新的MATLAB版本中,新版Simulink中的Signal Builder用Signal Editor作为替代工具。 signal builder not shown in matlab - MATLAB Answers - MATLAB Central signalBuilderToSignalEditor 1.打开上面第二个链接 2.点击拷贝 3.然后在命令行中粘贴 4.然后就会…...
STM32——RTC实时时钟
RTC简介 RTC(Real Time Clock, RTC)实时时钟,其本质是一个计数器,计数频率常为秒,专门用来记录时间。 其具有能提供时间(秒钟数),能在MCU掉电后运行,低功耗的特性 内部框图 1. RTC预分频器 2. …...
sqli-labs靶场 less4
文章目录 sqli-labs靶场less 4 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
指针数组 vs 数组指针
一、指针数组:「数组装指针」—— 每个元素都是指针 🔍 核心定义 语法:类型* 数组名[长度]; ([]优先级高于*,先形成数组,元素是指针)本质:一个 数组,数组的每个元素是 …...
GitHub优秀项目:数据湖的管理系统LakeFS
lakeFS 是一个开源工具,它将用户的对象存储转换为类似Git的存储库。使用户可以像管理代码一样管理数据湖。借助 lakeFS,可以构建可重复、原子化和版本化的数据湖操作--从复杂的ETL作业到数据科学和分析。 Stars 数11090Forks 数3157 主要特点 强大的数据…...
数据库视图讲解(view)
一、为什么需要视图 二、视图的讲解 三、总结 一、为什么需要视图 视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。 比如,针对一个公司的销售人员,我们只想给他看部分数据,…...
pip install pytrec_eval失败的解决方案
1、问题描述 在使用华为云 notebook 的时候,想要: !pip install transformer结果失败,阅读报错后,疑似是 pytrec_eval 库的下载问题。 于是,单独尝试: !pip install pytrec_eval发现确实是这个库安装失…...
使用stream的Collectors.toMap()方法常见问题
文章目录 一、常见问题二、key重复问题2.1、报错示例2.2、解决方法 三、value为空问题3.1、报错示例3.2、解决方法3.1、方案一3.2、方案二 一、常见问题 stream的Collectors.toMap()方法常见问题: 1、 key不能有重复,否则会报错。java.lang.IllegalStat…...
[C++面试] 初始化相关面试点深究
一、入门 1、C中基础类型的初始化方式有哪些?请举例说明 默认初始化 对于全局变量和静态变量,基础类型(如int、float、double等)会被初始化为 0;而对于局部变量,其值是未定义的,包含随机…...
ChatDBA:一个基于AI的智能数据库助手
今天给大家介绍一个基于 AI 大语言模型实现数据库故障诊断的智能助手:ChatDBA。 ChatDBA 是由上海爱可生信息技术股份有限公司开发,通过对话交互,提供数据库故障诊断、专业知识学习、SQL 生成和优化等功能,旨在提升 DBA 工作效率。…...
Java延迟队列
📌 1. 场景背景 最近做项目,使用到了延迟队列。场景是这样的:在在线视频学习中,学生每隔几秒上报当前学习进度,为避免频繁写数据库、提升性能,采用以下方案: 先写入 Redis,再延迟一…...
神舟平板电脑怎么样?平板电脑能当电脑用吗?
在如今的数码产品市场上,神舟平板电脑会拥有独特的优势,其中比较受到大家关注的就是神舟PCpad为例,无论是设计还是规格也会有很多的亮点,那么是不是可以直接当成电脑一起来使用呢? 这款平板电脑就会配备10.1英寸显示屏…...
Ansible的使用3
#### 一、Ansible补充模块 try () { } catch () { } finally 等同于 block () { } rescue () { } always ##### 任务块 - block任务块 - 通过block关键字,将多个任务组合到一起 - 将整个block任务组,一…...
PS教学记录
PS制作手机壁纸和电脑壁纸 1. 思绪来源 找到了一位B站UP,分享了有关于灰原哀的动态壁纸。自身( •̀ ω •́ )也是名侦探柯南的爱好者,在此基础上,萌生了制作壁纸的想法。便在B站上搜寻有关于壁纸制作的教学。找到了一位壁纸分享者的教程镜…...
分析一下HashMap内部是怎么实现的
当然可以!我们来深入分析一下 Java 中 HashMap 的内部实现机制(以 JDK 8 为主),包括数据结构、核心算法、源码设计、以及适用场景。 🧠 一、HashMap 的核心结构 HashMap 是基于哈希表实现的 Map,底层结构是…...