基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
面试官:熟悉Redis吗,项目中你是如何对Redis内存进行优化的
面试官:熟悉Redis吗,项目中你是如何对Redis内存进行优化的
阅读
2
2020-05-22
对于
redis
来说,什么是最重要的?
毋庸置疑,是内存。
一、reids 内存分析
redis
内存使用情况:
info
memory
示例:
可以看到,当前节点内存碎片率为
226893824
/
209522728
≈
1
.
08
,使用的内存分配器是
jemalloc
。
used
_
memory
_
rss
通常情况下是大于
used
_
memory
的,因为内存碎片的存在。
但是当操作系统把
redis
内存
swap
到硬盘时,
memory
_
fragmentation
_
ratio
会小于
1
。
redis
使用硬盘作为内存,因为硬盘的速度,
redis
性能会受到极大的影响。
二、redis 内存使用
之前的文章 关于
redis
,你需要了解的几点!中我们简单介绍过
redis
的内存使用分布:自身内存,键值对象占用、缓冲区内存占用及内存碎片占用。
https
://
www
.
cnblogs
.
com
/
niejunlei
/
p
/
12896605
.
html
redis
空进程自身消耗非常的少,可以忽略不计,优化内存可以不考虑此处的因素。
1、对象内存
对象内存,也即真实存储的数据所占用的内存。
redis
k
-
v
结构存储,对象占用可以简单的理解为
k
-
size
v
-
size
。
redis
的键统一都为字符串类型,值包含多种类型:
string
、
list
、
hash
、
set
、
zset
五种基本类型及基于
string
的
Bitmaps
和
HyperLogLog
类型等。
在实际的应用中,一定要做好
kv
的构建形式及内存使用预期,可以参考 关于
redis
,你需要了解的几点!中关于不同值类型不同形式下的内部存储实现介绍。
2、缓冲内存
缓冲内存包括三部分:客户端缓存、复制积压缓存及
AOF
缓冲区。
1)客户端缓存
接入
redis
服务器的
TCP
连接输入输出缓冲内存占用,
TCP
输入缓冲占用是不受控制的,最大允许空间为
1G
。输出缓冲占用可以通过
client
-
output
-
buffer
-
limit
参数配置。
redis
客户端主要分为从客户端、订阅客户端和普通客户端。
从客户端连接占用:也就是我们所说的
slave
,主节点会为每一个从节点建立一条连接用于命令复制,缓冲配置为:
client
-
output
-
buffer
-
limit
slave
256mb
64mb
60
。
主从之间的间络延迟及挂载的从节点数量是影响内存占用的主要因素。因此在涉及需要异地部署主从时要特别注意,另外,也要避免主节点上挂载过多的从节点(&
lt
;=
2
);
订阅客户端内存占用:发布订阅功能连接客户端使用单独的缓冲区,默认配置:
client
-
output
-
buffer
-
limit
pubsub
32mb
8mb
60
。
当消费慢于生产时会造成缓冲区积压,因此需要特别注意消费者角色配比及生产、消费速度的监控。
普通客户端内存占用:除了上述之外的其它客户端,如我们通常的应用连接,默认配置:
client
-
output
-
buffer
-
limit
normal
1000
。
可以看到,普通客户端没有配置缓冲区限制,通常一般的客户端内存消耗也可以忽略不计。
但是当
redis
服务器响应较慢时,容易造成大量的慢连接,主要表现为连接数的突增,如果不能及时处理,此时会严重影响
redis
服务节点的服务及恢复。
关于此,在实际应用中需要注意几点:
maxclients
最大连接数配置必不可少。
合理预估单次操作数据量(写或读)及网络时延
ttl
。
禁止线上大吞吐量命令操作,如
keys
等。
高并发应用情景下,
redis
内存使用需要有实时的监控预警机制,
2)复制积压缓冲区
v2
.
8
之后提供的一个可重用的固定大小缓冲区,用以实现向从节点的部分复制功能,避免全量复制。配置单数:
repl
-
backlog
-
size
,默认
1M
。单个主节点配置一个复制积压缓冲区。
3)AOF缓冲区
AOF
重写期间增量的写入命令保存,此部分缓存占用大小取决于
AOF
重写时间及增量。
3、内存碎片内存占用
关于
redis
,你需要了解的几点!简单介绍过
redis
的内存分配方式。(更多面试题,欢迎 )
三、redis 子进程内存消耗
子进程即
redis
执行持久化(
RDB
/
AOF
)时
fork
的子任务进程。
1、关于linux系统的写时复制机制:
父子进程会共享相同的物理内存页,父进程处理写请求时会对需要修改的页复制一份副本进行修改,子进程读取的内存则为
fork
时的父进程内存快照,因此,子进程的内存消耗由期间的写操作增量决定。
2、关于linux的透明大页机制THP(Transparent Huge Page):
THP
机制会降低
fork
子进程的速度;写时复制内存页由
4KB
增大至
2M
。高并发情境下,写时复制内存占用消耗影响会很大,因此需要选择性关闭。
3、关于linux配置:
一般需要配置
linux
系统
vm
.
overcommit
_
memory
=
1
,以允许系统可以分配所有的物理内存。防止
fork
任务因内存而失败。
四、redis 内存管理
redis
的内存管理主要分为两方面:内存上限控制及内存回收管理。
1、内存上限:maxmemory
目的:缓存应用内存回收机制触发 防止物理内存用尽(
redis
默认无限使用服务器内存) 服务节点内存隔离(单服务器上部署多个
redis
服务节点)
在进行内存分配及限制时要充分考虑内存碎片占用影响。
动态调整,扩展
redis
服务节点可用内存:
config
set
maxmemory
{}。
2、内存回收
回收时机:键过期、内存占用达到上限
1)过期键删除:
redis
键过期时间保存在内部的过期字典中,
redis
采用惰性删除机制 定时任务删除机制。
惰性删除:即读时删除,读取带有超时属性的键时,如果键已过期,则删除然后返回空值。这种方式存在问题是,触发时机,加入过期键长时间未被读取,那么它将会一直存在内存中,造成内存泄漏。
定时任务删除:
redis
内部维护了一个定时任务(默认每秒
10
次,可配置),通过自适应法进行删除。
删除逻辑如下:
需要说明的一点是,快慢模式执行的删除逻辑相同,这是超时时间不同。
2)内存溢出控制
当内存达到
maxmemory
,会触发内存回收策略,具体策略依据
maxmemory
-
policy
来执行。
noevication
:默认不回收,达到内存上限,则不再接受写操作,并返回错误。
volatile
-
lru
:根据
LRU
算法删除设置了过期时间的键,如果没有则不执行回收。
allkeys
-
lru
:根据
LRU
算法删除键,针对所有键。
allkeys
-
random
:随机删除键。
volatitle
-
random
:速记删除设置了过期时间的键。
volatilte
-
ttl
:根据键
ttl
,删除最近过期的键,同样如果没有设置过期的键,则不执行删除。
动态配置:
config
set
maxmemory
-
policy
{}
在设置了
maxmemory
情况下,每次的
redis
操作都会检查执行内存回收,因此对于线上环境,要确保所这只的
maxmemory
&
gt
;
used
_
memory
。
另外,可以通过动态配置
maxmemory
来主动触发内存回收。
来源:
cnblogs
.
com
/
niejunlei
/
p
/
12898225
.
html
最近五期
【
89
期】面试官
5
连问一个
TCP
连接可以发多少个
HTTP
请求?
【
90
期】面试官:说一下使用
Redis
实现大规模的帖子浏览计数的思路
【
91
期】面试官:
Spring
用了哪些设计模式?说三种即可
【
92
期】面试官:你说你精通
Java
并发,那给我讲讲
J
.
U
.
C
吧
【
93
期】经典面试题:
Redis
内存满了怎么办?
? ~
以上数据来源于网络,如有侵权,请联系删除。
上一篇:
经典面试题:Redis 内存满了怎么办?
下一篇:
面试官:你遇到 Redis 线上连接超时一般如何处理?
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目