RedisTemplate删除指定前缀Keys

根据前缀keyPre 删除keys

        String keyPre = "CONTROLLER_getTodayStocks_1";
        Set keys = redisTemplate.keys(keyPre + "*");
        if (ObjectUtil.isNotEmpty(keys)) {
            redisTemplate.delete(keys);
        }

debug看下执行流程:
1、keyPro不能为空
redisTemplate.keys()方法里面有个断言,为空就失败
在这里插入图片描述2、序列化keyPre,把字符串变为字节数组
在这里插入图片描述这里可以看到如果keyPre为null,序列化之后返回null
3、这里会拿到redis中所有匹配上的key,然后执行excute两个参数的方法
RedisTemplate删除指定前缀Keys_第1张图片执行excute方法传入两个参数 1、连接对象,这个对象是后面创建的 2、true,表示暴露这个连接
在这里插入图片描述然后执行三个参数的方法 1、回调 2、表示暴露连接 3、表示不使用管道

管道(pipeline)可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline 通过减少客户端与 redis 的通信次数来实现降低往返延时时间,而且 Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。

RedisTemplate删除指定前缀Keys_第2张图片现在执行三参数的excute
1、拿到连接工厂
2、创建redis连接对象,未开启事务支持
RedisTemplate删除指定前缀Keys_第3张图片3、看一下redis事务同步管理器中是否存在连接
4、对redis连接对象前置处理
RedisTemplate删除指定前缀Keys_第4张图片5、判断连接是否使用了pipeline,只有开启了pipeline这里才会开开pipeline
6、判断是否暴露连接,很显然两个参数的excute是暴露连接了的,这时使用前面创建好的连接对象,否则会创建一个代理连接对象
RedisTemplate删除指定前缀Keys_第5张图片7、接下来redis该行动了
在这里插入图片描述8、这里根据前面创建的连接和keyPre,执行keys方法

9、在这里执行keys方法,执行invoke方法返回一个Set集合

在这里插入图片描述invoke执行doInvoke
RedisTemplate删除指定前缀Keys_第6张图片这里调用redis连接池执行命令,这里会等待执行命令的线程返回结果
RedisTemplate删除指定前缀Keys_第7张图片

10、执行完doInRedis之后就拿到符合匹配条件的keys
11、判断是否有管道开启,开的的话就关闭
12、RedisTemplate对结果进行后置处理
13、断开连接,返回结果
RedisTemplate删除指定前缀Keys_第8张图片14、可以看到此时已经获取到redis中匹配的key
RedisTemplate删除指定前缀Keys_第9张图片

你可能感兴趣的:(数据库,java,redis)