删除数据和释放内存

删除数据和释放内存是两个不同的概念:

  • 删除数据是指从 Redis 中删除一个键值对: 通过过期策略删除过期数据, 手动异步删除数据, 都是在 Redis 层面将数据删除了, 后续不能再使用这些数据;
  • 释放内存是指将一块内存空间返回给操作系统, 以便其他进程使用.
    在 Redis 中, 当一个键被删除时, 它所占用的内存空间并不会立即返回给操作系统, 而是由 Redis 内部的内存管理器进行管理.
    Redis 中所有的删除数据, 都不是立即释放内存, 只是将键值对标记为已删除, 将键对象从 Redis 数据库中删除, 并将其添加到一个专门的删除队列中. 之后会异步地定期遍历这个队列, 将已删除的键值对所占用的内存空间返回给内存池. 当 Redis 需要分配内存时, 管理器会先尝试从这个内存池中获取内存, 这种方式可以避免频繁地向操作系统申请内存, 从而提高 Redis 的性能.

Redis 的内存回收是通过使用引用计数和惰性删除技术实现的. 具体来说, 当一个键被删除时, Redis 只是将该键对应的对象标记为已删除, 并将键对象从 Redis 数据库中删除. 如果该键对应的对象被其他键对象引用, Redis 会将该对象的引用计数redisObject中的refcout减一, 直到引用计数为零时才会真正地释放该对象占用的内存.

Redis 只需要删除不再被引用的键对象, 而不需要对整个 Redis 数据库进行上锁. 这种设计使得 Redis 能够以非常高效的方式处理内存回收, 并且不会影响 Redis 的性能.

redis-对象共享

redis-内存碎片