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值

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

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

相关文章

Ubuntu 编译和运行ZLMediaKit

摘要 本文描述了如何在Ubuntu上构建ZLMediaKIt项目源码,以及如何体验其WebRTC推流和播放功能。 实验环境 操作系统版本:Ubuntu 22.04.3 LTS gcc版本:11.4.0 g版本:11.4.0 依赖库安装 #让ZLMediaKit媒体服务器具备WebRTC流转发…

Git 在commit后,撤销commit

1. 撤销已经add,但是没有commit的问题 git reset HEAD 2. 撤销已经commit,但是没有push到远端的文件(仅撤销commit 保留add操作) 撤销上一次的提交 git reset --soft HEAD^windows 系统使用提示 more,需要多加一个…

使用 Unstructured.io 和 Elasticsearch 向量数据库搜索复杂文档

作者:来自 Elastic Amy Ghate, Rishikesh Radhakrishnan, Hemant Malik 使用非结构化和 Elasticsearch 向量数据库为 RAG 应用程序提取和搜索复杂的专有文档 在使信息可搜索之前解析文档是构建实际 RAG 应用程序的重要步骤。Unstructured.io 和 Elasticsearch 在此…

mybatis动态传入参数 pgsql 日期 Interval ,day,minute

mybatis动态传入参数 pgsql 日期 Interval 在navicat中,标准写法 SELECT * FROM test WHERE time > (NOW() - INTERVAL 5 day)在mybatis中,错误写法 SELECT * FROM test WHERE time > (NOW() - INTERVAL#{numbers,jdbcTypeINTEGER} day)报错内…

Docker Compose 启动容器例子

Docker Compose 启动容器例子 Docker Compose 文件 (docker-compose.yml) version: 3.8services:web:image: nginx:latestports:- "8080:80"volumes:- ./html:/usr/share/nginx/htmlnetworks:- webnetdb:image: mysql:latestenvironment:MYSQL_ROOT_PASSWORD: exam…

谷歌浏览器插件开发笔记0.1.033

谷歌浏览器插件开发笔记0.1.000 示例文件manifest.jsonpopup.htmloptions.jsoptions.htmlcontent.jsbackground.js 网页按钮快捷键插件api使用基础参考链接 示例文件 共计有6个常用的文件 manifest.json background字段:随着浏览器的打开而打开,随着浏…

CSS【详解】层叠 z-index (含 z-index 的层叠规则,不同样式的层叠效果)

仅对已定位的元素( position:relative,position:absolute,position:fixed )有效,默认值为0,可以为负值。 z-index 的层叠规则 z-index 值从小到大层叠 兄弟元素 z-index 值相同时,后面的元素在…

【GameFramework框架】7-2、GameFramework框架是否“过度设计”?

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q764424567/article/details/1…

Leetcode(经典题)day1

删除有序数组中的重复项|| 80. 删除有序数组中的重复项 II - 力扣(LeetCode) 和之前的删除有序数组中的重复项|相似,这里是要求最多出现两次,所以多加一个变量来记录出现次数即可,整体上还是使用双指针,…

智能小车——底层配置

需要一点点思考底层的相关配置都需要完成怎么样的配置,并进一步添加相关的状态机和控制算法。 FreeRTOS迁移 可以直接CubeMX生成,也可以手动把FreeRTOS的源码拖到工程中,然后再稍微配置一下,这个之前学正点原子的FreeRTOS的时候…

python | setup.py里有什么?

setup.py里有什么? 文章目录 setup.py里有什么?C/C扩展总结gcc/g的编译参数:Windows Visual StudioCmakesetup.py C/C扩展模块 为什么需要分发打包?Distutils一个简单的例子通用的 Python 术语 使用 Setuptools 构建和分发软件包源…

华为OD机试题-字符串重新排列

题目描述 https://www.cnblogs.com/smile-programmer/p/17322920.html 字符串重新排列 给定一个字符串s,s包括以空格分隔的若干个单词,请对s进行如下处理后输出: 1、单词内部调整:对每个单词字母重新按字典序排序 2、单词间顺序调…

C#单独摘出日期的某天

如果你想要在 C# 中获取日期中的“天”的部分,你可以通过将日期转换为字符串,解析字符串,或者使用 DateTime 结构的 Day 属性来实现。 using System;class Program {static void Main(){// 获取当前日期DateTime today DateTime.Today;// 使…

Sqlmap中文使用手册 - Request模块参数使用

目录 1. Request模块的帮助文档2. 各个参数的介绍2.1 --methodMETHOD2.2 --dataDATA2.3 指定参数分割符2.4 -cookie相关2.5 -agent相关2.6 --hostHOST2.7 --refererREFERER2.8 --headersHEADERS2.9 --auth-type / --auth-cred2.10 --auth-fileAUTH2.11 --ignore-codeIG2.12 --p…

基于Flask+Apache+WSGI等模块配置Deep Learning应用功能网站(Ubuntu 22.04服务器)

首先预设你已经在本地搭建好了网站,只需要放到服务器上,然后配置Apache / Nginx等反向代理软件,即可用服务器ip地址/域名进行访问。 因为操作不规范/坑太多,而反反复复配了至少10遍。接下来的教程主要是总结规范流程,…

PYTHON自学笔记(二)查漏补缺

迭代 字符串处理 函数 参数 必须参数(必须有序) 调用函数与生命函数的参数个数必须一样,否则报错 关键字参数(无需有序) 在调用函数的时候可以直接传参,方便测试 def printIfo(name, **var):print(…

Stable Diffusion 入门案例教程

Stable Diffusion 是一种基于 diffusion-based 的生成模型,可以生成高质量的图像和视频。下面是一个 Stable Diffusion 入门案例教程,旨在帮助您快速入门 Stable Diffusion。 安装 Stable Diffusion 首先,您需要安装 Stable Diffusion。可以…

Android Gantt View 安卓实现项目甘特图

需要做一个项目管理工具,其中使用到了甘特图。发现全网甘特图解决方案比较少,于是自动动手丰衣足食。 前面我用 Python和 Node.js 前端都做过,这次仅仅是移植到 Android上面。 其实甘特图非常简单,开发也不难,如果我…

Python番外篇:万法归一,一切皆对象

目录 Python中的对象 一切皆对象 数字是对象 字符串是对象 内置类型也是对象 函数和类也是对象 总结 Python中的对象 对象是Python对数据的抽象,在Python程序中,所有的数据,都可以由对象或对象之间的关系表示。 从某种意义上说&#…

基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 摘 要 原理图 仿真图 元器件清单 代码 系统论文 参考文献 资源下载…