六个让你的redis使用得到优化的方法

Redis性能优化:让Redis速度飞起来的20个关键技巧 内存优化:合理使用数据结构,控制内存碎片持久化优化:平衡数据安全性和性能网络优化:减少网络往返,优化连接管理命令优化:避免慢命令,使用批量操作架构优化:读写分离,数据分片系统优化:操作系统调优,硬件选择应用优化:合理的缓存策略和客户端设计通过全面的性能优化,Redis可以轻松支持每秒数十万次的操作,为应用提供极速的数据访问体验。在下一篇文章中,我们将深入探讨Redis缓存设计的最佳实践,敬请期待! 阅读详情

1、 KEY-VALUE使用优化

  • Key的最佳实践

  • 固定格式:[业务名]:[数据名]:[id]

  • 足够简短:不超过44字节

  • 不包含特殊字符

  • Value的最佳实践:

  • 合理的拆分数据,拒绝BigKey

  • 选择合适数据结构

  • Hash结构的entry数量不要超过500(hash默认是五百,超过五百则不会使用ziplist优化)

  • 设置合理的超时时间

2、批处理优化

mset只能处理string类型的批处理, hmset只能处理hash类型的批处理

2.1、Pipeline

单机下:

redisTemplate.executePipelined 复制代码

集群模式下:

如MSET或Pipeline这样的批处理需要在一次请求中携带多条命令,而此时如果Redis是一个集群,那批处理命令的多个key必须落在一个插槽中,否则就会导致执行失败。大家可以想一想这样的要求其实很难实现,因为我们在批处理时,可能一次要插入很多条数据,这些数据很有可能不会都落在相同的节点上,这就会导致报错了

@Test void testMSetInCluster() { Map<String, String> map = new HashMap<>(3); map.put("name", "Rose"); map.put("age", "21"); map.put("sex", "Female"); stringRedisTemplate.opsForValue().multiSet(map); List<String> strings = stringRedisTemplate.opsForValue().multiGet(Arrays.asList("name", "age", "sex")); strings.forEach(System.out::println); } 复制代码

原理分析

在RedisAdvancedClusterAsyncCommandsImpl 类中

首先根据slotHash算出来一个partitioned的map,map中的key就是slot,而他的value就是对应的对应相同slot的key对应的数据

通过 RedisFuture mset = super.mset(op);进行异步的消息发送

@Override public RedisFuture<String> mset(Map<K, V> map) { Map<Integer, List<K>> partitioned = SlotHash.partition(codec, map.keySet()); if (partitioned.size() < 2) { return super.mset(map); } Map<Integer, RedisFuture<String>> executions = new HashMap<>(); for (Map.Entry<Integer, List<K>> entry : partitioned.entrySet()) { Map<K, V> op = new HashMap<>(); entry.getValue().forEach(k -> op.put(k, map.get(k))); RedisFuture<String> mset = super.mset(op); executions.put(entry.getKey(), mset); } return MultiNodeExecution.firstOfAsync(executions); } 复制代码

3、服务器端优化-持久化配置

Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议: 复制代码

  • 用来做缓存的Redis实例尽量不要开启持久化功能

  • 建议关闭RDB持久化功能,使用AOF持久化

  • 利用脚本定期在slave节点做RDB,实现数据备份

  • 设置合理的rewrite阈值,避免频繁的bgrewrite

  • 配置no-appendfsync-on-rewrite = yes,禁止在rewrite期间做aof,避免因AOF引起的阻塞

  • 部署有关建议:

  • Redis实例的物理机要预留足够内存,应对fork和rewrite

  • 单个Redis实例内存上限不要太大,例如4G或8G。可以加快fork的速度、减少主从同步、数据迁移压力

  • 不要与CPU密集型应用部署在一起

  • 不要与高硬盘负载应用一起部署。例如:数据库、消息队列

4.安全配置

安全可以说是服务器端一个非常重要的话题,如果安全出现了问题,那么一旦这个漏洞被一些坏人知道了之后,并且进行攻击,那么这就会给咱们的系统带来很多的损失,所以我们这节课就来解决这个问题。 复制代码

Redis会绑定在0.0.0.0:6379,这样将会将Redis服务暴露到公网上,而Redis如果没有做身份认证,会出现严重的安全漏洞. 漏洞重现方式:cloud.tencent.com/developer/a…

为什么会出现不需要密码也能够登录呢,主要是Redis考虑到每次登录都比较麻烦,所以Redis就有一种ssh免秘钥登录的方式,生成一对公钥和私钥,私钥放在本地,公钥放在redis端,当我们登录时服务器,再登录时候,他会去解析公钥和私钥,如果没有问题,则不需要利用redis的登录也能访问,这种做法本身也很常见,但是这里有一个前提,前提就是公钥必须保存在服务器上,才行,但是Redis的漏洞在于在不登录的情况下,也能把秘钥送到Linux服务器,从而产生漏洞

漏洞出现的核心的原因有以下几点:

  • Redis未设置密码

  • 利用了Redis的config set命令动态修改Redis配置

  • 使用了Root账号权限启动Redis

所以:如何解决呢?我们可以采用如下几种方案

为了避免这样的漏洞,这里给出一些建议:

  • Redis一定要设置密码

  • 禁止线上使用下面命令:keys、flushall、flushdb、config set等命令。可以利用rename-command禁用。

  • bind:限制网卡,禁止外网网卡访问

  • 开启防火墙

  • 不要使用Root账户启动Redis

  • 尽量不是有默认的端口

5、服务器端优化-Redis内存划分和内存配置

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

有关碎片问题分析

Redis底层分配并不是这个key有多大,他就会分配多大,而是有他自己的分配策略,比如8,16,20等等,假定当前key只需要10个字节,此时分配8肯定不够,那么他就会分配16个字节,多出来的6个字节就不能被使用,这就是我们常说的 碎片问题

进程内存问题分析:

这片内存,通常我们都可以忽略不计

缓冲区内存问题分析:

一般包括客户端缓冲区、AOF缓冲区、复制缓冲区等。客户端缓冲区又包括输入缓冲区和输出缓冲区两种。这部分内存占用波动较大,所以这片内存也是我们需要重点分析的内存问题。

内存占用

说明

数据内存

是Redis最主要的部分,存储Redis的键值信息。主要问题是BigKey问题、内存碎片问题

进程内存

Redis主进程本身运⾏肯定需要占⽤内存,如代码、常量池等等;这部分内存⼤约⼏兆,在⼤多数⽣产环境中与Redis数据占⽤的内存相⽐可以忽略。

缓冲区内存

一般包括客户端缓冲区、AOF缓冲区、复制缓冲区等。客户端缓冲区又包括输入缓冲区和输出缓冲区两种。这部分内存占用波动较大,不当使用BigKey,可能导致内存溢出。

于是我们就需要通过一些命令,可以查看到Redis目前的内存分配状态:

  • info memory:查看内存分配的情况

  • memory xxx:查看key的主要占用情况

接下来我们看到了这些配置,最关键的缓存区内存如何定位和解决呢?

内存缓冲区常见的有三种:

  • 复制缓冲区:主从复制的repl_backlog_buf,如果太小可能导致频繁的全量复制,影响性能。通过replbacklog-size来设置,默认1mb

  • AOF缓冲区:AOF刷盘之前的缓存区域,AOF执行rewrite的缓冲区。无法设置容量上限

  • 客户端缓冲区:分为输入缓冲区和输出缓冲区,输入缓冲区最大1G且不能设置。输出缓冲区可以设置

以上复制缓冲区和AOF缓冲区 不会有问题,最关键就是客户端缓冲区的问题

客户端缓冲区:指的就是我们发送命令时,客户端用来缓存命令的一个缓冲区,也就是我们向redis输入数据的输入端缓冲区和redis向客户端返回数据的响应缓存区,输入缓冲区最大1G且不能设置,所以这一块我们根本不用担心,如果超过了这个空间,redis会直接断开,因为本来此时此刻就代表着redis处理不过来了,我们需要担心的就是输出端缓冲区

我们在使用redis过程中,处理大量的big value,那么会导致我们的输出结果过多,如果输出缓存区过大,会导致redis直接断开,而默认配置的情况下, 其实他是没有大小的,这就比较坑了,内存可能一下子被占满,会直接导致咱们的redis断开,所以解决方案有两个

1、设置一个大小

2、增加我们带宽的大小,避免我们出现大量数据从而直接超过了redis的承受能力

6、服务器端集群优化-集群还是主从

集群虽然具备高可用特性,能实现自动故障恢复,但是如果使用不当,也会存在一些问题:

  • 集群完整性问题

  • 集群带宽问题

  • 数据倾斜问题

  • 客户端性能问题

  • 命令的集群兼容性问题

  • lua和事务问题

问题1、在Redis的默认配置中,如果发现任意一个插槽不可用,则整个集群都会停止对外服务:

大家可以设想一下,如果有几个slot不能使用,那么此时整个集群都不能用了,我们在开发中,其实最重要的是可用性,所以需要把如下配置修改成no,即有slot不能使用时,我们的redis集群还是可以对外提供服务

问题2、集群带宽问题

集群节点之间会不断的互相Ping来确定集群中其它节点的状态。每次Ping携带的信息至少包括:

  • 插槽信息

  • 集群状态信息

集群中节点越多,集群状态信息数据量也越大,10个节点的相关信息可能达到1kb,此时每次集群互通需要的带宽会非常高,这样会导致集群中大量的带宽都会被ping信息所占用,这是一个非常可怕的问题,所以我们需要去解决这样的问题

解决途径:

  • 避免大集群,集群节点数不要太多,最好少于1000,如果业务庞大,则建立多个集群。

  • 避免在单个物理机中运行太多Redis实例

  • 配置合适的cluster-node-timeout值

Redis面对数据量庞大处理方法 综上所述,当Redis面对数据量庞大时,需要从多个维度出发制定相应的应对策略。通过数据分片、内存优化、持久化策略、使用集群、硬件升级、合理设计数据结构以及监控系统性能等多方面的优化措施,可以显著提高Redis的处理能力和稳定性。同时,还需要结合实际应用场景和数据特性进行权衡和选择,以找到最适合的解决方案。在实际操作中,还需要不断关注Redis的性能指标和变化趋势,及时调整优化策略以适应不断变化的业务需求和数据规模。 阅读详情

相关推荐

黑马点评商户查询性能优化:从200ms到80ms的进阶之路

缓存粒度控制:不要过度缓存,选择真正热点的数据过期策略:采用差异化的过期时间避免缓存雪崩监控告警:建立完善的缓存监控体系,包括:Redis内存使用率缓存命中率键空间大小压测验证:所有优化方案必须通过JMeter压力测试验证。

jnimiijabc的博客 1081

10个Redis性能优化的方法,最后一个学会了涨工资!

一、Redis为什么变慢了1.Redis真的变慢了吗?对 Redis 进行基准性能测试例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下,可能延迟是 0.5ms 时就可以认为 Redis 变慢了。所以,你只有了解了你的 Redis 在生产环境服务器上的基准性能,才能进一步评估,当其延迟达到什么程度时,才认为 Redis 确...

独行侠梦的博客 6925

Redis实战篇《黑马点评》5 秒杀优化

如果充足,则在Redis中判断用户是否可以下单,如果set集合中没有该用户的下单数据,则可以下单,并将userId和优惠券存入到Redis中,并且返回0,整个过程需要保证是原子性的,所以我们要用Lua来操作,同时由于我们需要在Redis中查询优惠券信息,所以在我们新增秒杀优惠券的同时,需要将优惠券信息保存到Redis中。在这六个步骤中,有很多操作都是要去操作数据库的,而且还是一个线程串行执行,这样就会导致我们的程序执行很慢,所以我们需要异步程序执行,那么如何加速呢?但是这里还存在两个难点。

wyznan的博客 1072

Redis高级篇——Redis的优化

Redis的优化问题,键值对的设计、BigKey问题、批处理问题、服务端的优化如慢查询的优化和监控、集群存在的问题

雪月清的博客 3141

redis怎么分析性能瓶颈——redis性能瓶颈定位的6个步骤

​ 要分析 redis的性能瓶颈,首先应监控关键指标,包括 cpu 使用率、内存使用率、网络 i/o、命中率和慢查询日志。1. 监控关键指标是性能分析的第一步,通过 redis-cli info 或第三方工具如 prometheus + grafana 获取数据。2. 使用 redis-cli --latency 检测 redis 延迟,帮助识别服务器响应时间异常。3. 分析慢查询日志可揪出执行效率低的命令,通过 config set 开启日志并用 slowlog get 查看记录。

weixin_43749798的博客 649

Redis 高可用集群搭建与优化实践

Redis 作为一款高性能的键值存储系统,广泛应用于缓存、消息队列和会话管理等场景。随着业务规模的扩大,单机 Redis 的性能和可用性逐渐无法满足需求。Redis 集群通过槽位机制和 Gossip 协议,实现了高性能、高可用的分布式存储架构。相比哨兵模式,集群模式在扩展性和并发能力上具有显著优势。

2401_83358720的博客 1402

Redis进阶不得不了解的内存优化细节

声明:本文内容来自《Redis开发与运维》一书第八章。 Redis所有的数据都在内存中,而内存又是非常宝贵的资源。对于如何优化内存使用一直是Redis用户非常关注的问题。本文让我们深入到Redis细节中,学习内存优化的技巧。分为如下几个部分: 一. redisObject对象 二. 缩减键值对象 三. 共享对象池 四. 字符串优化 五. 编码优化 六. 控制key的数量 一. redisObj...

a52654的博客 229

案例分析篇06:数据库设计相关28个考点(17~22)(软考高级系统架构设计师冲刺知识点总结系列文章)

案例分析06篇:数据库设计相关28个考点(17~22)(软考高级系统架构设计师冲刺知识点总结系列文章);关系型数据库和文件系统对比;SQL语句设计影响查询效率的原则;反规范化设计;反范式技术;如何解决Redis缓存与MySQL数据同步问题;NoSQL数据库,MySQL优化。

随风浪仔的专栏 540

【黄啊码】MySQL入门—11、遇到数据库性能瓶颈,骨灰级程序员是这么建议优化的

MySQL优化,如何解决MySQL性能瓶颈

黄啊码 1250

基于CNN的表情识别(FER)pytorch实现

Report for FER Jian Tang Abstract 我们使用卷积神经网络(CNN)实现了baby的面部表情识别(FER)。 数据上,我们获取了开源FER数据集FER2013[1],besides我们使用爬虫获取了baby相关的人脸图片,进行了手工分类标注以形成一个全新的baby FER数据集。 模型上,我们首先复现了Luan[2]的工作,即参考Kuo[3]在CVPR 2018上的工作并实现一个轻量的CNN网络,在FER2013上进行训练并得到了XXXX%的平均分类准确率(avg a

qq_20241587的博客 3683

在unity urp项目中 通过图片创建材质(透明光晕)

unity中通过图片创造材质(urp管道)

m0_49721415的博客 1539

Redis性能突然下降?深度剖析性能瓶颈定位与优化全攻略

当Redis不再"飞快"作为当今最受欢迎的内存数据库,Redis以其卓越的性能著称——单机QPS轻松突破10万。然而,在实际生产环境中,我们经常会遇到这样的 困惑:你是否也遇到过这些让人抓狂的问题?✦ 明明是简单的GET操作,为什么偶尔会卡几百毫秒?✦ 删除一个Key竟然要等好几秒?✦ Redis运行得好好的,突然就开始频繁超时?✦ 某个时间点开始,所有操作都变得缓慢?如果你对Redis的底层机制不够了解,面对这些问题往往会束手无策。

u011377152的博客 547

利用Matlab实现矩形波导电磁场分布图的绘制

1.利用Matlab实现矩形波导电磁场分布图的绘制;2.学会使用 Matlab 进行数值计算,并绘出相应的图形;通过Matlab 计算并绘出任意时刻金属矩形波导的主模 TE10 模的电磁场分布图。波导尺寸、工作频率及时刻均由外部给定。(1)矩形波导中传输的主模为TE10模。设金属波导尺寸为a*b,TE10模的截止波长为2*a。其电磁场分量可推导表示如下:.......1-1上式中各参量如下:......1-2。

qq_26335381的博客 3058

提高后端性能的六个关键优化实践分享

回看这六个实践,没有一个是能一劳永逸的。缓存会过期、索引会碎片化、代码会腐烂、架构会过时。我曾经以为优化完所有接口就能高枕无忧,结果半年后业务量翻倍,又出现了新瓶颈。真正的后端性能优化是一种文化:每一次代码Review时都要问“这个请求能加缓存吗?这个循环能批量吗?这个调用能异步吗?”,每次上线都要有压测数据,每次故障都要有根因分析和改进措施。你永远无法优化一个你不知道其瓶颈的系统。

qq_35974860的博客 30

SAP VC 可配置物料超级BOM简介

在有些业务中比如:汽车、笔记本、电脑、电梯等产品中,其中组成产品的型号个框架是确认的 ,但是框架内部的BOM是可变的,在客户下销售订单的时候,选取对应的组件 ,让后通过MRP的计算优生产线对这样的销售订单提供生产。这个时候我们需要选择我们需要的内存和硬盘的型号,还记得我们前面创建的特征值对应的吗,A对应的8G、B对应16G、X对应1T硬盘、Y对应2T硬盘,这里我们填写对应的值,我们这里选择16G的内存和2T的硬盘,B和Y。3、当我们选择了可配置物料的生产模式时,基本上就选择了按单生产的生产模式了。

我小时候很黑的博客 1万+

模型实战(16)之StrongSort (OSNET)配合YOLOv5、v7、v8 实现多目标跟踪详解

StrongSort (OSNET)配合YOLOv5、v7、v8 实现多目标跟踪详解

yohnyang的博客 1770

NoSQL 之 Redis 配置与优化

Redis 是一款高性能的键值对存储数据库,合理的配置与优化是保证其稳定、高效运行的关键。以下从和六个方面进行详细说明。

zhangyahua1的博客 181

【置顶】TEE从入门到精通-[目录]

此专栏讲解包含不限于optee、商用TEE、常规的安全业务设计。但主要基于optee最新代码,深度讲解和剖析各项原理和机制...

baron-周贺贺-代码改变世界ctw 6426

揭秘Redis性能优化:5大技巧让你面试加分!

Redis性能优化的关键在于内存使用、高并发处理和持久化配置。常见的性能瓶颈包括内存溢出、锁竞争和网络延迟。通过合理的数据结构选择、分片架构设计以及高效的序列化方案,可以显著提升系统吞吐量和响应速度。本文将深入探讨这些问题,并提供实际场景下的优化策略与解决方案,帮助企业最大化Redis的性能表现。

蓝鲸鱼计算机软件开发工作室 853

history 历史命令记录功能如何防坏人(高级)

在 Linux 下面可以使用 history 命令查看用户的所有历史操作,同时 shell 命令操作记录默认保存在用户目录的 .bash_history 文件中。通过这个文件可以查询 shell 命令的执行历史,有助于运维人员进行系统审计和问题排查,同时在服务器遭受黑客攻击后,也可以查询黑客登录服务器的历史命令操作。但是黑客在入侵后,为了抹除痕迹,会删除 .bash_history 文件,这个就需...

墨痕诉清风的博客 1656

手把手教你学Simulink——电机电磁兼容与可靠性场景示例:基于Simulink的电机噪声抑制控制仿真

本文带你完成了电机噪声抑制控制的Simulink仿真,实现了:✅ 揭示了电磁噪声从电流到声音的传递机理✅ 搭建了含死区、固定载波等噪声源的高保真模型随机PWM(消除啸叫)谐振控制器(抑制5/7次嗡鸣)谐波注入(降低THD) ✅ 通过综合方案将噪声降低10 dB以上(感知响度减半!) ✅ 为产品静音品质提升提供可落地的控制方案。

MHD0815的博客 94

redis存储对象_redis内存优化总结

本文主要参考<>一书,主要分为以下六个部分:1.redisObject对象2.缩减键值对象3.共享对象池4.字符串优化5.编码优化6.控制key的数量一. redisObject对象Redis存储的所有值对象在内部定义为redisObject结构体,内部结构如下图所示。Redis存储的数据都使用redisObject来封装,包括string,hash,list,set,zset在内的所...

weixin_39519741的博客 313

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

07、Redis实战:优惠券秒杀、优化异步下单

秒杀业务的优化思路是什么?

u012011912的博客 1086

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Redis实战——秒杀业务优化

如果充足,则在Redis中判断用户是否可以下单,如果set集合中没有该用户的下单数据,则可以下单,并将userId和优惠券存入到Redis中,并且返回0,整个过程需要保证是原子性的,所以我们要用Lua来操作,同时由于我们需要在Redis中查询优惠券信息,所以在我们新增秒杀优惠券的同时,需要将优惠券信息保存到Redis中。修改下单的操作,我们在下单时,是通过Lua表达式去原子执行判断逻辑,如果判断结果不为0,返回错误信息,如果判断结果为0,则将下单的逻辑保存到队列中去,然后异步执行。

不愿意做鱼的小鲸鱼の博客 535

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

redis的内存优化【转】

Redis所有的数据都在内存中,而内存又是非常宝贵的资源。对于如何优化内存使用一直是Redis用户非常关注的问题。本文让我们深入到Redis细节中,学习内存优化的技巧。分为如下几个部分: 一.redisObject对象 二.缩减键值对象 三.共享对象池 四.字符串优化 五.编码优化 六.控制key的数量 一. redisObject对象 Redis存储的所有值对象在内部定...

weixin_30677073的博客 83

大数据量的处理思路

一、分字诀 1.用和不用的分开,即常用和不常用的分开 2.对数据库存放的数据: 分区、分库、分表 3.对文件存放的数据:拆文件 4.考虑分批处理 原则:尽量每次操作的数据基础减少 二、合理利用缓存 如对一些统计业务,通过定时任务提前统计好数据,放入缓存中 三、数据库优化 1.合理设计数据库结构 2.合理设计表索引 3.数据库集群 四、优化算法 1.优化操作数据的算法 2.优化sql 3.考虑使用临时表、中间表(如对一些计算结果啥的,提前统计好存入这些表) 五、

会飞的猪 1080
上一篇: 10000字详解带你Redis的五种数据类型
下一篇: 记录一次线上kafka故障及处理方式
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值