redis增大查詢速度(專案中實際應用舉例)
阿新 • • 發佈:2019-01-26
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); } } }