Redis 的内存

目录

  • Redis 的内存

    • 内存消耗
    • 内存管理
    • 内存优化

Redis 的内存

内存消耗

内存使用统计

使用info memory 命令查看内存相关指标:

属性名 属性说明
used_memory redis分配器的内存总量
used_memory_human 以可读的格式返回used_memory
used_memory_rss 操作系统角度显示redis进程占用物理内存总量
used_memory_peak 内存使用的最大值,表示used_memory的峰值
used_memory_peak_human 以可读形式返回used_memory_peak
used_memory_lua lua殷勤所消耗的内存大小
mem_fragmentation_ratio used_memory_rss/used_memory 比值,表示内存碎片率
mem_allocator redis所使用的内存分配器,默认jemalloc

内存消耗划分

redis进程内消耗主要包括:自身内存+对象内存+缓冲内存+内存碎片

  1. 对象内存:redis内存中占用最大的一块,储存着所有用户的数据,redis所有数据都采用key-value数据类型,所以对象内存消耗可以理解为 sizeof(keys)+sizeof(values)
  2. 缓冲区内存:缓冲区内存主要包括客户端缓冲、复制挤压缓冲区、AOF缓冲区。 客户端缓冲区是指所有接入到redis服务器TCP链接的输入输出缓冲。 复制挤压缓冲区是指redis在2.8版本后提供了一个可重用的固定大小缓冲区是用于实现部分复制的功能。AOF缓冲区指的是redis在重写期间保存最近的写入命令
  3. 内存碎片。频繁做更新操作、大量过期键删除、数据对齐、安全重启会出现高内存碎片问题

子进程内存消耗

子进程内存消耗主要是指执行AOF/RDB重写时Redis创建的子进程内存消耗。Redis执行fork操作产生的子进程内存

内存管理

设置内存上限

Redis使用maxmemory参数限制最大可用内存,限制内存的目的主要有:

  1. 使用缓存场景。当超出内存上线maxmemory是使用LRU等删除策略释放空间
  2. 防止内存超过服务器物理内存

动态调整内存上限

Redis的内存上限可以用过config set maxmemory进行动态修改

内存回收策略

Redis的内存回收机制主要体现在以下两个方面 :删除到达过期时间的键对象。内存到达上限时触发内存溢出控制策略

  1. 删除过期键。 redis所有键都可以设置过期属性,redis采用惰性删除和定时任务删除

    1. 惰性删除:惰性删除用于当客户端读取带有超时属性的键时,如果已经超过过期时间,会执行喊出操作并返回空。
    2. 定时任务删除:redis 内部维护一个定时任务,默认每秒运行10次,采用自适应算法根据键的过期比例采用快慢两种速率模式删除过期键
  2. 内存溢出控制策略,当Redis到达maxmemory上限是触发相应的溢出控制策略

    1)noeviction:默认策略,不会删除任何数据,拒绝所有写入操作,并返回客户端错误信息,此时只相应读操作

    2)volatile-lru:根据LRU算法删除设置了超时属性的键,直到腾出足够空间为止,如果没有可删除对象,退回到1)

    3)allkeys-lru:根据LRU算法删除键,不管有没有过期属性,直到腾出足够空间

    4)allkeys-random:随即删除所有键,直到腾出足够空间为止

    5)volatile-random:随机删除过期键,直到腾出空间

    6)volatile-ttl:根据键值对象ttl属性,删除最近将要过期数据,如果没有回退1)

内存优化

  1. 缩减键值对象:降低key和value值的长度
  2. 共享对象池:redis在内部维护了一个0~9999 的整数对象池可以降低内存使用
  3. 字符串优化:redis内部字符串(SDS)存在预分配机制,日常开发小心预分配带来的内存浪费
  4. 编码优化:
  5. 控制键的数量:hash结构适量降低键的数量

原文地址:https://www.cnblogs.com/DyLoder/p/11216006.html

时间: 2024-08-02 06:11:31

Redis 的内存的相关文章

深入了解一下Redis的内存模型!

跳跃表是一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的.除了跳跃表,实现有序数据结构的另一种典型实现是平衡树:大多数情况下,跳跃表的效率可以和平衡树媲美,且跳跃表实现比平衡树简单很多,因此redis中选用跳跃表代替平衡树.跳跃表支持平均O(logN).最坏O(N)的复杂点进行节点查找,并支持顺序操作.Redis的跳跃表实现由zskiplist和zskiplistNode两个结构组成:前者用于保存跳跃表信息(如头结点.尾节点.长度等),后者用于表示跳跃表节

Redis系列--内存淘汰机制(含单机版内存优化建议)

https://blog.csdn.net/Jack__Frost/article/details/72478400?locationNum=13&fps=1 每台redis的服务器的内存都是有限的,而且也不是所有的内存都用来存储信息.而且redis的实现并没有在内存这块做太多的优化,所以实现者为了防止内存过于饱和,采取了一些措施来管控内存. 文章结构:(1)内存策略:(2)内存释放机制原理:(3)项目中如何合理应用淘汰策略:(4)单机版Redis内存优化注意点. 一.内存策略:先来吃份官方文档

Redis实战 内存淘汰机制

http://blog.720ui.com/2016/redis_action_02_maxmemory_policy/#volatile-lru 文章目录 1. 如何配置 2. 动态改配置命令 2.1. 设置最大内存 2.2. 设置淘汰策略 3. 内存淘汰策略 3.1. volatile-lru 3.2. volatile-ttl 3.3. volatile-random 3.4. allkeys-lru 3.5. allkeys-random 3.6. no-enviction 4. 如何选

Redis额内存回收策略和内存上限

内存上限Redis可以通过 maxmemory 参数来限制最大可用内存,主要为了避免Redis内存超过操作系统内存,从而导致服务器响应变慢甚至死机的情况. maxmemory 参数限制的是Redis的对象内存大小,也就是 used_memory 对应的内存大小.由于内存碎片的存在,所以Redis服务器实际占用的内存是要超过 maxmemory 的. 所以我们在设置Redis内存上限的时候要预留一部分内存出来,比如说一台32GB内存的机器,可以启动 3 台8GB内存的Redis,预留8GB给机器其

Redis的内存淘汰

Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小. 1.通过配置文件配置 通过在Redis安装目录下面的redis.conf配置文件中添加以下配置设置内存大小 //设置Redis最大占用内存大小为100Mmaxmemory 100mb redis的配置文件不一定使用的是安装目录下面的redis.conf文件,启动redis服务的时候是可以传一个参数指定redis的配置文件

Redis 系列(04-2)Redis原理 - 内存回收

目录 Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 1. 过期策略 1.1 定时过期(主动淘汰) 1.2 惰性过期(被动淘汰) 1.3 定期过期 2. 淘汰策略 2.1 最大内存设置 2.2 淘汰策略 2.4 LFU Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 相关文档推荐: Redis - LRU Reids 所有的数据都是存储在内存中的,在某些情况下需要对占用的内存空间进行回收.内存回收主要分为两类,一类是 key 过期,

面试官:Redis 数据库内存数据满了,会宕机吗?有内存回收?

Redis 数据库内存数据满了,会宕机吗?答案是:不会让他出现存满的情况,在使用Redis的时候我们要配置Redis能使用的最大的内存大小,存到一定容量的时候还有Redis的内存淘汰策略呢,还有LRU算法进行淘汰,等等...接下来就跟着作者一起探讨,Redis的内存淘汰策略. Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小. 1.通过配置文件配置 通过在Redis安装目

一个异步访问redis的内存问题

| 分类 redis? | 遇到一个redis实例突然内存飙高的案例, 具体症状如下: 客户端使用异步访问模式 单个请求的回包很大,hgetall一个8M的key 由于访问量比较大,已经登录不上redis了, 看不到具体在做什么做操, 因此使用perf来看下调用栈, 此处且按下不表. 为何内存会飙高呢,我们线下重现一下: import redis import time r=redis.Redis("127.0.0.1", 9988) pipe = r.pipeline() key=&

redis的内存优化【转】

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