Redis 简单实现sql的条件查询

redis的数据类型String、list、hashmap、set、sortedset等,一般情况不容易实现关系型数据库的灵活的条件查询。
简单介绍:把所有的user放入到map中再存入redis中,怎样根据条件查询处user。
User:为用户实体类
JsonUtil:json和实体类之间的转换
TestRedis:redis条件查询测试

package com.test.redis;

public class User { 
    private String name;
    private int age;
    private String  sex;
    private String id;  
    public User(){
        super();
    }   
    public User(String id, String name, int age, String sex){
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
     // set和get方法自己补全
}
import com.alibaba.fastjson.JSON;

/**
 * 利用fastjson 对象和json字符创之间的转换
 * @author zhb
 *
 */
public class JsonUtil {
    
    /**
     * 将对象转换成json字符串
     * @param object
     * @return
     */
    public static String toJSONString(Object object){
        if(object!=null){
            return JSON.toJSONString(object);
        }
        return null;
    }   
    
    /**
     * 将json字符串转成对象T
     * @param <T>
     * @param jsonStr
     * @return
     */
    public static <T> Object parseObject(String jsonStr, Class<T> c){
        if(jsonStr!=null){
            return JSON.parseObject(jsonStr, c);
        }
        return null;        
    }
    
}

import redis.clients.jedis.Jedis;

/**
 * 利用redis的几种数据结构(String、list、hashmap、set、sortedset)之间的组合,来实现简单的条件查询
 * 缺点是要提前设置好要查询的要素
 * @author zhb
 *
 */
public class TestRedis {
    
    public static void main(String[] args) {
        
        // 链接redis
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        
        // 存放user的map,user的id为key user的json字符串为value
        Map<String, String> map = new HashMap<String, String>();
        
        String id1 = UUID.randomUUID().toString();
        User user1 = new User(id1, "张三", 22 ,"m");
        map.put(id1, JsonUtil.toJSONString(user1));
        
        String id2 = UUID.randomUUID().toString();
        User user2 = new User(id2, "李四", 23 ,"m");
        map.put(id2, JsonUtil.toJSONString(user2));
        
        String id3 = UUID.randomUUID().toString();
        User user3 = new User(id3, "王五", 26 ,"w");
        map.put(id3, JsonUtil.toJSONString(user3));
        
        String id4 = UUID.randomUUID().toString();
        User user4 = new User(id4, "王六", 25 ,"w");
        map.put(id4, JsonUtil.toJSONString(user4));
        
        // 将存有user的map存入redis  key为user
        jedis.hmset("user", map);
        // 测试取出id3的user的信息
        String u = jedis.hget("user", id3);
        // 取出key为user的所有的用户的map,即刚刚存入的map
        Map<String, String> map1 = jedis.hgetAll("user");
        
//      for (Entry<String, String> entry : map1.entrySet()) {
//           System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
//      }
                
        // 到此可以查询所有的user也可以根据user的id查询查询某个用户
        // 但是redis不能像关系型数据库似的进行条件查询,
        // select * from user where age between 20 and 25 and sex m; 查询年龄在20到25岁之间的男性 
        // redis虽然不像关系型数据库似的对条件查询那样灵活,但也可以利用 hashmap、set sortedset等方式进行简单的条件查询
        // 必须把提前要查询的条件设置好
        // 例如上面user例子 ,可以把年龄和id放入 sortedset中,把性别放入分为w和m放入到set中
        
        // key = user_age 为sortedset的key值,年龄 为 score; id为member
        String user_age = "user_age";
        jedis.zadd(user_age, 22, id1);
        jedis.zadd(user_age, 23, id2);
        jedis.zadd(user_age, 26, id3);
        jedis.zadd(user_age, 25, id4);
        // 查询20到25之间的id的值
        Set<String> ageSet = jedis.zrangeByScore(user_age, 20, 25);
        // 取出年龄在20到25之间的所有的user
        List<String>  hmget = jedis.hmget("user",  (String[])ageSet.toArray(new String[ageSet.size()]));
        for (String string : hmget) {
            User user = (User) JsonUtil.parseObject(string, User.class);
            System.out.println("年龄20到25之间user名字:"+user.getName());
        }
        
        // user_sex_m 为男性set的key值的值,id为member
        String user_sex_m = "user_sex_m";
        jedis.sadd(user_sex_m, id1, id2);
        
        // user_sex_w 为女性set的key值的值,id为member
        String user_sex_w = "user_sex_w";
        jedis.sadd(user_sex_w, id3);
        jedis.sadd(user_sex_w, id4);
        
        // 取所有的女性的id
        Set<String> user_sex_wStr = jedis.smembers(user_sex_w);
        
        // 取所有的女性的user
        List<String>  hh = jedis.hmget("user",  (String[])user_sex_wStr.toArray(new String[user_sex_wStr.size()]));
        for (String string : hh) {
            User user = (User) JsonUtil.parseObject(string, User.class);
            System.out.println("女性的名字:"+user.getName());
        }       
    }   

}

    原文作者:真海ice
    原文地址: https://www.jianshu.com/p/a19f303c6c25
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞