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

Redis实践经验

优雅的Key结构
Key实践约定:

  • 遵循基本格式:[业务名称]:[数据名]:id
  • 例:login:user:10
  • 长度步超过44字节(版本不同,上限不同)
  • 不包含特殊字符

优点:

  • 可读性强
  • 避免key冲突
  • 方便管理
  • 节省内存(key是string类型,底层编码包含int、embstr、raw三种。在小于44个字节时使用embstr,embstr采用连续内存空间,内存占用更小。如果超过44个字节,底层编码使用raw)

BigKey
BigKey通常以key的大小和key中成员的数量来综合判定,例如:

  • Key本身的数据量过大:String类型的Key,它的值的大小是5M
  • Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10000个
  • Key中成员的数据量过大:一个HASH类型的Key,它的成员数量虽然只有10000个,但这些成员的value总大小超过100M

推荐值:

  • 单个Key的value值小于10kb
  • 集合类型的key,建议元素数量小于1000

BigKey的危害:

  • 网络阻塞:对BigKey执行读请求时,少量的QPS就可能导致带宽使用率被沾满,从而导致网络阻塞
  • 数据倾斜:BigKey所在的Redis实例内存使用率远超其他实例,无法使用数据分片的内存资源达到均衡
  • Redis阻塞:对元素较多的hash、list、zset等做运算会耗时较久,使主线程阻塞
  • CPU压力:对BigKey的数据序列化和反序列化会导致CPU的使用率上升,影响Redis

持久化配置

  • 用来做缓存的Redis实例尽量不要开启持久化功能
  • 建议关闭RDB持久化功能,使用AOF持久化
  • 利用脚本定期在slave节点做RDB,实现数据备份
  • 使用AOF持久化,设置合理的rewrite阈值,避免频繁的bgrewrite
  • 配置no-appendfsyns-on-rewrite = yes ,禁止在rewrite期间做aof,避免因AOF引起的阻塞(追求性能可以配置)

部署建议:

  • Redis实例的物理机要预留足够内存,应对fork和rewrite
  • 单个Redis实例内存上限不要太大,例如4G或8G。可以加快fork的速度、减少主从同步、数据迁移压力
  • 不要与CPU密集型应用部署在一起
  • 不要与高硬盘负载应用部署在一起。例如:数据库、消息队列

慢查询
Redis在执行时耗时超过某个阈值的命令,称为慢查询
慢查询的阈值可以通过配置指定:

  • slowlog-log-slower-than:慢查询阈值,单位是微妙。默认是10000,建议1000

慢查询会被放入慢查询日志中,日志长度有上限。

  • slowlog-max-len:慢查询日志(本质是一个队列)的长度。默认是128,建议1000
# 动态配置,重启失效,可在配置文件中永久配置
# 获取配置信息
config get slowlog-log-slower-than
config get slowlog-max-len# 设置配置信息
config set slowlog-log-slower-than 1000
config set slowlog-max-len 1000

命令及安全配置

  • Redis设置复杂密码
  • 禁止线上使用以下命令:keys、flushall、flushdb、config、set等命令。可以利用 rename-command 禁用
  • bind:限制网卡,禁止外网网卡访问
  • 开启防火墙
  • 禁止使用Root账号启动Redis
  • 尽量不要使用默认的端口

内存配置
当Redis内存不足时,可能导致Key频繁被删除、响应时间变长、QPS不稳定等问题。当内存使用率达到90%以上时就需要警惕,并快速定位到内存占用的原因。

内存占用说明
数据内存是Redis最主要的部分,存储Redis的键值信息。主要问题是BigKey问题,内存碎片问题(内存碎片,可直接重启Redis解决)
进程内存Redis主进程本身运行需要占用内存;这部分大约在几兆,在大多数生产环境中与Redis数据占用的内存相比,可以忽略
缓冲区内存一般包括客户端缓冲区、AOF缓冲区、复制缓冲区等。客户端缓冲区又包括输入缓冲区与输出缓冲区两种。这部分内存占用波动较大,不当使用BigKey,可能导致内存溢出

Redis查看内存分配状态,命令如下:

# 查看Redis内存相关信息
info memory
# 查看某个模块的内存信息
memory xxx

内存缓冲区常见三种:

  • 复制缓冲区:主从复制的repl_backlog_buf,如果太小可能导致频繁的全量复制,影响性能。通过repl_backlog_buf来设置,默认是1mb
  • AOF缓冲区:AOF刷盘之前的缓存区域,AOF执行rewire的缓冲区。无法设置容量上限
  • 客户端缓冲区:分为输入流和输出流缓冲区,输入缓冲区最大1G且不能设置。输出缓冲区可以设置,如下图:
    在这里插入图片描述
    在这里插入图片描述

集群最佳实践
集群完整性问题:

# 默认配置,该配置表明,如果发现任意一个插槽不可用,则整个集群都会停止对外服务
cluster-require-full-coverage yes
# 因此,为了保证高可用特性,把默认配置改成 no 
cluster-require-full-coverage no

集群带宽问题:

集群之间会不断的互相Ping来确定集群中其他节点的状态。每次Ping都会携带的信息至少包括:插槽信息、集群状态信息,集群中节点越多,集群状态信息数据量越大,10个节点的相关信息可能达到1kb,此时每次集群互通需要的带宽会非常高。

解决途径:

  • 避免大集群,集群节点数不要太多,最好少于1000,如果业务庞大,建议多个集群
  • 避免在单个物理机中运行太多Redis实例,建议10个以内
  • 配置合适的cluster-node-timeout值

相关文章:

Redis实践经验

优雅的Key结构 Key实践约定: 遵循基本格式:[业务名称]:[数据名]:id例:login:user:10长度步超过44字节(版本不同,上限不同)不包含特殊字符 优点: 可读性强避免key冲突方便管理节省内存&#x…...

分类题解清单

目录 简介MySQL题一、聚合函数二、排序和分组三、高级查询和连接四、子查询五、高级字符串函数 / 正则表达式 / 子句 算法题一、双指针二、滑动窗口三、模拟四、贪心五、矩阵六、排序七、链表八、设计九、前缀和十、哈希表十一、字符串十二、二叉树十三、二分查找十四、回溯十五…...

QUdpSocket 的bind函数详解

QUdpSocket 是 Qt 框架中用于处理 UDP 网络通信的类。bind 函数是此类中的一个重要方法,它用于将 QUdpSocket 对象绑定到一个特定的端口上,以便在该端口上接收 UDP 数据包。 函数原型 在 Qt 中,bind 函数的原型通常如下所示: b…...

[spring] Spring MVC - security(下)

[spring] Spring MVC - security(下) callback 一下,当前项目结构如下: 这里实现的功能是连接数据库,大范围和 [spring] rest api security 重合 数据库连接 - 明文密码 第一部分使用明文密码 设置数据库 主要就是…...

数据库数据恢复—SQL Server数据库由于存放空间不足报错的数据恢复案例

SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生…...

spring security的demo

参考: https://juejin.cn/post/6844903502003568647 Spring Security 5.7.0弃用 WebSecurityConfigurerAdapter-CSDN博客 创建 Spring Security 配置类 WebSecurityConfigurerAdapter已被弃用 package com.cq.sc.security.config;import org.springframework.c…...

无需构建工具,快速上手Vue2 + ElementUI

无需构建工具,快速上手Vue2 ElementUI 在前端开发的世界中,Vue.js以其轻量级和易用性赢得了开发者的青睐。而Element UI,作为一个基于Vue 2.0的桌面端组件库,提供了丰富的界面组件,使得构建美观且功能丰富的应用变得…...

通信协议_Modbus协议简介

概念介绍 Modbus协议:一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De f…...

LabVIEW优化氢燃料电池

太阳能和风能的发展引入了许多新的能量储存方法。随着科技的发展,能源储存和需求平衡的方法也需要不断创新。智慧城市倡导放弃石化化合物,采用环境友好的发电和储能技术。氢气系统和储存链在绿色能源倡议中起着关键作用。然而,氢气密度低&…...

SpringCloudGateway

作用 统一管理,易于监控安全,限流:在网关层就过滤掉非法信息nginx外部网关,gateway内网nginx可以使用Lua或Kong来增强 概念 id:名称随意uri: 被代理的服务地址。id和uri必填,谓词和过滤器非必填谓词:可以…...

Wireshark 对 https 请求抓包并展示为明文

文章目录 1、目标2、环境准备3、Wireshark 基本使用4、操作步骤4.1、彻底关闭 Chrome 进程4.2、配置 SSLKEYLOGFILE [核心步骤]4.3、把文件路径配置到 Wireshark 指定位置4.4、在浏览器发起请求4.5、抓包配置4.6、过滤4.6.1、过滤域名 http.host contains "baidu.com4.6.2…...

如何在Ubuntu环境下使用加速器配置Docker环境

一、安装并打开加速器 这个要根据每个加速器的情况来安装并打开,一般是会开放一个代理端口,比如1087 二、安装Docker https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script 三、配置Docker使用加速器 3.1 修改配置…...

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片 1 目标效果视频 CamManager 2 CamManager读取本地文件时序 3 BD_Vision_Utility添加代码 3.0 导入链接库 BD_OperatorSets.dllSystem.Windows.Forms.dllOpencvSharp 3.1 导入VisionParam中创建的文件Util_FileO…...

算法简介:什么是算法?——定义、历史与应用详解

引言 在现代计算机科学中,算法是一个核心概念。无论是编程还是数据分析,算法都扮演着至关重要的角色。在这篇博客中,我们将深入探讨算法的定义、历史背景以及它在计算机科学中的地位和实际应用。 什么是算法? 算法是解决特定问题…...

xss攻击

一、xss攻击简介 1、OWASP TOP 10之一,XSS被称为跨站脚本攻击(Cross-site-scripting)2、主要基于java script(JS)完成恶意攻击行为。JS可以非常灵活的操作html、css和浏览器,这使得XSS攻击的“想象”空间特别大。3、XSS通过将精心构造代码(JS)代码注入到网页中,并由…...

Android 性能优化之布局优化

文章目录 Android 性能优化之布局优化绘制原理双缓冲机制布局加载原理检测耗时常规方式AOP方式获取控件加载耗时 布局优化AsyncLayoutInflater方案Compose方案减少布局层级和复杂度避免过度绘制 Android 性能优化之布局优化 绘制原理 CPU:负责执行应用层的measure…...

TCP 握手数据流

这张图详细描述了 TCP 握手过程中,从客户端发送 SYN 包到服务器最终建立连接的整个数据流转过程,包括网卡、内核、进程中的各个环节。下面对每个步骤进行详细解释: 客户端到服务器的初始连接请求 客户端发送 SYN 包: 客户端发起…...

MDA协议

MDA协议通常指消息摘要算法(Message Digest Algorithm),在计算机安全和密码学中被广泛用于数据完整性验证和认证。以下是对MDA协议的详细介绍: 1. 概述 MDA协议是一类哈希函数,用于生成固定长度的消息摘要或哈希值。…...

always块敏感列表的相关报错,

在综合的时候,报错如下 Synthesis synth_1 [Synth 8-91] ambiguous clock in event control ["E:/FPGA/FPGA_project/handwrite_fft/handwrite_fft.srcs/sources_1/new/reg_s2p.v":140] 猜测报错原因(暂时没有时间寻找原因,后续在…...

STM32空闲中断处理串口接受数据

1、检测到空闲线路中断也叫做空闲中断,意思是串口接收完1字节数据后,数据先保持高电平(空闲)的时间超过1字节数据所用的时间,则被判定为空闲中断。 2、HAL库中操作空闲中断的宏是 (1)_HAL_UAR…...

XML Group端口详解

在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

macOS 终端智能代理检测

🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...