Redis 的内存

摘要:
AOF缓冲区是指Redis在重写期间保存最新的写命令内存片段。Redis使用maxmemory参数来限制最大可用内存。限制内存的主要目的是使用缓存场景。当超过内存时,maxmemory用于通过使用LRU和其他删除策略释放空间,以防止内存超过服务器的物理内存。Redis的内存限制可以通过使用configsetmaxmemory动态修改。Redis的内存恢复机制主要包括以下两个方面:删除已达到过期时间的密钥对象。

目录

Redis 的内存

内存消耗

内存使用统计

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

属性名属性说明
used_memoryredis分配器的内存总量
used_memory_human以可读的格式返回used_memory
used_memory_rss操作系统角度显示redis进程占用物理内存总量
used_memory_peak内存使用的最大值,表示used_memory的峰值
used_memory_peak_human以可读形式返回used_memory_peak
used_memory_lualua殷勤所消耗的内存大小
mem_fragmentation_ratioused_memory_rss/used_memory 比值,表示内存碎片率
mem_allocatorredis所使用的内存分配器,默认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结构适量降低键的数量

免责声明:文章转载自《Redis 的内存》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Jackson 框架,轻易转换JSON初始化mysql数据库提示缺少Data:dumper模块解决方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redis实现加锁的几种方法示例详解

1. redis加锁分类 redis能用的的加锁命令分表是INCR、SETNX、SET 2. 第一种锁命令INCR 这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作进行加一。然后其它用户在执行 INCR 操作进行加一时,如果返回的数大于 1 ,说明这个锁正在被使用当中。     1、 客户端A请求服务器...

redis启动出错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error

windows下安装Redis第一次启动报错: [2368] 21 Apr 02:57:05.611 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 解决方法:在命令行中运行 redis-cli.exe 127.0.0.1:6379>shutdown not...

2019 完美世界java面试笔试题 (含面试题解析)

本人3年开发经验、18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴、今日头条、完美世界等公司offer,岗位是Java后端开发,最终选择去了完美世界。 面试了很多家公司,感觉大部分公司考察的点都差不多,所以将自己的心得记下来,希望能给正在找或者准备找工作的朋友提供一点帮助。另外,目前在完美世界也做面试官的工作,身份从求职者变为面试官,看问题的很多角...

Java生鲜电商平台-redis缓存在商品中的设计与架构

Java生鲜电商平台-redis缓存在商品中的设计与架构 说明:Java开源生鲜电商平台-redis缓存在商品中的设计与架构。 1. 各种计数,商品维度计数和用户维度计数   说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等命令来计数。 商品维度计...

(转) 淘淘商城系列——Redis五种数据类型介绍

http://blog.csdn.net/yerenyuan_pku/article/details/72855562 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。下面我分别介绍之。 String(字符串) 字符串是Redis中最基本的数据类型,它能够存...

redis 常用

1. 查看所有key keys * 2.查找key-value 如下   3.Springboot 配置 spring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.database=0spring.redis.timeout=1800000spring.redis.lettuce.poo...