首页 > 数据库 >redis自学(47)服务端优化

redis自学(47)服务端优化

时间:2024-06-21 14:59:13浏览次数:14  
标签:redis 47 Redis 碎片 PURGE 内存 memory 缓冲区 服务端

持久化配置

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

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

② 建议关闭RDB持久化功能,使用AOF持久化(RDB的数据安全性一直是有问题的,两次RDB的时间比较长,又不能频繁的RDB,因为耗时久而且需要大量的磁盘IO,对性能的影响大)

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

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

⑤ 配置no-appendfsync-on-rewrite=yes,禁止在rewrite期间做aof,避免因AOF引起的阻塞(有可能导致数据的丢失)

 

 

部署有关建议:

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

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

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

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

 

慢查询

慢查询:在redis执行时耗时超过某个阈值的命令,称为慢查询。

 

 

慢查询的阈值可以通过配置指定:

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

慢查询会被放入慢查询日志中,日志的长度有上限,可以通过配置指定:

l slowlog-max-len:慢查询日志(本质是一个队列)的长度。默认是128,建议1000(及时发现及时处理)

 

 

查看慢查询日志列表:

l slowlog len:查询慢查询日志长度

l slowlog get[n]:读取n条慢查询日志

l slowlog reset:清空慢查询列表

 

 

命令及安全配置

Redis会绑定在0.0.0.0:6379,这样将会将Redis服务暴露到公网上,而Redis如果没有做身份认证,会出现严重的安全漏洞。

 

 

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

l Redis未设置密码

l 利用了redis的config set命令动态修改redis配置

l 使用了root账号权限启动redis

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

① Redis一定要设置密码,而且要复杂

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

 

 

③ Bind:限制网卡,禁止外网网卡访问

 

 

④ 开启防火墙

⑤ 不要使用root账户启动redis

⑥ 尽量不使用默认的端口

内存安全和配置

内存配置

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

 

 

数据内存的问题

Redis提供一些命令,可以查看到redis目前的内存分配状态:

l Info memory

l Memory xxx

 

 

used_memory: Redis分配的总内存字节数。

used_memory_human: 以人类可读格式显示的used_memory。

used_memory_rss: 从操作系统角度,Redis进程占用的物理内存总量。

used_memory_peak: Redis的内存消耗峰值。

used_memory_peak_human: 以人类可读格式显示的used_memory_peak。

used_memory_lua: Lua引擎所使用的内存大小。

mem_fragmentation_ratio: 内存碎片比率,计算方式为used_memory_rss / used_memory。

mem_allocator: Redis所使用的内存分配器,如jemalloc, tcmalloc或libc。

active_defrag_running: 表示主动碎片整理是否正在运行。

lazyfree_pending_objects: 等待异步释放的对象数量。

maxmemory: 配置的最大可用内存。

maxmemory_human: 以人类可读格式显示的maxmemory。

maxmemory_policy: 当达到maxmemory时的淘汰策略。

mem_not_counted_for_evict: 不计入淘汰的内存量。

number_of_cached_scripts: 缓存的Lua脚本数量。

 

 

 

 

memory doctor 是 Redis 提供的一个诊断工具,用于分析 Redis 实例的内存使用情况并提供建议。当你运行这个命令时,它会执行一系列检查并给出相应的报告。以下是 memory doctor 可能会检查的几个方面:

 

1. 内存碎片率:

检查内存碎片情况,如果碎片率过高,会建议使用 MEMORY PURGE 或开启自动内存碎片整理。

 

2. 内存使用量:

检查当前内存使用是否接近配置的最大内存限制(maxmemory)。

 

3. 内存分配器:

确认使用的内存分配器(如 jemalloc)是否为推荐的版本。

 

4. 大键检测:

检查是否存在占用大量内存的键,这些可能需要优化。

 

5. 键的总数:

检查键的总数是否异常多,可能暗示存在键泄漏问题。

 

6. 复制积压缓冲区:

检查复制积压缓冲区的大小是否合适。

 

7. 客户端输出缓冲区:

检查客户端输出缓冲区是否占用过多内存。

 

8. AOF 重写缓冲区:

如果启用了 AOF,检查 AOF 重写缓冲区的大小。

 

9. Lua 脚本缓存:

检查 Lua 脚本缓存的使用情况。

 

10. 持久化相关:

检查 RDB 或 AOF 持久化是否可能影响内存使用。

 

memory doctor 会根据这些检查结果给出相应的建议,例如:

- 调整配置参数

- 优化数据结构

- 清理不必要的数据

- 考虑使用内存优化技术

 

需要注意的是,memory doctor 只是提供诊断和建议,并不会自动执行任何更改。具体的优化操作还需要管理员根据实际情况来执行。定期运行 memory doctor 可以帮助你及时发现和解决潜在的内存问题,保持 Redis 的健康运行。

 

MEMORY PURGE 命令是 Redis 用于内存优化的一个重要工具。它主要用于清理内存碎片,但并不会直接删除任何数据。以下是 MEMORY PURGE 可以帮助清理的内存类型:

 

1. 内存碎片:

这是 MEMORY PURGE 的主要目标。它会尝试整理和重新分配内存,减少因频繁增删改操作而产生的内存碎片。

 

2. 未使用的内存块:

对于一些已被释放但尚未返回给操作系统的内存块,MEMORY PURGE 会尝试将它们归还。

 

3. 空闲内存页:

它会尝试将一些完全空闲的内存页面返回给操作系统。

 

4. 内部碎片:

对于一些数据结构内部的小型碎片,MEMORY PURGE 也会尝试进行优化。

 

需要注意的是:

 

- MEMORY PURGE 不会删除任何键值对或者数据。

- 它主要针对的是由于内存分配器(如 jemalloc)的工作方式导致的内存碎片。

- 这个操作可能会暂时增加 CPU 使用率。

- 在某些情况下,可能无法显著减少内存使用,特别是当碎片化不严重时。

- 这个命令在执行时可能会短暂阻塞 Redis,因此应谨慎在生产环境中使用。

 

使用 MEMORY PURGE 的最佳实践:

 

1. 在进行此操作之前,先使用 INFO memory 命令检查内存碎片率。

2. 在低峰期执行此命令。

3. 在大量删除操作后执行,可能会有更好的效果。

4. 如果频繁需要执行 MEMORY PURGE,考虑启用自动内存碎片整理功能。

 

总之,MEMORY PURGE 是一个有用的工具,可以帮助优化 Redis 的内存使用,但应该谨慎使用,并结合其他内存管理策略一起使用。

 

内存缓冲区配置

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

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

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

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

 

 

客户端信息:

 

 

 

标签:redis,47,Redis,碎片,PURGE,内存,memory,缓冲区,服务端
From: https://www.cnblogs.com/bulesea/p/18260527

相关文章

  • 并发业务使用redis分布式锁
    伴随着业务体量的上升,我们的qps与并发问题越来越明显,这时候就需要用到让代码一定情况下进行串行执行的工具:锁1.业务场景代码@Override@Transactional(rollbackFor=Exception.class)publicObjecttestBatch(Useruser){LambdaQueryWrapper<Us......
  • [转帖]Redis如何绑定CPU
    https://wenfh2020.com/2023/10/08/https/ 发布时间:2022-03-0809:44:39 阅读:649 作者:小新 栏目:开发技术开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止!点击查看>>这篇文章主要介绍了Redis如何绑定CPU,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这......
  • RedisDesktopManager的使用
    简介        RedisDesktopManager(RDM)是一个开源的图形化Redis数据库管理工具,是Redis可视化工具,支持Windows、macOS和Linux平台        它提供了一系列的功能,如连接管理、数据浏览、编辑和调试等,帮助用户管理和操作Redis数据库;适用于多种操作系......
  • 若依框架页面新增时,富文本加入图片保存时出现:JSON parse error: Unexpected character
    在使用若依框架的富文本框新增时,如果插入一个图片的时候会出现一个JSONparseerror:Unexpectedcharacter('/'(code47)):maybea(non-standard)comment?(notrecognizedasonesinceFeature'ALLOW_COMMENTS'notenabledforparser);nestedexceptioniscom.fas......
  • Redis集群搭建及原理详解
    1.Redis集群方案比较1.1哨兵模式在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断......
  • Redis 缓存应用、淘汰机制
    (四)Redis缓存应用、淘汰机制 合集-Redis(4) 1.(一)LinuxCentOSRedis安装05-082.(二)Redis数据类型与结构05-173.(三)Redis线程与IO模型06-054.(四)Redis缓存应用、淘汰机制06-20收起 1、缓存应用一个系统中不同层面数据访问速度不一样,以计算机为例,CPU、内存......
  • Redis漏洞原理
    Redis漏洞原理Redis简单介绍Redis是一款内存高速缓存的数据库,是一款K-V型数据库,它的所有键值都是用字典来存储的。其中它的value支持多种数据类型,包括String、List、Set、Zset和Hash。‍Redis未授权访问漏洞介绍利用条件Redis默认情况下绑定在127.0.0.1:6379,在没有进......
  • 【异常】nested exception is java.lang.NoClassDefFoundError: redis/clients/jedis/
    原因是版本冲突。以下我原本使用的版本信息<!--SpringBootRedis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.1.8.RELEASE</version><......
  • Redis的持久化机制和缓存预热
    Redis的持久化机制Redis是一个内存数据库,它的数据存放在内存中,但是如果关闭服务、机器关机或者断电的话,内存中的所有数据都会慢慢消失消失。内存数据消失的原因:因为内存中的数据是半导体晶体管开关,这种开关高度依赖电源,当电源断电后,无法再控制晶体管的开关状态。这时候电容发挥......
  • 【长文】带你搞明白Redis
    本文使用第一人称来介绍Redis一、概述Redis,英文全称是RemoteDictionaryServer(远程字典服务),是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度......