• Redis 通过key前缀获取所有匹配的key的值


    最近工作中,遇到一个不太难的问题,但是一般情况下 通常,我们使用redis要求的都是key不能相同,但是这次的问题是 值相等的key  不能存在多个。解决的时候,看到redis可以写正则表达式获取匹配的key,所有给自己没有规律的key,加了一个前缀,毕竟一个系统 ,缓存的数据还是很多的,避免拿到别人的key。接下来,我们来看看代码怎么写的。

    首先写了一个测试用例,测试自己写的正则能匹配到值。

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    /**
     * @ClassName: RegexMatches
     * @Description: 测试正则表达式无误   但是redis  不需要加一点 ‘.’
     * @Author youli
     * @date 2020年12月7日
     */
    public class RegexMatches {
    
        public static void main(String args[]) {
            String str = "card_key51e5f269-aef9-446a-8c86-2f19cae2bc";
            String pattern = "card_key.*";
            
            Pattern r = Pattern.compile(pattern);
            Matcher m = r.matcher(str);
            System.out.println(m.matches());
        }
    
    }

     测试返回正确,就说明能匹配。然后我们看下redis里边的写法

    public void getRedis(String cardId) {
            // 获取所有的key
            Set<String> keys = redisTemplate.keys("card_key.*");
            for (String key : keys) {
                // 获取key对应值
                Object value = redisTemplate.opsForValue().get(key);
                if (value.equals(cardId)) {
                    redisTemplate.delete(key);
                }
            }
        }

    这么写之后,我看正则没问题,也就没测试了,后来上服务器一看,嘛呀,还是那么多。于是乎,赶紧测试了下,发现

    public void getRedis(String cardId) {
            // 获取所有的key
            Set<String> keys = redisTemplate.keys("card_key*");
            for (String key : keys) {
                // 获取key对应值
                Object value = redisTemplate.opsForValue().get(key);
                if (value.equals(cardId)) {
                    redisTemplate.delete(key);
                }
            }
        }

    看到区别没,就是不要那一点,也就是说这里直接写匹配以什么开头的就行了,结尾不管有多少个,用"*"代替就好。

    看看redis链接客户端

     两个不同的key,但是相同的值。

    执行后的结果

     结果相同的key就只有一个了。

    代码调试可以看到获取的key

  • 相关阅读:
    异步多线程 Thread ThreadPool Task
    ASP.NET MVC IActionFilter IResultFilter IExceptionFilter/HandleError
    ASP.NET MVC Area 区域
    ASP.NET MVC Bundles 合并压缩(js css)
    ASP.NET MVC ActionMethodSelectorAttribute 以及HttpGet等Action特性
    ASP.NET MVC Form表单验证与Authorize特性
    ASP.NET MVC Owin 基本理解
    CSS 基础 例子 图片拼合技术
    CSS 基础 例子 display属性:block、inline和inline-block的区别
    UVa 1326
  • 原文地址:https://www.cnblogs.com/haoliyou/p/14097524.html
Copyright © 2020-2023  润新知