《Redis学习整理--第二期Redis对象中的引用指针》

redis对象结构体

可以看出每个对象中都有一个引用指针


场景:
在redis中 客户端调用get方法,获取一个较大内容的key时(I/O操作还没有执行完毕),另一个客户端调用del进行删除,如果此时没有对key进行任何保护,get操作就有可能导致内存段错误(因为del操作已经把key从内存删除,而get操作还在进行,这样get操作就会访问到非法内存地址)。


为了解决这个问题,Redis使用对象引用计数器。原理是:给对象添加一个引用计数器,每当有地方引用它时,计数器值就加 1,当引用失效时,计数器值就减 1 ,当引用计数器值为 0 时,Redis便把此对象从内存中删除。


引用计数器巧妙的解决了get命令和del命令的冲突问题,原理 如下图所述:


使用对象引用计数器后,当 get 操作还没完成时调用 del 命令也不会出现内存段错误。这是因为调用 get 命令后对象的引用计数器加 1 ,所以此时调用 del 命令也不会使其引用计数器变为 0(不会从内存中删除此 key)。

调用 del 命令后在什么时候才将这个 key 从内存中删除呢?答案是等待所有的 get 操作完成后(如果同时有多个客户端调用 get 命令,就要等待所有客户端完成后)。当一个 get 操作完成后,Redis 把此 key 的引用计数器减 1。而当所有的get操作都完成后,此 key 的引用计数器将变为 0,此时,Redis 就把这个 key 从内存中删除。

猜你喜欢

转载自blog.csdn.net/qq794096244/article/details/79557184