有时候redis键不会被删除

gt0wga4j  于 2023-04-19  发布在  Redis
关注(0)|答案(2)|浏览(151)

我已经实现了在Redis中存储从数据库(列表)中选择的结果,以加快网站上的数据加载。当CMS用户执行任何操作(创建,删除或编辑文章)时,Redis中的键将被删除并从数据库加载新数据。
但有时会发生一两个用户在对文章进行操作后没有放下密钥,旧数据仍保留在redis中的情况。互联网可用,没有任何东西被关闭。为什么会发生这种情况-是否有任何我需要知道的典型原因?
我需要封锁数据库,这样就不会有多个连接了吗?但是redis似乎是单线程的。我做错了什么?按键的功能很简单:

function articlesRedisDrop($prefix)
{
    $keys = $redis->keys($prefix."*");
    
    if(count($keys) > 0)
    {
        foreach($keys as $key)
        {
            $redis->del($key);
        }
    }
}
b4wnujal

b4wnujal1#

$redis->keys($prefix."*")之后,在$redis->del($key)之前,另一个连接向redis添加了刷新数据。
您可以尝试将get和del操作组合到单个lua脚本中。

local keys = redis.call("keys",string.format("%s.*",KEYS[1]))
for _, key in pairs(keys) do
  redis.call("del", key)
end

然后使用eval命令和prefix参数运行脚本。如果您遇到keys命令的性能问题,您可以尝试scan或将所有prefix密钥存储到一个集合中,然后获取并删除所有密钥。

tjvv9vkg

tjvv9vkg2#

我遇到了同样的问题,我偶尔会有没有被删除的键。我们的Redis实现不是集群模式,而是有一个读/写的主节点和两个只读的副本。如果你不告诉Redis使用主节点进行所有的“写”操作,那么你就可以使用主节点。(设置、移除、删除、等等),它可能偶尔会向副本服务器发送一些写入请求(s).你的实现不是.NET(像我的),但我们使用CommandFlags.DemandMaster参数传递给“写”操作调用。也许在你的框架中有类似的东西...

相关问题