批量匹配删除redis缓存

使用spring boot2.x cache —— redis作为数据缓存方案时,可以采用@CacheEvict用来清除相应的数据缓存,但是@CacheEvict底层使用的redis的keys命令来遍历查找,但是keys太过暴力,不支持offset、limit参数,而且是遍历算法,复杂度为O(n),当redis中的数据量较大时,很容易造成服务卡顿阻塞,所以在正式环境keys这个命令是禁用的,那么@CacheEvict也就不可用了。
但是redis在2.8版本之后增加了scan命令,支持游标遍历查询,下文是用java实现的scan遍历及删除
Spring boot 集成redis参考另一篇:https://blog.csdn.net/qq_29721419/article/details/102709474

package com.kexin.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @Author KeXin
 * @Date 2019/6/19 下午6:32
 **/
@Component
@Slf4j
public class RedisUtil {

    @Resource
    RedisTemplate<String, Integer> redisTemplate;

    /**
     * 批量删除key
     * @param keys
     * @return
     */
    public Long delKeys(Set<String> keys){
        return redisTemplate.delete(keys);
    }

    /**
     * 根据matchKey匹配查询
     * @param matchKey
     * @param count 用来限制hint
     * @return
     */
    public Set<String> getScan(String matchKey, int count) {

        return redisTemplate.execute((RedisCallback<Set<String>>) connection -> {

            Set<String> binaryKeys = new HashSet<>();

            Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder()
                    .match(matchKey)
                    .count(count)
                    .build());
            while (cursor.hasNext()) {
                binaryKeys.add(new String(cursor.next()));
            }
            return binaryKeys;
        });
    }

}```

你可能感兴趣的:(数据库+缓存)