首页 > 数据库 >redis学习-8(redis内存消耗、内存管理、内存优化)

redis学习-8(redis内存消耗、内存管理、内存优化)

时间:2024-07-15 16:09:57浏览次数:10  
标签:编码 删除 对象 redis 消耗 内存 字符串

redis内存消耗

内存使用统计

关注used_memory_rss(操作系统)和used_memory_rss(存储数据内存占用量)和其比值。
当比值>1,内存碎片
<1,存在swap,redis性能下降

内存消耗划分

rss = 自身内存+对象内存+缓冲内存+内存碎片
3kb = 800kb + ...
1.对象内存
存储键值对
2.缓冲内存
客户端缓冲(输入缓冲区max=1gb,输出可控)
复制积压缓冲区(一个主节点只有一个缓冲区,设置100mb,有效避免全量复制。在RBD中后续命令溢出则全量复制)
AOF缓冲区(小)
3.内存碎片
安全重启

子进程内存消耗

根据期间写入命令量决定、允许内核分配所有的物理内存(sysctl vm.overcommit_memory = 1 )、关闭THP(大页)

内存管理

设置内存上限(maxmemory)

用于缓存,当超过上限后使用LRU策略淘汰,防止内存超过服务器内存
预留一部分防止内存碎片

动态调整内存上限

在线迁移数据或通过复制切换服务器来扩容

内存回收策略

  • 删除到期的键
    惰性删除:读取时判断并删除超时的键(内存泄漏,一直没被读取释放)
    定时任务删除:每秒抽样选择快慢模式
  • 内存使用上限触发内存溢出控制策略
  1. noeviction:不删除,拒绝写入 OOM command not allowed when used memo
  2. volatile-lru: 删除设置了expire的键
  3. allkeys-lru:没设置expire的键也删除(纯缓存服务器)
  4. 随机删除
  5. 随机删除设置了过期的键
  6. 删除最佳要过期的键
    每次执行命令都会尝试回收内存

内存优化

值对象定义在redisObj结构体,包括对象类型、内部编码类型、LRU时钟、引用计数器、数据指针(scan+object idletime 查询长时间未被访问的键进行清理,高并发场景中字符串限制在39B内,减少分配次数)

缩减键值对象

key长度减少:缩写
value长度:序列化工具:protostuff、kryo(Snappy压缩json来实现通用数据格式来跨语言和调试)

共享对象池(整数)

0~9999整数对象池(当maxmemory且lru淘汰时,redis禁止共享对象池)

字符串优化

  • 采用SDS字符串,预分配内存(预分配一倍或者1mb)(减少字符串修改操作如append和setrange,直接修改字符串)
  • 字符串重构,将json数据转为hash结构,hmget和hmset支持部分读写(hash要采用ziplist,即连续内存结构,而不是hashtable)
  • 编码优化,redis不支持编码回退
    ziplist{
    [zlbytes字节长度]
    [zltail尾节点偏移量]
    [zllen压缩链表节点数量]
    [entry长度根据实际存储数据]=》{entry}[前一个节点所占空间,用于反向遍历][当前节点编码和长度][值][]
    [entry]
    ...
    [zlend列表结尾]}
    可以大幅降低内存消耗,但是增加了命令耗时(长度小于1000,元素大小小于512B)
  • intset编码
    set类型编码的一种,存储有序不重复的整数集(编码,元素个数,元素数组)

控制键的数量

根据键的规模分组映射(关键点:1、ziplist 2、长度控制在1k以内 3、存储小对象 4、预估键规模 5、调整参数)1048480=》hash:1948 field:480

标签:编码,删除,对象,redis,消耗,内存,字符串
From: https://www.cnblogs.com/bluebubbleyhbgsj/p/18303357

相关文章

  • redis学习-7
    redis阻塞问题发现阻塞生产环境需要异常监控,在连接函数捕获异常,打印ip和port,使用监控系统监控多个关键指标,如命令耗时、慢查询、持久化阻塞、拒绝连接、CPU内存网络磁盘使用过载等。内在原因redis数据结构使用不合理通过slowlog获取慢查询,改成低复杂度算法或将大对象拆分(......
  • Java面试八股之Redis哨兵机制
    Redis哨兵机制RedisSentinel(哨兵)模式是一种高可用解决方案,用于监控和自动故障转移Redis主从集群。以下是对哨兵模式详细过程的描述:1.初始化与配置部署哨兵节点:在不同的服务器上部署一个或多个RedisSentinel节点,它们作为独立进程运行,负责监控Redis主从集群的状态。配置......
  • Linux中使用Docker安装Redis容器以及布隆过滤器
    前言在项目中,一般普遍都会用到Redis,在准备学习Redis的相关的东西时,其中提到了缓存穿透、缓存击穿、缓存雪崩的问题。其中对于缓存穿透的一个解决方案中就有提到布隆过滤器,而布隆过滤器的也有许多提供方式(Guava、Redisson、RedisBloom),前面都是基于本地的,所以就选择了Redis官方......
  • 内存分析工具 Arthas
    一、Arthas简介    Arthas(阿尔萨斯)是Alibaba开源的Java诊断工具。支持Linux/Mac/Windows        1、下载地址: https://github.com/alibaba/arthas/releases                2、arthas-bin解压之后的目录结构二、启动Arthas监测应用程......
  • 使用Visual Studio诊断工具检查内存泄漏——订阅Events
    参考文章8WaysYoucanCauseMemoryLeaksin.NET订阅事件导致内存泄漏的原因订阅事件后,该对象将保留对你的类的引用。除非你使用不捕获类成员的匿名方法。防止Event内存泄漏的方法注销订阅事件。使用弱句柄(weak-handler)模式。如果可能,请使用匿名函数进行订阅,并且不......
  • 【Redis】主从配置和读写分离实现
    主从配置Master配置修改IP:192.168.0.100,端口:6378bind0.0.0.0port6378requirepass123456#关闭持久化appendonlynosave""#允许远程连接protected-modenoSlaveA配置修改IP:192.168.0.100,端口:6377bind0.0.0.0port6377requirepass123456#主密码masteraut......
  • SSRF结合Redis未授权的打法
    目录SSRF+Redis未授权案例怎么构造redis数据包?ReferenceSSRF不难理解,服务器端请求伪造(英语:Server-sideRequestForgery,简称SSRF)是攻击者滥用服务器功能来访问或操作无法被直接访问的信息的方式之一。服务器端请求伪造攻击将域中的不安全服务器作为代理使用,这与利用网页......
  • 1、多线程同步——CPU、core核、线程、内存
    CPU的运行原理控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里的)送到地址总线上去,然后CPU将这个地址里的指令读到指令寄存器进行译码。对于执行指令过程中所需要用到的数据,会将数据地址也送到地址总线,然后CPU把数据读到CPU的内部存储单元(就......
  • 动态内存管理 (malloc,calloc,relloc)
    1.为什么要有动态内存分配我们已经掌握的内存开辟⽅式有:intval=20;//在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10个字节的连续空间12但是上述的开辟空间的⽅式有两个特点:•空间开辟⼤⼩是固定的。•数组在申明的时候,必须指定数组的⻓度,数组空......
  • Factory method 'redissonClient' threw exception; nested exception is java.lang.I
    你遇到的这个错误是在Spring框架中常见的,它表示在创建Bean的过程中,有一个依赖关系未能得到满足。在这个特定的情况下,错误发生在创建voucherOrderController和voucherOrderServiceImpl这两个Bean时,其根本原因是无法实例化redissonClient,而redissonClient的创建失败是因为提供的Redi......