🔥 Redis 大 Key 与热 Key:生产环境的风险与解决方案

文章目录

  • 🔥 Redis 大 Key 与热 Key:生产环境的风险与解决方案
  • 🧠 一、问题定义与识别
    • 💡 什么是大 Key?
    • 🔥 什么是热 Key?
    • 📊 大 Key 与热 Key 对比
  • ⚠️ 二、风险深度分析
    • 💥 大 Key 的风险与影响
    • 🔥 热 Key 的风险与影响
    • 📈 综合影响分析
  • 🔍 三、定位与诊断方法
    • 🛠️ 内置工具诊断
    • 📊 热 Key 诊断方法
    • 🔧 第三方工具集成
  • 🛠️ 四、解决方案与实战
    • 🔨 大 Key 解决方案
    • 🔥 热 Key 解决方案
    • 🛡️ 综合防护方案
  • 💡 五、最佳实践与预防
    • 📋 日常监控预防策略
    • 🏗️ 架构优化建议
    • 📊 性能对比评估
    • 🚀 全链路优化体系

🧠 一、问题定义与识别

💡 什么是大 Key?

​​大 Key(Big Key)​​ 是指存储值过大的 Redis Key,通常有以下特征:

45%25%20%10%大 Key 类型分布String大ValueHash大FieldList/Set元素过多ZSet元素过多

​​大 Key 判断标准​​:

# 大Key的量化标准
String类型:value > 10KB
Hash/Set/ZSet类型:元素数量 > 1000
List类型:元素数量 > 1000
所有类型:整体大小 > 1MB

🔥 什么是热 Key?

​​热 Key(Hot Key)​​ 是指访问频率异常高的 Key,通常具有以下特征:

热Key特征
QPS异常高
集中访问
单节点压力
容易成为瓶颈
通常QPS > 1000
80%请求集中在20%的Key
导致数据倾斜
可能引发雪崩

​​热 Key 判断标准​​:

# 热Key的量化标准
单个Key的QPS > 1000
占用总请求量的 > 5%
导致节点负载比其他节点高50%+

📊 大 Key 与热 Key 对比

特征大 Key (Big Key)热 Key (Hot Key)
定义Value尺寸过大访问频率过高
问题本质数据存储问题数据访问问题
主要影响阻塞、网络延迟性能瓶颈、数据倾斜
检测方式内存分析、扫描监控、流量分析
解决方案数据拆分、压缩多级缓存、分片

⚠️ 二、风险深度分析

💥 大 Key 的风险与影响

​​1. 阻塞风险​​:

sequenceDiagramparticipant C as Clientparticipant R as Redisparticipant N as NetworkC->>R: 发送大Key操作请求R->>R: 处理大量数据(阻塞)Note over R: 单线程阻塞其他命令R->>N: 传输大数据量N->>C: 响应延迟高style R fill:#f99,stroke:#333

​​2. 网络压力​​:

# 示例:一个10MB的Key
# 每秒100次访问产生的网络流量
10MB * 100 = 1000MB/s = 8Gbps
# 这可能会占满万兆网卡!

​​3. 内存不均​​:

# 内存分布示例
Node1: 10GB (包含8GB的大Key)
Node2: 2GB
Node3: 2GB
# 导致节点负载严重不均衡

​​4. 持久化问题​​:

// BGSAVE时fork操作可能阻塞
// 如果一个大Key占用了8GB内存
// fork需要复制8GB内存页表,可能导致长时间阻塞

🔥 热 Key 的风险与影响

​​1. 单点瓶颈​​:

客户端1
Redis节点
客户端2
客户端3
客户端4
客户端5
热Key

​​2. 数据倾斜​​:

# 集群环境下的数据倾斜
节点1: QPS 50,000 (包含热Key)
节点2: QPS 800
节点3: QPS 750
节点4: QPS 700
# 一个热Key导致整个集群负载不均

​​3. 缓存击穿​​:

// 热Key过期时的大量并发请求
public Object getHotKey(String key) {Object value = redis.get(key);if (value == null) {// 大量请求同时到达数据库value = loadFromDB(key);redis.setex(key, 300, value);}return value;
}

​​4. 资源竞争​​:

# CPU竞争:处理热Key的线程占用大量CPU
# 网络竞争:热Key的网络流量挤占其他请求
# 连接竞争:大量客户端连接等待同一个Key

📈 综合影响分析

大Key
阻塞延迟
网络拥塞
内存压力
热Key
单点瓶颈
数据倾斜
缓存击穿
系统不稳定
业务故障

🔍 三、定位与诊断方法

🛠️ 内置工具诊断

​​1. redis-cli --bigkeys 分析​​:

# 执行大Key分析
redis-cli --bigkeys# 输出示例:
# Biggest string found so far 'big:string:key' with 10240000 bytes
# Biggest hash found so far 'big:hash:key' with 100000 fields
# Biggest list found so far 'big:list:key' with 50000 items
# Biggest set found so far 'big:set:key' with 80000 members
# Biggest zset found so far 'big:zset:key' with 60000 members# 定期执行分析脚本
#!/bin/bash
echo "开始大Key分析: $(date)"
redis-cli --bigkeys -i 0.1 | grep -E "(Biggest|bytes|fields|items|members)"
echo "分析完成: $(date)"

​​2. memory usage 命令​​:

# 精确查询Key的内存使用
redis-cli memory usage user:profile:1234# 批量采样分析
for key in $(redis-cli keys "user:profile:*" | head -100); dosize=$(redis-cli memory usage $key)echo "$key: $size bytes"
done | sort -n -k2 -r | head -10

​​3. monitor 命令抓包​​:

# 实时监控命令请求
redis-cli monitor | grep -E "(GET|HGET|SMEMBERS|LRANGE)" | head -1000# 分析命令频率
redis-cli monitor | awk '{print $4}' | sort | uniq -c | sort -nr | head -10

📊 热 Key 诊断方法

​​1. 实时流量分析​​:

# 使用monitor统计热Key
redis-cli monitor | awk '
BEGIN { count=0 }
{if ($4 ~ /"(GET|HGET|SMEMBERS|LRANGE)"/) {key = $5;keys[key]++;count++;}if (count > 10000) exit;
}
END {for (key in keys) {print keys[key], key;}
}' | sort -nr | head -20

​​2. Lua 脚本统计​​:

-- 热Key统计脚本
local function track_hot_keys()local key = KEYS[1]local now = tonumber(ARGV[1])local window = 60 -- 统计窗口60秒-- 使用有序集合统计热度redis.call('ZADD', 'hotkey:tracking', now, key)redis.call('ZREMRANGEBYSCORE', 'hotkey:tracking', 0, now - window)local count = redis.call('ZCARD', 'hotkey:tracking')if count > 1000 thenredis.log(redis.LOG_WARNING, "热Key detected: " .. key)end
end

🔧 第三方工具集成

​​1. Prometheus + Redis Exporter​​:

# docker-compose.yml 监控栈
version: '3'
services:redis-exporter:image: oliver006/redis_exporterports:- "9121:9121"environment:- REDIS_ADDR=redis://redis:6379command:- '--redis.addr=redis://redis:6379'- '--redis.password=${REDIS_PASSWORD}'prometheus:image: prom/prometheusports:- "9090:9090"volumes:- ./prometheus.yml:/etc/prometheus/prometheus.ymlgrafana:image: grafana/grafanaports:- "3000:3000"

​​2. 自定义监控脚本​​:

#!/usr/bin/env python3
# hotkey_detector.py
import redis
import time
from collections import defaultdictclass HotKeyDetector:def __init__(self, host='localhost', port=6379):self.r = redis.Redis(host=host, port=port)self.key_stats = defaultdict(int)self.start_time = time.time()def monitor_keys(self, duration=60):"""监控指定时间内的Key访问"""end_time = time.time() + durationpubsub = self.r.pubsub()pubsub.psubscribe('__keyspace@0__:*')for message in pubsub.listen():if time.time() > end_time:breakif message['type'] == 'pmessage':key = message['channel'].split(':', 1)[1]self.key_stats[key] += 1# 输出热Key报告self.generate_report()def generate_report(self):"""生成热Key报告"""total_ops = sum(self.key_stats.values())print(f"监控时间: {time.time() - self.start_time:.2f}秒")print(f"总操作数: {total_ops}")print("热Key排名TOP10:")for key, count in sorted(self.key_stats.items(), key=lambda x: x[1], reverse=True)[:10]:percentage = (count / total_ops) * 100print(f"  {key}: {count}次 ({percentage:.2f}%)")if __name__ == "__main__":detector = HotKeyDetector()detector.monitor_keys(300)  # 监控5分钟

🛠️ 四、解决方案与实战

🔨 大 Key 解决方案

​​1. 数据拆分​​:

// 原始大Hash拆分示例
public class BigHashSplitter {// 原始大Keypublic void saveUserProfile(String userId, Map<String, String> profile) {// 反例:所有数据存到一个Hashjedis.hmset("user:profile:" + userId, profile);}// 拆分方案:按业务维度拆分public void saveUserProfileSplit(String userId, Map<String, String> profile) {// 基础信息Map<String, String> basicInfo = new HashMap<>();basicInfo.put("name", profile.get("name"));basicInfo.put("email", profile.get("email"));jedis.hmset("user:basic:" + userId, basicInfo);// 扩展信息Map<String, String> extendedInfo = new HashMap<>();extendedInfo.put("address", profile.get("address"));extendedInfo.put("preferences", profile.get("preferences"));jedis.hmset("user:extended:" + userId, extendedInfo);// 统计信息Map<String, String> statsInfo = new HashMap<>();statsInfo.put("login_count", profile.get("login_count"));statsInfo.put("last_login", profile.get("last_login"));jedis.hmset("user:stats:" + userId, statsInfo);}
}

​​2. 数据压缩​​:

// 数据压缩方案
public class DataCompressor {public void saveCompressedData(String key, Object data) {try {// 序列化数据byte[] serialized = serialize(data);// 使用GZIP压缩ByteArrayOutputStream baos = new ByteArrayOutputStream();GZIPOutputStream gzip = new GZIPOutputStream(baos);gzip.write(serialized);gzip.close();byte[] compressed = baos.toByteArray();// 存储压缩数据jedis.set(key.getBytes(), compressed);} catch (IOException e) {throw new RuntimeException("压缩失败", e);}}public Object getCompressedData(String key) {byte[] compressed = jedis.get(key.getBytes());if (compressed == null) return null;try {// 解压数据GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(compressed));ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len = gzip.read(buffer)) > 0) {baos.write(buffer, 0, len);}gzip.close();byte[] serialized = baos.toByteArray();return deserialize(serialized);} catch (IOException e) {throw new RuntimeException("解压失败", e);}}
}

​​3. 数据归档​​:

// 冷热数据分离方案
public class DataArchiver {public Object getData(String key) {// 首先从Redis查询Object data = jedis.get(key);if (data != null) {return data;}// Redis中没有,从归档存储查询data = archiveStorage.get(key);if (data != null) {// 异步回填Redis(短期缓存)jedis.setex(key, 3600, serialize(data)); // 缓存1小时}return data;}public void archiveOldData() {// 定期将旧数据迁移到归档存储Set<String> oldKeys = findOldKeys();for (String key : oldKeys) {Object data = jedis.get(key);if (data != null) {archiveStorage.put(key, data);jedis.del(key);}}}
}

🔥 热 Key 解决方案

​​1. 本地缓存 + 刷新策略​​:

public class HotKeyCache {private final LoadingCache<String, Object> localCache;private final Jedis jedis;public HotKeyCache() {this.localCache = Caffeine.newBuilder().maximumSize(1000).expireAfterWrite(5, TimeUnit.SECONDS) // 短期缓存.refreshAfterWrite(1, TimeUnit.SECONDS) // 主动刷新.build(this::loadFromRedis);}public Object get(String key) {try {return localCache.get(key);} catch (Exception e) {return loadFromRedis(key);}}private Object loadFromRedis(String key) {return jedis.get(key);}
}

​​2. 多副本分散​​:

// 热Key多副本方案
public class HotKeyReplication {private static final int REPLICA_COUNT = 5;public void set(String key, Object value) {// 主副本jedis.set(key, serialize(value));// 创建多个副本for (int i = 1; i <= REPLICA_COUNT; i++) {String replicaKey = key + ":replica:" + i;jedis.set(replicaKey, serialize(value));jedis.expire(replicaKey, 3600); // 设置过期时间}}public Object get(String key) {// 随机选择副本int replicaNum = ThreadLocalRandom.current().nextInt(1, REPLICA_COUNT + 1);String replicaKey = key + ":replica:" + replicaNum;Object value = jedis.get(replicaKey);if (value == null) {// 副本不存在,回退到主Keyvalue = jedis.get(key);if (value != null) {// 重建副本set(key, value);}}return value;}
}

​​3. 代理层分片​​:

// 基于代理的热Key分片
public class HotKeyProxy {private List<Jedis> redisNodes;private int nodeCount;public HotKeyProxy(List<Jedis> nodes) {this.redisNodes = nodes;this.nodeCount = nodes.size();}public void set(String key, Object value) {// 写入所有节点for (Jedis node : redisNodes) {node.set(key, serialize(value));}}public Object get(String key) {// 根据Key哈希选择节点int nodeIndex = Math.abs(key.hashCode()) % nodeCount;return redisNodes.get(nodeIndex).get(key);}// 特别热门的Key:在所有节点都存储public void setHotKey(String key, Object value) {for (Jedis node : redisNodes) {node.set(key, serialize(value));}}public Object getHotKey(String key) {// 随机选择节点,分散压力int randomNode = ThreadLocalRandom.current().nextInt(nodeCount);return redisNodes.get(randomNode).get(key);}
}

🛡️ 综合防护方案

​​多级缓存架构​​:

缓存命中
负载均衡
缓存击穿
客户端
本地缓存
代理层
Redis集群
数据库

​​降级策略​​:

public class CircuitBreaker {private final CircuitBreakerConfig config;private int failureCount = 0;private long lastFailureTime = 0;public Object getWithCircuitBreaker(String key) {if (isOpen()) {// 熔断状态:直接返回降级结果return getFallbackValue(key);}try {Object value = jedis.get(key);reset(); // 成功则重置熔断器return value;} catch (Exception e) {recordFailure();return getFallbackValue(key);}}private boolean isOpen() {if (failureCount >= config.getThreshold()) {long now = System.currentTimeMillis();if (now - lastFailureTime < config.getTimeout()) {return true;}// 超时后尝试半开reset();}return false;}private void recordFailure() {failureCount++;lastFailureTime = System.currentTimeMillis();}private void reset() {failureCount = 0;}
}

💡 五、最佳实践与预防

📋 日常监控预防策略

​​1. 定期健康检查​​:

#!/bin/bash
# daily_redis_check.sh# 1.Key检查
echo "=== 大Key检查 ==="
redis-cli --bigkeys -i 0.1 | grep -E "(Biggest|bytes|fields|items)"# 2. 内存分析
echo "=== 内存分析 ==="
redis-cli info memory | grep -E "(used_memory|mem_fragmentation_ratio)"# 3.Key检查
echo "=== 热Key检查 ==="
redis-cli monitor | head -1000 | awk '
{ counts[$4]++ }
END {for (cmd in counts) {print counts[cmd], cmd;}
}' | sort -nr | head -5# 4. 生成报告
echo "检查完成时间: $(date)"

​​2. 自动化告警规则​​:

# alert_rules.yml
groups:
- name: redis_alertsrules:- alert: RedisBigKeyDetectedexpr: redis_key_size_bytes > 1048576  # 1MBfor: 5mlabels:severity: warningannotations:summary: "发现大Key: {{ $labels.key }}"description: "Key {{ $labels.key }} 大小 {{ $value }} bytes"- alert: RedisHotKeyDetectedexpr: rate(redis_command_count{key=~".+"}[5m]) > 1000for: 2mlabels:severity: criticalannotations:summary: "发现热Key: {{ $labels.key }}"description: "Key {{ $labels.key }} QPS {{ $value }}"- alert: RedisMemoryFragmentationexpr: redis_mem_fragmentation_ratio > 1.5for: 10mlabels:severity: warningannotations:summary: "内存碎片率过高"description: "当前碎片率 {{ $value }}"

🏗️ 架构优化建议

​​1. Proxy 层优化​​:

// 基于代理的Key治理
public class KeyGovernanceProxy {private Map<String, KeyInfo> keyMetadata = new ConcurrentHashMap<>();public Object get(String key) {KeyInfo info = keyMetadata.computeIfAbsent(key, this::analyzeKey);if (info.isHotKey()) {// 热Key特殊处理return getHotKey(key);} else if (info.isBigKey()) {// 大Key特殊处理return getBigKey(key);} else {// 正常处理return jedis.get(key);}}private KeyInfo analyzeKey(String key) {// 分析Key的特征long size = jedis.memoryUsage(key);long accessCount = getAccessCount(key);return new KeyInfo(size, accessCount);}
}

​​2. 集群优化配置​​:

# redis.conf 优化配置
# 内存管理
maxmemory 16gb
maxmemory-policy allkeys-lru
activedefrag yes# 持久化优化
aof-use-rdb-preamble yes
aof-rewrite-incremental-fsync yes# 网络优化
tcp-backlog 65535
maxclients 10000

📊 性能对比评估

方案实施复杂度效果适用场景风险
数据拆分效果好大Key问题业务改造量大
数据压缩效果中等值类型大KeyCPU开销增加
多副本缓存效果很好热Key问题数据一致性风险
本地缓存效果极好极端热Key缓存一致性问题
代理分片效果极好集群环境架构复杂度高

🚀 全链路优化体系

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++算法题中的输入输出形式(I/O)

本文主要帮助刷leetcode题型快速适应完整带输入输出的题&#xff08;机试、考试、比赛等&#xff09;接收能用cin就用cin 。cin 自动分割单词 的特性&#xff08;cin 读取字符串时会自动跳过空格 / 换行&#xff0c;将连续非空格字符作为一个 “单词”&#xff09;一、单组输入…

【左程云算法09】栈的入门题目-最小栈

目录 栈的入门题目-最小栈 代码演示 视频链接 算法讲解015【入门】栈的入门题目-最小栈 Leecode155 栈的入门题目-最小栈 实现一个getmin方法&#xff08;高效方法&#xff0c;即不用遍历&#xff09;&#xff0c;希望能实现O&#xff08;1&#xff09; 做法&#xff1a…

Grafana与Prometheus实战

&#x1f31f;Grafana的Dashboard的权限管理 创建团队 创建用户 设置团队权限 &#x1f31f;Prometheus启用https及认证功能 自建ca的证书 准备证书目录 mkdir /app/tools/prometheus-2.53.4.linux-amd64/certs cd /app/tools/prometheus-2.53.4.linux-amd64/certs生成ca的…

FPGA交通灯设计报告(源码+管脚约束+实物图+设计报告)

基于FPGA的交通灯设计 摘要 本设计采用FPGA技术实现了一个智能交通灯控制系统。系统以Verilog HDL为设计语言,在FPGA平台上实现了交通灯的自动控制、数码管倒计时显示、紧急情况处理等功能。通过合理的状态机设计和模块化编程,系统具有良好的实时性、可靠性和可扩展性,能够…

技术论文分析分析论文《计算机病毒判定专家系统原理与设计》思考其在游戏中的应用

论文原文的引言主要有两大部分的内容&#xff1a;介绍计算机病毒&#xff0c;明确本文使用的病毒分类方式&#xff1b;分析传统计算机病毒检测存在的弊端。对于计算机病毒的定义&#xff0c;文中给出的定义比较严谨&#xff0c;我自己查了一下现在百度百科的定义&#xff0c;两…

《Unity项目实战:动态加载引发的显存危机全链路排查与重构实践》

从动态光影那流光溢彩、仿佛赋予虚拟世界真实质感的绚丽效果—这得益于Unity引擎强大的HDRP管线对光照路径的精准模拟,到物理引擎驱动的物体碰撞精准到毫厘的物理反馈—依托Unity Physics模块对刚体动力学的毫秒级计算,再到能够依据不同设备性能自动适配的画质表现—通过Unit…

智慧水库综合管理系统平台御控物联网解决方案

一、行业背景与痛点分析水库作为防洪、灌溉、供水、发电及生态保护的核心基础设施&#xff0c;其管理效率直接关系到区域水资源安全与可持续发展。然而&#xff0c;传统水库管理模式存在四大核心痛点&#xff1a;数据孤岛严重&#xff1a;水位、雨量、水质、设备状态等数据分散…

使用nvm安装Node.js18以下报错解决方案——The system cannot find the file specified.

使用 nvm 安装 Node.js 18以下 报错解决方案 在前端开发过程中&#xff0c;常常需要针对不同项目切换 Node.js 版本。nvm&#xff08;Node Version Manager&#xff09;是最常用的工具。但最近在尝试安装 Node.js 14 版本时&#xff0c;遇到了奇怪的错误。 问题描述 使用 nv…

在Excel和WPS表格中快速复制上一行内容

有的时候我们在Excel和WPS表格中想复制上一行对应单元格、连续区域或整行的内容&#xff0c;只需要在当前行拖动鼠标左键选中相关区域&#xff0c;然后按CtrlD键即可将上一行对应位置的内容复制过来——需要注意的是&#xff0c;如果当前行有数据&#xff0c;这些数据会直接被覆…

408学习之c语言(递归与函数)

今天主要学习了递归与函数的相关内容&#xff0c;下面将我今天所学知识与所写代码分享给大家 递归核心要点 递归三要素 基准条件&#xff08;明确终止条件&#xff09; 递归调用&#xff08;逐步分解问题&#xff09; 收敛性&#xff08;确保每次递归都向基准条件靠近&#xff…

swVBA自学笔记016、Solidworks API Help 帮助文档的(三大版块)

目录1. Namespace (命名空间) 版块2. Interface (接口) 版块3. Members (接口成员) 版块4、总结关系5、如果你感觉上面说的过于简单&#xff0c;请往下看!6、示例链接→SOLIDWORKS API Help 20197、需要注意的是&#xff0c;带“I”的对象表示&#xff1a;接口1. Namespace (命…

通俗易懂地讲解JAVA的BIO、NIO、AIO

理解Java的I/O模型&#xff08;BIO、NIO、AIO&#xff09;对于构建高性能网络应用至关重要 &#x1f9e0; 通俗理解&#xff1a;快递站的故事 想象一个快递站&#xff1a; • BIO&#xff1a;就像快递站为每一个包裹都安排一位专员。专员从接到包裹到处理完&#xff08;签收、…

LabVIEW 泵轮检测系统

在汽车行业&#xff0c;泵轮作为液力变矩器关键部件&#xff0c;其质量检测极为重要。传统手工检测泵轮效率低且误差大&#xff0c;为此构建基于 LabVIEW 与西门子硬件结合的泵轮检测系统。 应用场景 聚焦汽车零部件生产车间&#xff0c;对泵轮总成进行出厂前检测。在液力变矩…

2025年8月月赛 T2 T3

一. 七天假日 T2原思路&#xff1a;直接计算左右括号的数量&#xff0c;然后直接输出他们的差改进思路&#xff1a; 用d值记录截止到当前位置&#xff0c;还需要多少个右括号可以满足非法要求cur&#xff1a;截止到当前位置&#xff0c;已经有多少个右括号sum是右括号位置的前缀…

数据结构----栈的顺序存储(顺序栈)

栈的特点&#xff1a;先进后出栈的操作&#xff1a;用数组进行存储&#xff08;1&#xff09;初始化&#xff1a;//栈 typedef struct {int *data;//指针模拟分配数组int top;//栈“顶”指针 }Stack; //初始化 Stack InitStack(){Stack s;//给数组分配空间s.data (int*)malloc…

React Hooks原理深度解析与高级应用模式

React Hooks原理深度解析与高级应用模式 引言 React Hooks自16.8版本引入以来&#xff0c;彻底改变了我们编写React组件的方式。然而&#xff0c;很多开发者仅仅停留在使用层面&#xff0c;对Hooks的实现原理和高级应用模式了解不深。本文将深入探讨Hooks的工作原理、自定义Hoo…

兼职网|基于SpringBoot和Vue的蜗牛兼职网(源码+数据库+文档)

项目介绍 : SpringbootMavenMybatis PlusVue Element UIMysql 开发的前后端分离的蜗牛兼职网&#xff0c;项目分为管理端和用户端和企业端。 项目演示: 基于SpringBoot和Vue的蜗牛兼职网 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可…

TDengine 聚合函数 LEASTSQUARES 用户手册

LEASTSQUARES 函数用户手册 函数定义 LEASTSQUARES(expr, start_val, step_val)功能说明 LEASTSQUARES() 函数对指定列的数据进行最小二乘法线性拟合&#xff0c;返回拟合直线的斜率&#xff08;slope&#xff09;和截距&#xff08;intercept&#xff09;。该函数基于线性回…

Redis最佳实践——安全与稳定性保障之高可用架构详解

全面详解 Java 中 Redis 在电商应用的高可用架构设计一、高可用架构核心模型 1. 多层级高可用体系 #mermaid-svg-anJ3iQ0ymhr025Jn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-anJ3iQ0ymhr025Jn .error-icon{fil…

ABAP 屏幕在自定义容器写多行文本框

文章目录变量定义容器等逻辑屏幕效果变量定义 CONSTANTS: GC_TEXT_LINE_LENGTH TYPE I VALUE 72. TYPES: TEXT_TABLE_TYPE(GC_TEXT_LINE_LENGTH) TYPE C OCCURS 0. DATA: GV_SPLITTER TYPE REF TO CL_GUI_EASY_SPLITTER_CONTAINER. DATA: GV_CUSTOM_CONTAINER TYPE REF TO CL_…