1. 程式人生 > >redis增大查詢速度(專案中實際應用舉例)

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);  
        }  
    }  
}