Bootstrap

Jedis 实现多条件查询

封装的Redis操作的工具类

这里面存取Redis的key和value全部都先序列化了的

public  class DefaultJedisPoolClient {

    private static JedisPool pool = null;
    //封装的序列化接口
    private ISerializer serializer;

    public Set<String> sinter(String... keys) {
        Jedis jedis = null;
        try{
            jedis = pool.getResource();
            Set<byte[]> bytesSet = jedis.sinter(serializer.serialize(keys));
            String str = null;
            Set<String> sinter = new HashSet<>();
            for (byte[] bytes : bytesSet) {
                str = (String) serializer.unserialize(bytes);
                sinter.add(str);
            }
            return sinter;
        }finally {
            if(jedis!=null){
                jedis.close();
            }
        }
    }

    public void sadd(String key, String... macs) {
        if(macs==null||macs.length==0)return;
        Jedis jedis = null;
        try{
            jedis = pool.getResource();
            jedis.sadd(serializer.serialize(key), convertObjectsToBytes(macs));
        }finally {
            if(jedis!=null){
                jedis.close();
            }
        }
    }

    public void hmset(String key, Map<String,Object> values) {
        if(values==null||values.size()==0)return;
        Jedis jedis = null;
        try{
            jedis = pool.getResource();
            jedis.hmset(serializer.serialize(key), convertObjectsToBytes(values));
        }finally {
            if(jedis!=null){
                jedis.close();
            }
        }
    }

    public Map<byte[],byte[]> convertObjectsToBytes(Map<String,Object> objects){
        Map<byte[],byte[]> result = new HashMap<>();
        for(String key:objects.keySet()){
            result.put(serializer.serialize(key),serializer.serialize(objects.get(key)));
        }
        return result;
    }

}    

Service中调用方法存取Redis

@Service
public class RedisServiceImpl{

    @Autowired
    private DefaultJedisPoolClient poolClient;

    /**
     * 存Redis的方法
     * 参数list:存有a,b ,c,d参数的HashMap的list集合
     */
    public void addToRedis(List<Map<String, Object>> list) {
        String a;
        String b;
        String c;
        String d;
        //查询当前Redis中的数据
        Map<String, Object> infos = poolClient.hgetall("list");
        for (Map<String, Object> info : list){
            //添加数据,遍历完了再重新添加到Redis中
            infos.put(info.get("id")+"",info);
            a = (String) info.get("a");
            if (a!= null && !"".equals(a)){
                //以a的值为key,当前id为value,添加到Set集合中,之后多条件查询id用
                poolClient.sadd(info.get("a")+"",info.get("id")+"");
            }
            b= (String) info.get("b");
            if (b!= null && !"".equals(b)){
                poolClient.sadd(info.get("b")+"",info.get("id")+"");
            }
            c= (String) info.get("c");
            if (c!= null && !"".equals(c)){
                poolClient.sadd(info.get("c")+"",info.get("id")+"");
            }
            d= (String) info.get("d");
            if (d!= null && !"".equals(d)){
                poolClient.sadd(info.get("d")+"",info.get("id")+"");
            }
        }
        poolClient.hmset("list",infos);
    }

    /**
     * 取Redis数据的方法
     * 参数map:存有a,b ,c,d参数的HashMap
     */
    public List<Map<String, Object>> queryFromRedis(Map<String, String> map) {

        StringBuffer sb = new StringBuffer();
        String a = map.get("a");
        if (a != null && !"".equals(a)){
            sb.append(a+",");
        }
        String b = map.get("b");
        if (b != null && !"".equals(b)){
            sb.append(b+",");
        }
        String c = map.get("c");
        if (c != null && !"".equals(c)){
            sb.append(c+",");
        }
        String d = map.get("d");
        if (d != null && !"".equals(d)){
            sb.append(d);
        }
        String str = sb.toString();
        String[] keys = null;
        if (str.contains(",")){
             keys = str.split(",");
        }else {
            keys = new String[1];
            keys[0] = str;
        }
        String strs = "";
        for (int i=0;i<keys.length;i++){
            strs += keys[i];
        }
        //查询多个参数的id值得交集,得到通过多参数查询的id的Set集合
        Set<String> sinter = poolClient.sinter(keys);
        List<Map<String, Object>> infos = new ArrayList<>();
        if (sinter.size() > 0){
            //遍历存有id的Set集合,并查询这些数据
            for (String key : sinter){
                HashMap<String,Object> info = (HashMap<String,Object>) poolClient.hget("list",key);
                infos.add(info);
            }
        }
        return infos;
    }

}
;