Redis数据删除
有时候,在删除了Redis中部分数据后,会发现Redis仍然占用了很多内存,这是因为当数据删除后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。所以,操作系统仍然会记录着给 Redis 分配了大量内存。
但是这样会导致一个问题,这些空间可能都是碎片化的,Redis无法拿来存取数据,还占用了大量的内存空间。
什么是内存碎片
一个较为简单的解释,就是虽然存在空间,但是这些空间却由于零散的分布在内存的各个地方,导致无法使用。
形成原因
1、内因:内存分配器的分配策略
内存分配器一般是按固定大小来分配内存,而不是完全按照应用程序申请的内存空间大小给程序分配。比如说现在Redis需要申请20字节的空间,但是分配器可能会分配32字节,此时如果还要写入10字节的数据,就不需要在此分配空间。但是这会导致2字节的空间很难被在此利用。
2、外因:键值对大小不一样和删改操作
Redis用来存储不同的键值对,这样就需要申请不同的空间,这一点与内因相同。而修改和删除操作,就会导致空间的扩容和释放,这就会导致新的内存分配,另一方面,删除的键值对就不再需要内存空间了,此时,就会把空间释放出来,形成空闲空间。
如何清理内存碎片
1、直接重启Redis。但是这样会带来一些问题:
- 如果Redis中的数据没有持久化,则会丢失数据。
- 即使持久化了,重启后需要加载RDB和AOF文件进行恢复,恢复时长取决于AOF或RDB文件的大小。而且如果Redis是单机的,此时就无法对外提供服务。
2、自动内存碎片清理。大致的原理是,通过对象移位的方式,把原本不连续的空间变为连续的。
碎片清理是有代价的,操作系统需要把多份数据拷贝到新位置,把原有空间释放出来,这会带来时间开销。
参考
《Redis核心技术实战》