redis集群模式下Scan方法替换keys*命令(代码参考亲测有效)

自己写的工具类,写好后可以用现代码Set<String> cache=UtoolsClient .Scan1();替代以下的代码就OK
示例:
原代码Set<String> cache = stringRedisTemplate.keys("menu_auth_*");
package com.sunyard.system.admin.utils;/*
@author   fuqing
@version   1.8
 */

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import sun.reflect.generics.tree.ByteSignature;

import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.Set;

@Component
public class UtoolsClient implements ApplicationRunner {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    public static  UtoolsClient utoolsClient;
    /*
    * 工具类 redis集群模式下用Scan方法替代redis中的keys*命令
    *
    */
    @PostConstruct
    public  void  init(){
        utoolsClient = this;
        utoolsClient.stringRedisTemplate= this .stringRedisTemplate;
    }


    public static Set<String> Scan1(){
        Set<String> excute =utoolsClient.stringRedisTemplate.execute(new RedisCallback<Set<String>>() {
            @Override
            public Set<String> doInRedis(RedisConnection connection) throws DataAccessException {
                HashSet<String> result = new HashSet<>();
                //curdor用完要关闭,这里利用java7新特性紫东关闭

                try {
                    Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().match("menu_*").count(1000).build());

                    assert cursor != null;
                    while (cursor.hasNext()){
                        byte[] bytes = cursor.next();
                        result.add(new String(bytes, StandardCharsets.UTF_8));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }


                return result;
            }
        });
        System.out.println(excute);
        return excute;
    }





    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("");
    }
}

最后说一下,写好工具类后如何调用:相信我们在替换之前keys*命令的代码一般是这样写
如下举例:

Set<String> cache = stringRedisTemplate.keys("menu_*");

将这行代码替换成工具类.方法调用:按照我上面的代码就改成这样:

Set<String> cache =UtoolsClient .Scan1();

搞定!


版权声明:本文为m0_65057585原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。