redis 内存回收机制
时间: 2023-06-13 22:08:47 浏览: 85
Redis 内存回收机制主要有两种:定时回收和惰性回收。
1. 定时回收
Redis 会周期性地检查已有的 key,判断是否过期并删除过期的 key。这个周期由参数 `hz` 决定,默认值是 10,即每秒检查 10 次。
2. 惰性回收
Redis 使用惰性回收机制来限制内存使用。当 Redis 内存使用达到上限时,就会启动惰性回收机制,通过删除一些过期的 key 或者使用 LRU 策略释放空间。Redis 会根据设置的 `maxmemory-policy` 参数选择对应的惰性回收策略,包括:
- noeviction:不删除任何数据,直接返回错误信息。
- allkeys-lru:从所有的 key 中选择最近最少使用的,进行删除。
- allkeys-random:从所有的 key 中随机选择进行删除。
- volatile-lru:从设置了过期时间的 key 中,选择最近最少使用的进行删除。
- volatile-random:从设置了过期时间的 key 中,随机选择进行删除。
- volatile-ttl:从设置了过期时间的 key 中,选择剩余时间最少的进行删除。
当 Redis 内存使用超过限制时,就会启用惰性回收机制。因此,需要根据实际情况设置合理的内存限制和惰性回收策略。
相关问题
redis 内存管理源码
Redis的内存管理主要涉及以下几个模块:
1. 内存分配器:Redis使用了自己实现的内存分配器,其实现在 `src/memalloc.c` 文件中。
2. 内存回收器:Redis使用了两种内存回收机制,分别是惰性删除和定期删除。惰性删除是指当 Redis 对某个键进行操作时,如果发现该键已经过期,就将其删除;而定期删除是指 Redis 会周期性地从过期键中随机抽取一部分进行删除。其实现在 `src/expire.c` 文件中。
3. 内存压缩器:Redis的内存压缩器是一种将 Redis 内存中的数据进行整理以释放内存碎片的机制。其实现在 `src/redis.c` 文件中。
以下是 Redis 内存分配器的源码实现示例:
```c
/* 内存分配器 */
void *zmalloc(size_t size) {
void *ptr = malloc(size);
if (!ptr) zmalloc_oom_handler(size);
return ptr;
}
void *zcalloc(size_t size) {
void *ptr = calloc(1, size);
if (!ptr) zmalloc_oom_handler(size);
return ptr;
}
void *zrealloc(void *ptr, size_t size) {
void *newptr;
if (ptr == NULL) return zmalloc(size);
if (size == 0) {
zfree(ptr);
return NULL;
}
newptr = realloc(ptr,size);
if (!newptr) zmalloc_oom_handler(size);
return newptr;
}
void zfree(void *ptr) {
if (ptr == NULL) return;
free(ptr);
}
/* 内存分配失败处理函数 */
void zmalloc_oom_handler(size_t size) {
oom("zmalloc: unable to allocate %zu bytes", size);
}
```
redis的内存优化
Redis的内存优化主要有以下几个方面:
1. 使用压缩列表代替列表和哈希表:在元素数量较少的情况下,使用压缩列表可以减少内存占用。
2. 使用整数集合代替集合:整数集合只存储整数类型的数据,可以减少内存占用。
3. 使用 ziplist 代替列表和哈希表:ziplist 是一种紧凑的数据结构,可以在元素数量较少的情况下减少内存占用。
4. 使用位图代替布隆过滤器:位图是一种紧凑的数据结构,可以在一定程度上代替布隆过滤器,减少内存占用。
5. 使用 Redis 的 LRU 算法进行内存回收:Redis 的 LRU 算法可以自动回收长时间未使用的键值对,减少内存占用。
6. 使用 Redis 的过期键机制:Redis 的过期键机制可以自动删除过期的键值对,减少内存占用。
7. 合理设置 Redis 的最大内存限制:合理设置 Redis 的最大内存限制可以避免 Redis 占用过多内存导致系统崩溃。