精华内容
下载资源
问答
  • Redis内存不够,报错。 三种解决思路 注:如修改了配置文件需重启redis 1. 增加redis内存,修改redis.conf(集群中为redis-env.sh),默认为1024MB,增加到合适的内存。 maxmemory 2gb 2. 修改redis...

    Redis内存不够,报错。

    三种解决思路

    注:如修改了配置文件需重启redis

    1. 增加redis内存,修改redis.conf(集群中为redis-env.sh),默认为1024MB,增加到合适的内存。

    maxmemory 2gb

     

     

    2. 修改redis存储策略

    默认的redis设置是非常保守的,即内存超限后就不在存储,可以把策略修改为LRU算法(最近最少使用算法)——新存储的信息会替换掉旧的信息,从而不会是内存越线,修改redis.conf。这个必须结合业务场景,如果没有自动加载数据到redis的缓存机制,会造成数据缺少。我觉得可以往这方面靠,能最大利用资源。

    maxmemory-policy volatile-lru

     

     

    3. 少往reids存数据

    是否有必要把这么多数据存入redis?

    转载于:https://www.cnblogs.com/1023linlin/p/9002293.html

    展开全文
  • 通过redis-cli登录redis,输入info命令查看redis内存使用情况。如图所示: 可见内存已经被使用的差不多了,内存使用峰值已经超过redis最大内存量,触发了内存回收策略,导致后续写入内存操作被拒绝了。造成“键...

    线上运行的系统出现键丢失的情况。通过redis-cli登录redis,输入info命令查看redis内存使用情况。如图所示:
    在这里插入图片描述
    可见内存已经被使用的差不多了,内存使用峰值已经超过redis最大内存量,触发了内存回收策略,导致后续写入内存操作被拒绝了。造成“键丢失”的现象。

    redis内存淘汰策略有6种:

    • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错
    • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
    • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
    • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key
    • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
    • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除
    • volatile-lfu(redis 4新增):从所有配置了过期时间的键中驱逐使用频率最少的键
    • allkeys-lfu(redis 4新增):从所有键中驱逐使用频率最少的键

    通过设置maxmemory-policy属性修改内存回收策略。

    账号密码登录redis命令行输入指令如下,不用重启redis更新相关配置项。

    config set maxmemory-policy allkeys-lru
    config rewrite
    
    展开全文
  • Redis内存优化

    千次阅读 2020-04-16 14:50:06
    1.设置内存上限 使用maxmemory参数限制...Redis所用内存达到maxmemory上限时会触发相应的溢出控制策略。具体策略受maxmemory-policy参数控制,Redis支持6种策略,如下所示: noeviction:默认策略,不会删除任何数据...

    1.设置内存上限

    使用maxmemory参数限制最大可用内存,当超出内存上限maxmemory时使用LRU等删除策略释放空间以及防止所用内存超过服务器物理内存。

    2.配置内存回收策略

    Redis所用内存达到maxmemory上限时会触发相应的溢出控制策略。具体策略受maxmemory-policy参数控制,Redis支持6种策略,如下所示:

    noeviction:默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息(error)OOM command not allowed when used memory,此 时Redis只响应读操作。

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

    allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性, 直到腾出足够空间为止。

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

    volatile-random:随机删除过期键,直到腾出足够空间为止。

    volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果 没有,回退到noeviction策略。

    3.键值对优化

    降低Redis内存使用最直接的方式就是缩减键(key)和值(value)的长度。在完整描述业务情况下,键值越短越好。值对象缩减比较复杂,应该在业务上精简业务对象,去掉不必要的属性避免存储无效数据。其次在序列化工具选择上,应该选择更高效的序列化工具来降低字节数组大小。

    4.共享对象池

    共享对象池是指Redis内部维护[0-9999] [0-9999]的整数对象 池,用于节约内存。

    但是共享对象池与maxmemory+LRU策略冲突,使用时需要注意。对于ziplist编码的值对象,即使内部数据为整数也无法使用共享对象池,因为ziplist使用压缩且内存连续的结构,对象共享判断成本过高。

    5.字符串优化

    字符串对象是Redis内部最常用的数据类型。所有的键都是字符串类 型,值对象数据除了整数之外都使用字符串存储。在使用过程中应当尽量优先使用整数,比字符串类型更节省空间。并且要优化字符串使用,避免预分配造成的内存浪费。使用ziplist压缩编码优化hash、list等结构,注重效率和空间的平衡,使用intset编码优化整数集合。使用ziplist编码的hash结构降低小对象链规模。

    6.编码优化

    Redis对外提供了多种数据类型,但是Redis内部对于不同类型的数据使用的内部编码不一样。内部编码不同将直接影响数据的内存占用和读写效率。

    7.控制键的数量

    当使用Redis存储大量数据时,通常会存在大量键,过多的键同样会消 耗大量内存。

    展开全文
  • 【redis】redis内存管理、淘汰机制、内存优化

    千次阅读 多人点赞 2020-08-25 12:44:21
    redis内存管理、淘汰机制、内存优化

    配置redis

    如果想要运行一个内存高效的 Redis 数据库,首先需要理解那些在 redis.conf 配置文件中所有内存相关的指令。redis.conf 文件为大多数指令提供了丰富的内联文档,使得一些复杂的内存优化选项易于理解、更改和测试。
    传送门:redis.conf翻译与配置内存管理部分

    大多数 Redis 配置指令可以在运行时通过 CONFIG SET 命令进行设置。

    最大内存限制

    Redis使用 maxmemory 参数限制最大可用内存,默认关闭。

    限制内存的目的主要 有:

    用于缓存场景,当超出内存上限 maxmemory 时使用 LRU 等删除策略释放空间。
    防止所用内存超过服务器物理内存。
    

    在这里插入图片描述

    maxmemory 限制的是Redis实际使用的内存量,也就是 used_memory统计项对应的内存。由于内存碎片率的存在,实际消耗的内存 可能会比maxmemory设置的更大,实际使用时要小心这部分内存溢出redis.conf翻译与配置(内存碎片部分)

    Redis默认无限使用服务器内存,为防止极端情况下导致系统内存耗 尽,建议所有的Redis进程都要配置maxmemory。 在保证物理内存可用的情况下,系统中所有Redis实例可以调整 maxmemory参数来达到自由伸缩内存的目的。

    查看redis内存相关信息:INFO memory

    在这里插入图片描述
    在这里插入图片描述

    当 memfragmentationratio > 1 时,说明有部分内存并没有用于数据存储,而是被内存碎片所消耗,如果该值很大,说明碎片率严重。当 memfragmentationratio < 1 时,这种情况一般出现在操作系统把 Redis 内存交换 (swap) 到硬盘导致,出现这种情况要格外关注,由于硬盘速度远远慢于内存,Redis 性能会变得很差,甚至僵死。

    当 Redis 内存超出可以获得内存时,操作系统会进行 swap,将旧的页写入硬盘。从硬盘读写大概比从内存读写要慢5个数量级。used_memory 指标可以帮助判断 Redis 是否有被swap的风险或者它已经被swap。

    建议要设置和内存一样大小的交换区,如果没有交换区,一旦 Redis 突然需要的内存大于当前操作系统可用内存时,Redis 会因为 out of memory 而被 Linix Kernel 的 OOM Killer 直接杀死。虽然当 Redis 的数据被换出 (swap out) 时,Redis的性能会变差,但是总比直接被杀死的好。:建议自:https://redis.io/topics/admin

    内存都去哪儿了?还没好好使用,就爆了

    在这里插入图片描述
    1.自身内存:redis自身运行所消耗的内存,一般很小。

    2.对象内存:这是redis消耗内存最大的一块,存储着用户所有的数据。

    3.缓冲内存:缓冲内存主要包括:客户端缓冲、复制积压缓冲区、AOF缓冲区。
    客户端缓冲:是指客户端连接redis之后,输入或者输出数据的缓冲区,其中输出缓冲可以通过配置参数参数client-output-buffer-limit控制。
    复制积压缓冲区:一个可重用的固定大小缓冲区用于实现部分复制功能,根据repl-backlog-size参数控制,默认1MB。对于复制积压缓冲区整个主节点只有一个,所有的从节点共享此缓冲区,因此可以设置较大的缓冲区空间,如100MB,这部分内存投入是有价值的,可以有效避免全量复制。
    AOF缓冲区:这部分空间用于在Redis重写期间保存最近的写入命令,AOF缓冲区空间消耗用户无法控制,消耗的内存取决于AOF重写时间和写入命令量,这部分空间占用通常很小。

    4.内存碎片:当然,这是所有内存分配器无法避免的通病,但是可以优化。
    如果对这方面有想法的话:走近STL – 空间配置器,STL背后的故事

    内存回收策略

    Redis 回收内存大致有两个机制:一是删除到达过期时间的键值对象;二是当内存达到 maxmemory 时触发内存移除控制策略,强制删除选择出来的键值对象。

    过期键值

    Redis如何淘汰过期的keys

    Redis keys过期有两种方式:被动和主动方式。
    当一些客户端尝试访问它时,key会被发现并主动的过期。

    当然,这样是不够的,因为有些过期的keys,永远不会访问他们。 无论如何,这些keys应该过期,所以定时随机测试设置keys的过期时间。所有这些过期的keys将会从密钥空间删除。
    具体就是Redis每秒10次做的事情:

    测试随机的20个keys进行相关过期检测。
    删除所有已经过期的keys。
    如果有多于25%的keys过期,重复步奏1.
    

    为了获得正确的行为而不牺牲一致性,当一个key过期,DEL将会随着AOF文字一起合成到所有附加的slaves。在master实例中,这种方法是集中的,并且不存在一致性错误的机会。

    然而,当slaves连接到master时,不会独立过期keys(会等到master执行DEL命令),他们任然会在数据集里面存在,所以当slave当选为master时淘汰keys会独立执行,然后成为master。

    内存移除控制策略

    8个解决方方案

    当maxmemory限制达到的时候Redis会使用的行为由 Redis的maxmemory-policy配置指令来进行配置。

    在redis.conf中提出了8个解决方法。

    volatile-lru ->退出使用近似的LRU,仅使用设置了过期值的键。
    allkeys-lru ->使用近似的LRU驱逐任何密钥。
    volatile-lfu ->使用近似的LFU逐出,仅使用具有过期集的键。
    allkeys-lfu ->使用近似的LFU驱逐任何密钥。
    volatile-random ->删除一个具有过期设置的随机键。
    allkeys-random ->删除一个随机键,任意键。
    volatile-ttl ->删除最近过期时间的密钥(较小的TTL)
    noeviction ->不驱逐任何东西,只是在写操作时返回一个错误。
    

    LRU表示最近最少使用
    LFU表示使用频率最低
    LRU、LFU和volatile-ttl都是使用近似随机算法实现的。

    注意:使用上述任何策略,当没有合适的键用于驱逐时,Redis会在写操作时返回一个错误。

    一般的经验规则:

    使用allkeys-lru策略:当你希望你的请求符合一个幂定律分布,也就是说,你希望部分的子集元素将比其它其它元素被访问的更多。如果你不确定选择什么,这是个很好的选择。.
    使用allkeys-random:如果你是循环访问,所有的键被连续的扫描,或者你希望请求分布正常(所有元素被访问的概率都差不多)。
    使用volatile-ttl:如果你想要通过创建缓存对象时设置TTL值,来决定哪些对象应该被过期。
    

    allkeys-lru 和 volatile-random策略对于当你想要单一的实例实现缓存及持久化一些键时很有用。不过一般运行两个实例是解决这个问题的更好方法。
    为了键设置过期时间也是需要消耗内存的,所以使用allkeys-lru这种策略更加高效。

    回收进程如何工作

    理解回收进程如何工作是非常重要的:

    一个客户端运行了新的命令,添加了新的数据。
    Redis检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。
    一个新的命令被执行,等等。
    所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。
    

    近似LRU算法

    Redis的LRU算法并非完整的实现。
    Redis为什么不使用真实的LRU实现是因为这需要太多的内存。

    内存优化

    使用32位的redis

    使用32位的redis,对于每一个key,将使用更少的内存,因为32位程序,指针占用的字节数更少。但是32的redis整个实例使用的内存将被限制在4G以下。
    使用make 32bit命令编译生成32位的redis。RDB和AOF文件是不区分32位和64位的(包括字节顺序),所以你可以使用64位的reidis恢复32位的RDB备份文件,相反亦然。

    位级别和字级别的操作

    Redis 2.2引入了位级别和字级别的操作: GETRANGE, SETRANGE, GETBIT 和 SETBIT.使用这些命令。

    对位操作不熟的话,可以看一下这两篇:
    位运算 - 初见
    位图 - 海量数据处理

    尽可能使用散列表

    小散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。


    先到这儿吧,也该去吃饭了。

    在这里插入图片描述

    展开全文
  • Redis内存分析

    千次阅读 2018-09-03 15:20:34
    比如估算Redis内存使用量,内存优化占用,阻塞问题处理。 一、Redis内存统计 Redis提供内存统计命令,在客户端通过 redis-cli 连接服务器后,通过 info 命令可以查看内存使用情况:info memory。 其中info...
  • Redis内存碎片率

    千次阅读 2018-11-22 09:31:30
    文章目录Redis内存碎片率内存碎片率内存碎片率高的原因解决方法 Redis内存碎片率 redis4支持内存碎片清理功能使用 内存碎片率 mem_fragmentation_ratio = used_memory_rss / used_memory used_memory :Redis使用其...
  • Redis内存管理和优化

    千人学习 2016-11-21 14:05:28
    Redis是一个高性能的开源NOSQL内存数据库。本次分享主要介绍Redis内存的管理机制,Redis内存使用情况分析定位,阿里云Redis相关优化,以及相关的佳实践。
  • 一文了解 Redis 内存监控和内存消耗

    千次阅读 2019-10-15 22:58:30
    Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多。所以,监控 Redis内存消耗并了解 Redis 内存模型对高效并长期稳定使用 Redis 至关重要。 内存使用统计 ...
  • 客户现场redis内存飙升,由于无法远程连接客户现场环境,进而分析redis的内存中占用较大的key,无法进行问题精确定位,所以需要一个组件或者方法来查看redis内存占用大的key的列表,进而定位问题 解决方案: 依赖...
  • 这两个问题,通过 Redis 内存回收机制能够得到完美的解答。 Redis 内存回收机制 Redis 在两种情况下会回收 key 占用的内存: 用户主动设置过期时间,时间到了,被回收 redis 中key达到了 redis 设置的 max_memory ....
  • Redis内存调优

    千次阅读 2020-06-14 21:00:42
    used_memory:8589737336 由 Redis 分配器分配的内存总量,包含了redis进程内部的开销和数据占用的内存,以字节(byte)为单位 used_memory_human:8.00G 以更直观的单位展示分配的内存总量 used_memory_rss:...
  • Redis内存管理

    千次阅读 2018-07-15 17:23:37
    Redis通过控制内存上限和回收策略实现内存管理,使用maxmemory参数限制最大可用内存,限制内存的主要目的是:用于缓存场景,当超出内存上限时使用LRU等删除策略释放空间;防止所用内存超过服务器的物理内存内存...
  • Redis-17Redis内存回收策略

    千次阅读 2018-09-28 23:21:12
    文章目录概述maxmemory-policy ...在 Redis 的配置文件中,当 Redis内存达到规定的最大值时,允许配置 6 种策略中的一种进行淘汰键值,并且将一些键值对进行回收。 maxmemory-policy 参数 # Set a memory usage...
  • Redis 内存优化方式

    千次阅读 2018-09-28 09:46:19
    Redis 内存优化是对数据类型做一些参数上的优化 内存优化方式与参数 关闭 Redis 的虚拟内存[VM]功能,即 redis.conf 中 vm-enabled = no 设置 redis.conf 中 maxmemory ,用于告知 Redis 当使用了多少物理内存后...
  • Redis内存淘汰机制

    千次阅读 2019-05-25 12:42:25
    Redis内存淘汰机制概述Redis清除过期Key的方式定期删除惰性删除Redis内存淘汰机制 概述 Redis是基于内存存储,常用于数据的缓存,所以Redis提供了对键的过期时间的设置,实现了几种淘汰机制便于适应各种场景。 设置...
  • Redis内存淘汰策略详解

    千次阅读 2020-08-10 17:43:36
    我们都知道Redis是一个基于k-v数据库,随着里面键值对的增加,redis内存的使用量也会上升,因此,我们需要对Redis的最大内存使用量进行限制。那么有了Redis的内存容量限制,那么就会有达到这个内存容量限制的时候,...
  • Redis内存设置

    千次阅读 2018-09-30 15:59:13
    Redis设置最大占用内存,打开redis配置文件,找到如下段落, 设置maxmemory参数,maxmemory是bytes字节类型,注意转换。 一般推荐Redis设置内存为最大物理内存的四分之三,如果不设置maxmemory或者设置为0,64位...
  • Redis内存使用优化与存储redis崩溃真让人头疼Linux下Redis内存优化Redis内存存储结构分析Redis常用数据类型Redis最为常用的数据类型主要有以下五种:String Hash List Set Sorted set 在具体描述这几种数据类型之前...
  • redis内存与运行内存的区别

    千次阅读 2018-06-11 11:52:39
    redis内存是内存型数据库,既支持将数据存储到内存(运行内存),也可以将数据进行持久化的本地存储。
  • Redis 内存管理 maxmemory设置内存上线

    千次阅读 2020-05-29 22:03:22
    Redis主要通过控制内存上限和回收策略实现内存管理 设置内存上限 Redis使用maxmemory参数限制最大可用内存。 限制内存的目的主要有: ·用于缓存场景, 当超出内存上限maxmemory时使用LRU等删除策略释放空间。 ...
  • 记一次因redis发生的一次线上事故 备注:我们使用的Redis是云厂商的Redis主备服务 ... 看到redis内存告警,业务操作Redis不断报错,第一印象就是业务量不断增长,使用redis场景越来越多,购买的redis内存不够了...
  • Redis内存回收策略

    千次阅读 2018-09-29 09:02:07
    如果使用Redis的时候,不合理使用内存,把什么东西都放在...Redis中提供了多种内存回收策略,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对 象,释放这些对象占用的空间,那么选择淘汰哪些...
  • Redis 内存淘汰机制

    2018-10-30 19:47:08
    Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除,从而产生读miss的情况,那么Redis为什么要有这种功能?这就是我们需要探究的设计初衷。Redis最常见的两种应用场景为缓存和持久存储,首先要...
  • redis 内存陷阱

    千次阅读 2016-12-01 13:43:47
    redis是个对内存依赖性很强的NoSql数据库,在内存足够的情况下性能出色 如果只有一台机子去部署redis,一定要特别小心。 比如我有台24G的服务器,理所当然我会将大量内存分配给redis。 比如20G的内存, 问题来了...
  • Redis 内存优化

    千次阅读 2015-04-05 22:58:48
    redis实际上的内存管理成本非常高,即占用了过多的内存,作者对这点也非常清楚,所以提供了一系列的参数和手段来控制和节省内存....
  • redis 内存分配器jemalloc

    千次阅读 2020-04-05 11:15:42
    Redis在编译时便会指定内存分配器;内存分配器可以是 libc 、jemalloc或者tcmalloc, 默认是jemalloc。 jemalloc作为Redis的默认内存分配器,在减小内存碎片方面做的相对比较好。jemalloc在64位系统中,将内存空间...
  • Redis 内存存储结构

    千次阅读 2012-04-20 14:52:45
    1 Redis 内存存储结构 本文是基于 Redis-v2.2.4 版本进行分析. 1.1 Redis 内存存储总体结构 Redis 是支持多key-value数据库(表)的,并用 RedisDb 来表示一个key-value数据库(表). redisServer 中有一个 ...
  • redis源码分析之redis内存管理

    千次阅读 2013-04-10 22:49:18
    redis是一个key-value的数据库,基于内存的,所以其内存管理是非常重要的,redis内存管理部分非常简单,主要在zmalloc.h和zmalloc.c两个文件中。 zmalloc.h定义了一系列的内存管理接口,zmalloc.c实现了这些...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 239,316
精华内容 95,726
关键字:

redis内存不够

redis 订阅