在Redis的官網上,我們可以看到Redis的Java客戶端眾多 ![Redis客戶端][pic1] 其中,Jedis是Redis官方推薦,也是使用用戶最多的Java客戶端。 開始前的準備 使用jedis使用到的jedis 2.1.0.jar, "點擊下載" 如果使用Redis連接池的話,需要com ...
在Redis的官網上,我們可以看到Redis的Java客戶端眾多
其中,Jedis是Redis官方推薦,也是使用用戶最多的Java客戶端。
開始前的準備
創建項目
- 首先創建一個新的Java Project,命名為Jedis(你也可以給它你喜愛的名字)
- 在項目中新建一個Folder(文件夾),命名為“lib”
- 將jedis-2.1.0.jar、commons-pool-1.5.4.jar、junit-4.10.jar複製到lib文件夾下
- 選中文件夾或者三個jar文件,右擊找到Build Path,選擇菜單下的Add to Build Path加入到Build Path中
開始擼代碼
繼續之前,請務必閱讀過Redis入門教程(二)—基本數據類型,這將對你有很大的幫助。
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.Jedis;
/**
* @author dotleo
*
*/
public class Jedis_Test {
//Java中操作Redis的對象
private Jedis jedis ;
@Before
public void connection() {
//連接Redis伺服器,參數1為ip,參數2為埠號,請根據自己實際情況賦值
jedis = new Jedis("192.168.1.233",6379);
}
/**
* redis字元串操作
*/
@Test
public void stringTest() {
//為避免多次運行Redis中存在鍵,導致結果不符合預期,每次執行時清理當前庫
//特別註意:在開發中請勿如此操作
jedis.flushDB();
//添加字元串
jedis.set("age", "101");
System.out.println("age = " + jedis.get("age"));
//批量添加字元串
jedis.mset("age1","1","age2","2");
System.out.println("age1 = " + jedis.get("age1"));
System.out.println("age2 = " + jedis.get("age2"));
//添加字元串(僅在不存在時)
jedis.setnx("price", "101");
System.out.println("price = " + jedis.get("price"));
//加1操作
jedis.incr("price");
System.out.println("price = " + jedis.get("price"));
//拼接字元串
jedis.append("age", "years");
System.out.println("age = " + jedis.get("age"));
//截取字元串
String str = jedis.getrange("age", 0L, 5L);
System.out.println("age[0,5] = " + str);
//獲取字元串長度
Long len = jedis.strlen("age");
System.out.println("age length = " + len);
//刪除字元串
jedis.del("age");
System.out.print("age = " + jedis.get("age"));
}
/**
* redis哈希操作
*/
@Test
public void hashTest() {
//為避免多次運行Redis中存在鍵,導致結果不符合預期,每次執行時清理當前庫
//特別註意:在開發中請勿如此操作
jedis.flushDB();
//添加值
jedis.hset("student", "name", "zhangsan");
//添加值(僅在不存在時)
jedis.hsetnx("student", "age", "12");
//批量添加值
Map<String,String> map = new HashMap<String,String>();
map.put("sex", "boy");
map.put("address", "beijing");
jedis.hmset("student", map);
//獲取值
String str = jedis.hget("student", "name");
System.out.println("student:name = " + str);
//批量獲取值
List<String> list = jedis.hmget("student", "name","age");
System.out.println("student:name = " + list.get(0));
System.out.println("student:age = " + list.get(1));
//獲取key
Set<String> set = jedis.hkeys("student");
System.out.println("student keys:");
for (String string : set) {
System.out.println(string);
}
//獲取值
list = jedis.hvals("student");
System.out.println("student vals:");
for (String string : list) {
System.out.println(string);
}
//獲取key和值
map = jedis.hgetAll("student");
System.out.println("student keys vals:");
for (String key:map.keySet()) {
System.out.println(key + " = " + map.get(key));
}
//刪除值
jedis.hdel("student", "sex");
System.out.println("student:sex = " + jedis.hget("student", "sex"));
//獲取長度
Long len = jedis.hlen("student");
System.out.println("student length = " + len);
}
/**
* redis列表操作
*/
@Test
public void listTest() {
//為避免多次運行Redis中存在鍵,導致結果不符合預期,每次執行時清理當前庫
//特別註意:在開發中請勿如此操作
jedis.flushDB();
//表頭添加
jedis.lpush("student", "xiaoli","xiaowang","xiaoliu","xiaozhang");
//表尾添加
jedis.rpush("student", "zhangsan","lisi","wangwu");
//通過索引獲取元素
String str = jedis.lindex("student", 1L);
System.out.println("student 1st = " + str);
//在元素前或者後插入元素
jedis.linsert("student", LIST_POSITION.BEFORE, "xiaozhang", "zhangsan");
//從表頭彈出
str = jedis.lpop("student");
System.out.println("student first = " + str);
//從表尾彈出
str = jedis.rpop("student");
System.out.println("student end = " + str);
//刪除
jedis.lrem("student", 2, "zhangsan");
//獲取所有值
List<String> list = jedis.lrange("student", 0L, -1L);
System.out.println("student vals:");
for (String string : list) {
System.out.println(string);
}
}
/**
* redis集合操作
*/
@Test
public void setTest() {
//為避免多次運行Redis中存在鍵,導致結果不符合預期,每次執行時清理當前庫
//特別註意:在開發中請勿如此操作
jedis.flushDB();
//添加成員
jedis.sadd("student", "zhangsan","lisi");
jedis.sadd("monitor","wangwu","zhangsan");
//獲取成員數
Long count = jedis.scard("student");
System.out.println("student count = " + count);
//獲取成員
Set<String> set = jedis.smembers("student");
System.out.println("student members:");
for (String string : set) {
System.out.println(string);
}
//是否為該集合的成員
boolean bool = jedis.sismember("student", "zhangsan");
System.out.println("member zhangsan exist?\n" + bool);
//交集
set = jedis.sinter("student","monitor");
System.out.println("student inter monitor members:");
for (String string : set) {
System.out.println(string);
}
//並集
set = jedis.sunion("student","monitor");
System.out.println("student union monitor members:");
for (String string : set) {
System.out.println(string);
}
//補集
set = jedis.sdiff("student","monitor");
System.out.println("student diff monitor members:");
for (String string : set) {
System.out.println(string);
}
//隨機返回成員
String str = jedis.srandmember("student");
System.out.println("random member:\n" + str);
//移動成員
jedis.smove("student", "monitor", "lisi");
//刪除成員
jedis.srem("monitor", "zhangsan");
//顯示
set = jedis.smembers("student");
System.out.println("student members:");
for (String string : set) {
System.out.println(string);
}
set = jedis.smembers("monitor");
System.out.println("monitor members:");
for (String string : set) {
System.out.println(string);
}
}
/**
* redis有序集合操作
*/
@Test
public void sortSetTest() {
//為避免多次運行Redis中存在鍵,導致結果不符合預期,每次執行時清理當前庫
//特別註意:在開發中請勿如此操作
jedis.flushDB();
//添加成員
Map<Double,String> map = new HashMap<Double,String>();
map.put(50d, "zhangsan");
map.put(60d, "lisi");
map.put(70d, "wangwu");
map.put(80d, "zhaoliu");
map.put(90d, "yangqi");
map.put(120d, "xiaoming");
map.put(130d, "xiaozhang");
map.put(140d, "xiaoli");
map.put(150d, "xiaoliu");
jedis.zadd("score", map);
//更新分數
jedis.zadd("score", 100d, "zhangsan");
//獲取成員的分數值
Double dou = jedis.zscore("score", "zhangsan");
System.out.println("zhangsan score :\n" + dou);
//按照成員分數小到大返回索引區間的成員
Set<String> set = jedis.zrange("score", 0, -1);
System.out.println("score member order:");
for (String string : set) {
System.out.println(string);
}
//按照成員分數大到小返回索引區間的成員
set = jedis.zrevrange("score", 0, -1);
System.out.println("score member reverse:");
for (String string : set) {
System.out.println(string);
}
//按照成員分數小到大返回分數值區間的成員
set = jedis.zrangeByScore("score", 50d, 80d);
System.out.println("score member order:");
for (String string : set) {
System.out.println(string);
}
//返回有序集合中指定成員的索引
Long index = jedis.zrank("score", "xiaoliu");
System.out.println("xiaoliu index is:\n" + index);
}
}
如果你讀過我的Redis入門教程(二)—基本數據類型,你會發現上面這些命令在其中都有提及,只是諸如參數傳遞的形式、返回值的類型等有少許不同,但方法名和文中的指令完全相同,其他方面也大同小異。因此在上面的代碼中並沒有像文章中一樣儘可能多的列出所有的函數,還需你自己勤於練習、摸索。
Redis連接池
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @author dotleo
*
*/
public class RedisUtil {
//Redis伺服器ip地址
private static final String IP_ADDRESS = "192.168.1.233";
//Redis埠號
private static final int PORT = 6379;
//可用連接實例的最大數目,預設值為8;
//如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis實例,則此時pool的狀態為exhausted(耗盡)。
private static final int MAX_ACTIVE = 1024;
//控制一個pool最多有多少個狀態為idle(空閑的)的jedis實例,預設值也是8。
private static final int MAX_IDLE = 200;
//等待可用連接的最大時間,單位毫秒,預設值為-1,表示永不超時。如果超過等待時間,則直接拋出JedisConnectionException;
private static final int MAX_WAIT = 10000;
//在borrow一個jedis實例時,是否提前進行validate操作;如果為true,則得到的jedis實例均是可用的;
private static boolean TEST_ON_BORROW = true;
//Jedis連接池對象
private static JedisPool jedisPool = null;
/**
* 初始化連接池
*/
static {
try {
JedisPoolConfig conf = new JedisPoolConfig();
conf.setMaxActive(MAX_ACTIVE);
conf.setMaxIdle(MAX_IDLE);
conf.setMaxWait(MAX_WAIT);
conf.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(conf, IP_ADDRESS, PORT);
} catch(Exception ex) {
ex.printStackTrace();
}
}
/**
* 獲取Jedis實例
* @return Jedis實例
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 釋放jedis資源
* @param jedis Jedis對象
*/
public static void returnResource(final Jedis jedis) {
if (jedis != null) {
jedisPool.returnResourceObject(jedis);
}
}
}