Redis   发布时间:2022-05-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了谈谈使用Redis缓存时批量删除的几种实现大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

<h2 id="前言">前言

在使用缓存的时候,我们时不时会遇到这样一个需求,根据缓存键的规则去批量删除这些数据,比较常见的就是按前缀去删除。

举个简单的例子redis中现在有几百个商品的数据,这些数据的key值是有一定规律的,都是以product:id的形式存在的。

现在由于不得以为的原因要删除这几百个商品的数据,这个时候我们肯定就要把缓存键以product:开头的给全部删除掉。

其实这个需求在redis中是可以很容易去实现的。

来看看几种常见的做法。

  1. 用Keys命令找到key之后执行删除操作
  2. 用Scan命令找到key之后执行删除操作(2.8.0版本之后)
  3. 添加缓存数据的时候,可以同时将key存放到一个SET中,然后依据这个SET来执行删除操作

对于Keys命令,网上有不少血的教训,对于生产环境还是要谨慎谨慎再谨慎!能不用就别用。

Scan命令的话是大部分人推荐的做法,是增量式迭代的一个命令。

存到SET中就相对繁琐一点,而且额外占用了一部分内存。而且在进行删除的时候还要从这里读取出相应的key,同时也要移除这部分key的数据。

下面来看看如何在.NET Core中来处理,主要还是针对SCAN的做法。

示例操作redis用的是StackExchange.redis

可能有人会有疑惑,不是说Keys命令尽量不要用吗?怎么你还用?

这个还真的要解释一下!

可能从方法上,我们找遍所有IServer和IDataBase接口都找不到纯粹的SCAN命令(SetScan,HashScan等除外)。

但是如果看过里面的实现,你就会知道是为什么了!

传送门:

可以看看下图高亮的两行代码:

@H_618_55@

大致意思就是,如果你用的redis的版本支持SCAN命令,走的就是SCAN,反之只能是KEYS了。

下面定义一个查找redisKey的方法。

private static redisKeY[] SearchredisKeys(IServer server,String pattern)
{
    var keys = server.Keys(pattern: pattern).ToArray();
    Console.WriteLine("Search Count-{0}",keys.Length);
    return keys;
}

知道那些Key要删除,剩下的就比较简单了!

private static void KeysOrScanSolution(IServer server,IDatabase db,String pattern)
{            
    db.Keydelete(SearchredisKeys(server,pattern));                        
}

IServer.Keys可以说是隐式的调用了SCAN命令,那么我们自然也可以显式的去调用这个命令来完成这些。

private static redisKeY[] SearchredisKeys(IDatabase db,String pattern)
{
    var keys = new HashSet();
int nextcursor = 0;
do
{
    redisResult redisResult = db.Execute("SCAN",nextcursor.ToString(),"MATCH",pattern,"COUNT","1000");
    var innerResult = (redisresult[])redisResult;

    nextcursor = int.Parse((String)innerresult[0]);

    List<redisKey> resultLines = ((redisKeY[])innerresult[1]).ToList();

    keyS.UnionWith(resultLines);
}
while (nextcursor != 0);

return keys.ToArray();

}

删除的代码。

private static void ExecuteSolution(IDatabase db,String pattern)
{
    db.Keydelete(SearchredisKeys(db,pattern));
}

当然还有一种做法是调用lua脚本去完成,这里就不细说了。

然上面几种做法能比较简单的处理这个问题,但是在拿出这些Keys的时候,客户端的内存占用可能会比较大,尤其是有大量符合条件的缓存项的时候。

涉及缓存的诸多操作(包含根据前缀去删除缓存项),我也在中实现了相应的操作,后面也会不断的抽时间来完善这一项目,有兴趣的朋友可以关注一下。

文中的示例代码 disBatchRemoveSolution">redisBatchRemoveSolution

大佬总结

以上是大佬教程为你收集整理的谈谈使用Redis缓存时批量删除的几种实现全部内容,希望文章能够帮你解决谈谈使用Redis缓存时批量删除的几种实现所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: