百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis内存管理:配置与版本事项(redis内存大小配置)

mhr18 2024-11-02 11:56 21 浏览 0 评论


这一节我们先简单聊一下redis配置与版本注意事项,涉及到配置,键的过期、32位redis和64位的区别,后续我们再来了解Redis LRU键的驱逐策略以及具体的优化策略。

1、配置redis


如果要运行一个高效的redis,我们必须要理解redis.conf文件中所有的内存相关指令,当然redis.conf文件提供了丰富内联文档使我们可以更好的理解、更改和测试相关配置项,本节我们先简单回顾用来配置redis的内存相关的指令,这些都可以在redis.conf文件中进行设置,在运行时我们可以通过CONFIG SET指令来设置。

  • rdbchecksum:默认值为Yes,将一个65位的冗余检验码(CRC64)放在RDB快照文件的尾末(RDB是redis持久化文件的一种,请参考面试官问:Redis数据丢失咋办?如何持久化它?),以此来发防止文件损坏,当redis开启子进程将数据持久化到RDB快照文件时,而我们需要注意的是对快照文件进行CRC64校验会增加10%的内存使用。
  • activerehashing:如果设置为yes,那么redis会在每隔100毫秒会重新哈希,重新哈希会是释放已经删除的键所占用的内存空间,如果对redis服务器没有指定硬性响应时间,建议设置为no,从而及时释放内存,说白设置为no可以提高响应速率,但内存占用较大,设置为yes后及时释放了内存空间,但遇到高并发量的客户端时可能降低了响应时间。
  • slave-of:主从复制可以提高可伸缩性,如果你的redis运行在集群环境中我们可以通过slave-of指令将redis切换到从模式,这是该从实例可以从另一个被指定为主实例的redis中复制数据,主从模式下提升redis的冗余度是在内存、硬件和网络IO之间做出的权衡。

2、键过期

保证redis数据库不会内存溢出简单有可靠的方法是为键设置过期时间,有了过期时间键会自动被驱逐,为你应用程序设计一套高效的过期策略可以使你的内存需求更高效可控,我们需要注意的是一旦在键上调用EXPIRE命令来设置过期时间,该超时只能通过删除或替换键的方式清除,任何改变值的操作都不能清除该设置的超时:

redis>SET  myname  aa #设置一个key为myname的键
ok
redis>EXPIRE  myname 300 #过期时间设为300秒
(integer) 1
redis>TTL myname #检测一下过期时间
(integer) 287
redis>APPEND myname pp #使用append命令追加值
(integer) 4
redis>GET myname #查看新值
"aapp"
redis>TTL myname  #再次检测一下过期时间
"259"

可以看到值被修改后超时依然存在,如果需要清除这个超时设置可以在这个键上调用setgetset命令,ttl返回-1表示没有设置超时时间的默认值:

redis> TTL myname #检测过期时间
(integer) 200
redis> SET myname cc #set命令
ok
redis> TTL myname  #再次检测过期时间 值为-1
(integer) -1
redis>persist myname  #也可以使用persist命令来清除键的过期时间:
(integer)  1
redis>persist myname  #也可以使用persist命令来清除键的过期时间:
(integer)  1

需要注意的是如果对一个键设了过期时间,但此时数据库进程被关闭了,在redis重启之后会自动驱逐该键值。

3、32位的redis

对于小于3GB数据集情况下,在32位redis实例中要比64为版本小、这里我们来看两个redis实例:redisIns32,redisIns64,然后在python命令行创建测试函数,分别对每个实例设置10000个键值对:

>>> def myrRedisTest():
  for i  in range(10000):
    key = "uuid:{}".format(i)
    value=uuid.uuid4()
    redisIns32.set(key,value)
    redisIns64.set(key,value)
>>>def myrRedisTest()

再来看下redis中使用INFO memory查看内存使用情况:

#32位redis实例输出
redis>INFO memory 
...
used_memory_human:11.87M #redis分配的内存大小
used_peak_human:11.87M #redis使用峰值内存
...

#64位redis实例输出
redis>INFO memory 
...
used_memory_human:14.18M #redis分配的内存大小
used_peak_human:14.18M #redis使用峰值内存
...

我们看到了相同的数据32位实例和64位实例的内部占用差异,下面我们列举一百万个整数、浮点数、字符串、哈希结构以及列表使用的内存对比

整数、浮点数、字符串的测试对比:

  • 图中显示如果使用整数,64位redis多使用了36%的内存,只要redis总使用内存不超过4GB,那32位版本的redis节省的内存也是很可观了。
  • 对于大量使用集合字符串的应用来说,显然64位版本的redis多出的内存不太明显,仅仅多了22%,并且64位版本的redis对字符串有大量的额外空间和编码优化,所以推荐使用64位版本。

哈希结构对比:

对于哈希结构来说,无论存储什么类型,32位和64位之间差异都是基本定在了19-19.56之间。

列表结构对比

可以看到在32位限制之下,列表非常适合存储整数和浮点数,字符串在32位和64位之间的内存使用率差异最小。

32位版本redis的注意事项

  • 由于32位版本的redis并未在用户群中广发部署和测试,较于64位版本来说可能有未发现的bug。
  • 诸如BITOP和BITCOUNT的位操作、字符串都在64位版本上做了优化。
  • 如果redis配置中参数maxmemory值设置的过于接近4GB,那么redis在通信、复制、IO缓存都有可能阻塞甚至崩溃。

个人理解有所纰漏,还请老铁们多多指教,下一节我们来讲解【Redis LRU键的驱逐策略】后续持续更新!

相关推荐

B站收藏视频失效?mybili 收藏夹备份神器完整部署指南

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...

中间件推荐初始化配置

Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...

Redis中缓存穿透问题与解决方法

缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...

后端开发必看!Redis 哨兵机制如何保障系统高可用?

你是否曾在项目中遇到过Redis主服务器突然宕机,导致整个业务系统出现数据读取异常、响应延迟甚至服务中断的情况?面对这样的突发状况,作为互联网大厂的后端开发人员,如何快速恢复服务、保障系统的高可用...

Redis合集-大Key处理建议

以下是Redis大Key问题的全流程解决方案,涵盖检测、处理、优化及预防策略,结合代码示例和最佳实践:一、大Key的定义与风险1.大Key判定标准数据类型大Key阈值风险场景S...

深入解析跳跃表:Redis里的"老六"数据结构,专治各种不服

大家好,我是你们的码农段子手,今天要给大家讲一个Redis世界里最会"跳科目三"的数据结构——跳跃表(SkipList)。这货表面上是个青铜,实际上是个王者,连红黑树见了都要喊声大哥。...

Redis 中 AOF 持久化技术原理全解析,看完你就懂了!

你在使用Redis的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis的AOF持久化技术就是...

Redis合集-必备的几款运维工具

Redis在应用Redis时,经常会面临的运维工作,包括Redis的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,从这三个方面,介绍一些工具。先来学习下监控Redis实时...

别再纠结线程池大小 + 线程数量了,没有固定公式的!

我们在百度上能很轻易地搜索到以下线程池设置大小的理论:在一台服务器上我们按照以下设置CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2你不会真的按照这个理论来设置线程池的...

网络编程—IO多路复用详解

假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及...

5分钟学会C/C++多线程编程进程和线程

前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...

尽情阅读,技术进阶,详解mmap的原理

1.一句话概括mmapmmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。这样,进程不仅能像访问内存一样读写文件,多个进程...

C++11多线程知识点总结

一、多线程的基本概念1、进程与线程的区别和联系进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程;线程:是运行中的实际的任务执行者。可以说,进程中包含了多...

微服务高可用的2个关键技巧,你一定用得上

概述上一篇文章讲了一个朋友公司使用SpringCloud架构遇到问题的一个真实案例,虽然不是什么大的技术问题,但如果对一些东西理解的不深刻,还真会犯一些错误。这篇文章我们来聊聊在微服务架构中,到底如...

Java线程间如何共享与传递数据

1、背景在日常SpringBoot应用或者Java应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...

取消回复欢迎 发表评论: