redis增大查询速度(项目中实际应用举例)

1、关于保存User表的方案

      1.1  使用Redis的Hash类型去保存关系型数据库的User表

       1.2 redis的Hash的key为"SYS_USER_TABLE_SEX_MAN",field:userid   value:json 数据


2、利用Redis的Set来保存满足一类条件的User用户的id信息。例如,性别为女,年龄大于25岁等条件。


3、Java实现的具体代码如下:

      3.1  Json相关的工具类   

public class GsonUtil {  
    public static String object2Json(Object object) {  
        Gson gson = new Gson();  
        return gson.toJson(object);  
    }  
  
    public static <T> T json2Object(String json, Class<T> clazz) {  
        Gson gson = new Gson();  
        return gson.fromJson(json, clazz);  
    }  
}  

      3.2  User实体类     

public class User {  
    private int id;  
    private String name;  
    private String sex;  
    private int age;  
  
    public User() {  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    public int getId() {  
        return id;  
    }  
  
    public void setId(int id) {  
        this.id = id;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getSex() {  
        return sex;  
    }  
  
    public void setSex(String sex) {  
        this.sex = sex;  
    }  
  
    @Override  
    public String toString() {  
        return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age="  
                + age + "]";  
    }  
  
}  

      3.3   Redis实现类似SQL的多条件查询测试

public class RedisSQL {  
    public static void main(String[] args) {  
  
        // 将User表的内容放到Redis里面,下面为key  
        // 将User表的内容field:id value: json 保存一个记录  
        final String SYS_USER_TABLE = "SYS_USER_TABLE";  
        // 用于保存性别为男性的User用户的Redis的Set  
        final String SYS_USER_TABLE_SEX_MAN = "SYS_USER_TABLE_SEX_MAN";  
        // 用于保存性别为女性的用户的Redis的Set  
        final String SYS_USER_TABLE_SEX_FEMAN = "SYS_USER_TABLE_SEX_FEMAN";  
        // 用于保存age为25岁的用户的Redis的Set  
        final String SYS_USER_TABLE_AGE_25 = "SYS_USER_TABLE_AGE_25";  
        // 获取数据库的连接  
        Jedis jedis = new Jedis("192.168.2.116", 6379);  
  
        // 模拟数据库的表User的数据  
        List<User> users = new ArrayList<User>();  
        for (int i = 0; i < 5; i++) {  
            User user = new User();  
            user.setId(i);  
            user.setName("zhang" + i);  
            user.setSex("man");  
            user.setAge(20 + i);  
            users.add(user);  
        }  
        for (int i = 5; i < 10; i++) {  
            User user = new User();  
            user.setId(i);  
            user.setName("zhang" + i);  
            user.setSex("feman");  
            user.setAge(20 + i);  
            users.add(user);  
        }  
  
        // 通过Hash存放  
        Map<String, String> map = new HashMap<String, String>();  
        for (int i = 0; i < users.size(); i++) {  
            map.put(users.get(i).getId() + "",  
                    GsonUtil.object2Json(users.get(i)));  
  
            // 将性别为男性的User用户  
            // 加入到Redis中key为SYS_USER_TABLE_SEX_MAN的Set集合里面  
            // 只需要加入User用户的id就可以了  
            if ("man".equals(users.get(i).getSex())) {  
                jedis.sadd(SYS_USER_TABLE_SEX_MAN, users.get(i).getId() + "");  
            }  
            // 将性别为男性的User用户  
            // 加入到Redis中key为SYS_USER_TABLE_SEX_MAN的Set集合里面  
            // 只需要加入User用户的id就可以了  
            if ("feman".equals(users.get(i).getSex())) {  
                jedis.sadd(SYS_USER_TABLE_SEX_FEMAN, users.get(i).getId() + "");  
            }  
            // 如果有age,birthday等,使用类似的方法  
            // 在Redis里面,新建立一个Set,用来保存符合条件的相关User的id信息  
            if ("25".equals(users.get(i).getAge() + "")) {  
                jedis.sadd(SYS_USER_TABLE_AGE_25, users.get(i).getId() + "");  
            }  
        }  
        // 查看转换结果  
        // Set<String> keySet = map.keySet();  
        // for (String key : keySet) {  
        // System.out.println(map.get(key));  
        // }  
  
        // 保存User表的数据到Redis中  
        // key为SYS_USER_TABLE  
        // 每条记录一 feild :id value:json 的形式保存  
        jedis.hmset(SYS_USER_TABLE, map);  
  
        // ===============================  
        // 模拟SQL的where多条件查询  
        // 查询年龄为25岁,性别为女的user用户  
        Set<String> sinter = jedis.sinter(SYS_USER_TABLE_SEX_FEMAN);  
        for (String key : sinter) {  
            // 根据id到Redis中的SYS_USER_TABLE,查询符合条件的user  
            String hkey = jedis.hget(SYS_USER_TABLE, key);  
            System.out.println(hkey);  
            // 将查询到的json数据,转换为User用户  
            User user = GsonUtil.json2Object(hkey, User.class);  
            System.out.println(user);  
  
        }  
  
        // 查询年龄为25岁,性别为女的user用户  
        Set<String> sinter2 = jedis.sinter(SYS_USER_TABLE_SEX_FEMAN,  
                SYS_USER_TABLE_AGE_25);  
        for (String key : sinter2) {  
            // 根据id到Redis中的SYS_USER_TABLE,查询符合条件的user  
            String hkey = jedis.hget(SYS_USER_TABLE, key);  
            System.out.println(hkey);  
            // 将查询到的json数据,转换为User用户  
            User user = GsonUtil.json2Object(hkey, User.class);  
            System.out.println(user);  
        }  
    }  
}  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值