Jedis就是redis支持java的第三方類庫,我們可以使用Jedis類庫操作redis數據庫。
注意:Jedis2.7以上的版本才支持集羣操作。
1.1 新建Maven quickStart項目
引入Jedis依賴
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.2</version>
</dependency>
1.2 鏈接到redis服務
Jedis jedis = new Jedis("10.0.31.144",6379); //默認端口6379 可以省略 jedis.auth("redis"); //無密碼此步可省略
1.3 Redis Java String(字符串)
Jedis jedis = new Jedis("10.0.31.144",6379); jedis.auth("redis"); jedis.set("a", "test1"); // 存數據 System.out.println(jedis.get("a")); // 取數據
1.4 Redis Java List(列表)
Jedis jedis = new Jedis("10.0.31.144",6379); jedis.auth("redis"); //存儲數據到列表中 jedis.lpush("list1", "Java"); jedis.lpush("list1", "Html5"); jedis.lpush("list1", "Python"); // 獲取存儲的數據並輸出 List<String> list = jedis.lrange("list1", 0 ,-1); for(int i=0; i<list.size(); i++) { System.out.println("列表項爲: "+list.get(i)); }
1.5Redis Java Keys
Jedis jedis = new Jedis("10.0.31.144",6379); jedis.auth("redis"); // 獲取數據並輸出 Set<String> keys = jedis.keys("*"); Iterator<String> it=keys.iterator() ; while(it.hasNext()){ String key = it.next(); System.out.println(key); }
2 將User表放入到Redis緩存
t_user表數據量很大,查詢很頻繁,鮮有更新操作,可以把t_user表放到redis緩存中,實現t_user表的快速查詢。
測試過程中我們用到了object轉jsonString
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.12</version>
</dependency>
2.1準備User.java
public class User { private String id; private String name; private int age; private String sex; public User() { super(); } public User(String id, String name, int age, String sex) { super(); this.id = id; this.name = name; this.age = age; this.sex = sex; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}'; } }
2.2 將User的數據放入到Redis
Jedis jedis = new Jedis("10.0.31.144",6379); jedis.auth("redis"); User u1 = new User(UUID.randomUUID().toString(),"jack1",21,"m"); User u2 = new User(UUID.randomUUID().toString(),"jack2",22,"m"); User u3 = new User(UUID.randomUUID().toString(),"jack3",23,"m"); User u4 = new User(UUID.randomUUID().toString(),"jack4",24,"m"); User u5 = new User(UUID.randomUUID().toString(),"jack5",25,"m"); Map<String,String> userMap = new HashMap<String,String>(); userMap.put("u1",JSON.toJSONString(u1)); userMap.put("u2",JSON.toJSONString(u2)); userMap.put("u3",JSON.toJSONString(u3)); userMap.put("u4",JSON.toJSONString(u4)); userMap.put("u5",JSON.toJSONString(u5)); jedis.hmset("t_user",userMap);
到Redis數據庫服務器上觀察:
127.0.0.1:6379> keys * 1) "t_user" 127.0.0.1:6379> hkeys t_user 1) "u1" 2) "u3" 3) "u4" 4) "u5" 5) "u2" 127.0.0.1:6379> hvals t_user 1) "{\"age\":21,\"id\":\"740a1778-de0e-4426-b231-1f97d290b13c\",\"name\":\"jack1\",\"sex\":\"m\"}" 2) "{\"age\":23,\"id\":\"5133d99f-b8a0-4062-8624-89a5dc5c8e89\",\"name\":\"jack3\",\"sex\":\"m\"}" 3) "{\"age\":24,\"id\":\"f6d1a709-5f2c-4564-bec6-b8f63eef6a86\",\"name\":\"jack4\",\"sex\":\"m\"}" 4) "{\"age\":25,\"id\":\"4c8b4122-c9f9-41b2-ba29-c0de2a257370\",\"name\":\"jack5\",\"sex\":\"m\"}" 5) "{\"age\":22,\"id\":\"e48c6616-75c2-4d04-9e90-31b69a4632a4\",\"name\":\"jack2\",\"sex\":\"m\"}" 127.0.0.1:6379>
2.3 使用Redis中的User緩存數據
t_user表數據量大,查詢緩慢,如何實現t_user表數據的快速查詢;
select * from t_user where age =25;
select * from t_user where sex = 'm';
select * from t_user where sex = 'w';
我們可以使用redis中的set類型預先設定查詢結果集。
Jedis jedis = new Jedis("10.0.31.144",6379); jedis.auth("redis"); //假設現在有mybatis的三個查詢操作 //userMapper.getUserListByAge(25) //userMapper.getUserListBySex("m") //userMapper.getUserListBySex("f") //預設查詢結果集 final String user_list_by_age_25 = "user_list_by_age_25"; final String user_list_by_sex_m = "user_list_by_sex_m"; final String user_list_by_sex_f = "user_list_by_sex_f"; //在初始化redis緩存的時候,模擬預設查詢結果集 // (在真正的開發中,使用mybatis二級換從數據庫查詢後再緩存到redis) //定義userMap存放t_user表的所有數據 Map<String,String> userMap = new HashMap<String,String>(); User u1 = new User(UUID.randomUUID().toString(),"jack",21,"m"); userMap.put("u1",JSON.toJSONString(u1)); //u1 滿足性別爲m的條件,即u1爲userMapper.getUserListBySex("m")的查詢結果集 jedis.sadd(user_list_by_sex_m,"u1"); User u2 = new User(UUID.randomUUID().toString(),"rose",25,"f"); userMap.put("u2",JSON.toJSONString(u2)); //u2 滿足sex='f' age=25 jedis.sadd(user_list_by_sex_f,"u2"); jedis.sadd(user_list_by_age_25,"u2"); User u3 = new User(UUID.randomUUID().toString(),"jack3",23,"m"); userMap.put("u3",JSON.toJSONString(u3)); //u3 滿足sex='m' jedis.sadd(user_list_by_sex_m,"u3"); jedis.hmset("t_user",userMap);
觀察redis服務器:
127.0.0.1:6379> keys * 1) "user_list_by_age_25" 2) "user_list_by_sex_m" 3) "t_user" 4) "user_list_by_sex_f" 127.0.0.1:6379> hkeys t_user 1) "u1" 2) "u2" 3) "u3" 127.0.0.1:6379> hvals t_user 1) "{\"age\":21,\"id\":\"65224362-26b7-4858-9dfd-6c8df8d0dcce\",\"name\":\"jack\",\"sex\":\"m\"}" 2) "{\"age\":25,\"id\":\"cd23782e-90a5-4c80-8c31-d0c874e623f6\",\"name\":\"rose\",\"sex\":\"f\"}" 3) "{\"age\":23,\"id\":\"e5bb2423-c821-4267-b77c-0abef4777113\",\"name\":\"jack3\",\"sex\":\"m\"}" 127.0.0.1:6379> smembers user_list_by_age_25 1) "u2" 127.0.0.1:6379> smembers user_list_by_sex_m 1) "u1" 2) "u3" 127.0.0.1:6379> smembers user_list_by_sex_f 1) "u2" 127.0.0.1:6379>
這樣在程序中userMapper.getUserListByAge(25)就可以通過從redis服務器上獲得user_list_by_age_25數據進行使用。
Jedis jedis = new Jedis("10.0.31.144",6379); jedis.auth("redis"); Set<String> userlist = jedis.smembers("user_list_by_sex_m"); for(String u : userlist){ //拿到對對應ser的json字符串 System.out.println(jedis.hget("t_user",u)); //...這裏可以再使用json轉object方法 }