redis在java中的使用
阿新 • • 發佈:2019-01-28
<dependency>
<groupId>redis.client</groupId>
<artifactId>jedis</artifactId>
<version>2.2.1</version>
</dependency>
jedis是redis在java端的客戶端操作,通過jedis我們可以對redis裡的快取資料進行增刪改查。
java連線linux上redis服務如果報錯:
原因:
1、linux沒有開放redis埠號;
2、reids相關許可權設定;
解決:
linux開發埠的方法:(埠6379)
1、暫時開啟某埠號方法:iptables -I INPUT -p tcp –dport 6379 -j ACCEPT
2、永久開啟某埠方法:
首先,用vim開啟防火牆配置檔案:
vim /etc/sysconfig/iptables
然後,在iptables檔案內容中加入如下內容:
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 6379 -j ACCEPT
最後,儲存配置檔案後,執行如下命令重啟防火牆:
service iptables restart
redis相關許可權配置方法:
在redis-conf檔案中修改配置成如下兩個配置
a、protected-mode no
b、bind localhost 或者 bind 127.0.0.1 註釋掉
jedis基本操作程式碼
package demo.test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class TestRedis {
private Jedis jedis;
// before註解的方法,在執行test註解的方法之前會執行
@Before
public void setup() {
// 連線redis伺服器
jedis = new Jedis("192.168.83.60", 6379);
System.out.println("Connection to server sucessfully");
// 增加一個Key檢測是否連線成功
// jedis.set("foo", "bar");
// String value = jedis.get("foo");
// System.out.println("foo-->"+value);
// 檢視服務是否執行
System.out.println("Server is running: " + jedis.ping());//輸出PONG則連線成功
System.out.println("--------------------------------------------");
}
/**
* jedis儲存字串
*/
@Test
public void testString() {
// -----新增資料----------
jedis.set("name", "xinxin");// 向key-->name中放入了value-->xinxin
System.out.println(jedis.get("name"));// 執行結果:xinxin
jedis.append("name", " is my lover"); // 拼接 。
// 如果用redis命令輸入key對應的值是不能有空格的哦
System.out.println(jedis.get("name"));
jedis.del("name"); // 刪除某個鍵
System.out.println(jedis.get("name"));
// 設定多個鍵值對
jedis.mset("name", "liuling", "age", "23", "qq", "476777XXX");
jedis.incr("age"); // 進行加1操作
System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-"
+ jedis.get("qq"));
jedis.set("china", "這是個中文值");
System.out.println(jedis.get("china"));
}
/**
* jedis操作Map
*
* jedis.hmset("user",map);//該方法將java中的map在redis中存成了hash型別的資料物件
*/
@Test
public void testMap() {
// -----新增資料----------
Map<String, String> map = new HashMap<String, String>();
map.put("name", "xinxin");
map.put("age", "22");
map.put("qq", "123456");
jedis.hmset("user", map);// hmset方法存入後,該user物件在redis裡面是一個hash型別的資料
// 第一個引數是存入redis中map物件的key,後面跟的是放入map中的物件的key,後面的key可以跟多個,是可變引數
List<String> rsmap = jedis.hmget("user", "name", "age", "qq");
System.out.println(rsmap);
// 刪除map中的某個鍵值
jedis.hdel("user", "age");
System.out.println(jedis.hmget("user", "age")); // 因為刪除了,所以返回的是null
System.out.println(jedis.hlen("user")); // 返回key為user的鍵中存放的值的個數2
System.out.println(jedis.exists("user"));// 是否存在key為user的記錄 返回true
System.out.println(jedis.hkeys("user"));// 返回map物件中的所有key
System.out.println(jedis.hvals("user"));// 返回map物件中的所有value
Iterator<String> iter = jedis.hkeys("user").iterator();
while (iter.hasNext()) {
String key = iter.next();
System.out.println(key + ":" + jedis.hmget("user", key));
}
}
/**
* jedis操作List
*
* jedis.lpush("java framework", "spring"):方法建立了名為java
* framework的List集合(如果不存在),並添加了一個元素 該方法儲存的物件在redis裡也為List型別的集合
*/
@Test
public void testList() {
// 刪除該list內容
jedis.del("java framework");
// 取出所有資料,jedis.lrange是按範圍取出,
// 第一個是key,第二個是起始位置,第三個是結束位置,jedis.llen獲取長度 -1表示取得所有
System.out.println("內容:" + jedis.lrange("java framework", 0, -1));
// 先向key java framework中存放三條資料,在key對應list的頭部新增字串元素
jedis.lpush("java framework", "spring");
jedis.lpush("java framework", "struts");
jedis.lpush("java framework", "hibernate");
System.out.println(jedis.lrange("java framework", 0, -1));
jedis.del("java framework");
// 在key對應list的尾部部新增字串元素
jedis.rpush("java framework", "spring");
jedis.rpush("java framework", "struts");
jedis.rpush("java framework", "hibernate");
System.out.println(jedis.lrange("java framework", 0, -1));
}
/**
* jedis操作Set
*
* jedis.sadd("user1", "liuling"):建立一個set集合user1(如果不存在),並新增一個元素liuling
* 該方法儲存的物件在redis裡也為Set集合
*/
@Test
public void testSet() {
// 新增
jedis.sadd("user1", "liuling");
jedis.sadd("user1", "xinxin");
jedis.sadd("user1", "ling");
jedis.sadd("user1", "zhangxinxin");
jedis.sadd("user1", "who");
// 移除noname
jedis.srem("user1", "who");
System.out.println(jedis.smembers("user1"));// 獲取所有加入的value
System.out.println(jedis.sismember("user1", "who"));// 判斷 who
// 是否是user集合的元素
System.out.println(jedis.srandmember("user1"));
System.out.println(jedis.scard("user1"));// 返回集合的元素個數
}
/**
* jedis對key值的操作
*/
@Test
public void testKey() {
Set keys = jedis.keys("*");// 列出所有的key,查詢特定的key如:redis.keys("foo")
Iterator t1 = keys.iterator();
while (t1.hasNext()) {
Object obj1 = t1.next();
System.out.println(obj1);
}
// DEL 移除給定的一個或多個key。如果key不存在,則忽略該命令。
// redis.del("name");
// TTL 返回給定key的剩餘生存時間(time to live)(以秒為單位)
System.out.println(jedis.ttl("name"));
// PERSIST key 移除給定key的生存時間。
jedis.persist("name");
// EXISTS 檢查給定key是否存在。
jedis.exists("name");
// MOVE key db
// 將當前資料庫(預設為0)的key移動到給定的資料庫db當中。如果當前資料庫(源資料庫)和給定資料庫(目標資料庫)有相同名字的給定key,或者key不存在於當前資料庫,那麼MOVE沒有任何效果。
jedis.move("name", 1);// 將name這個key,移動到資料庫1
// RENAME key newkey
// 將key改名為newkey。當key和newkey相同或者key不存在時,返回一個錯誤。當newkey已經存在時,RENAME命令將覆蓋舊值。
jedis.rename("name", "foonew");
// TYPE key 返回key所儲存的值的型別。
System.out.println(jedis.type("name"));// none(key不存在),string(字串),list(列表),set(集合),zset(有序集),hash(雜湊表)
// EXPIRE key seconds 為給定key設定生存時間。當key過期時,它會被自動刪除。
jedis.expire("name", 5);// 5秒過期
}
/**
* 測試Redis連線池
*
* 測試這個方法的時候要把@Befor註釋掉,不執行setup方法
*/
@Test
public void testJedisPool() {
jedis = JedisPoolTest.getJedis();
jedis.set("kunle", "困了就去lol");
System.out.println(jedis.get("kunle"));
// jedis.quit();//關閉連線用方法quit
JedisPoolTest.returnResource(jedis);
jedis.set("kunle2", "aa");
System.out.println(jedis.get("kunle2"));
}
}
這裡面的方法很多,不必強記,這裡的方法名其實和redis裡面對應型別裡各自的命令操作是一樣的。具體參考
jedis連線池程式碼
package demo.test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolTest {
//Redis伺服器IP
private static String ADDR = "127.0.0.1";
//Redis的埠號
private static int PORT = 6379;
//可用連線例項的最大數目,預設值為8;
//如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis例項,則此時pool的狀態為exhausted(耗盡)。
private static int MAX_ACTIVE = 1024;
//控制一個pool最多有多少個狀態為idle(空閒的)的jedis例項,預設值也是8。
private static int MAX_IDLE = 200;
//等待可用連線的最大時間,單位毫秒,預設值為-1,表示永不超時。如果超過等待時間,則直接丟擲JedisConnectionException;
private static int MAX_WAIT = 10000;
//在borrow一個jedis例項時,是否提前進行validate操作;如果為true,則得到的jedis例項均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
private static ThreadLocal<Jedis> jedisThreadLocal = new ThreadLocal<Jedis>();
/**
* 初始化Redis連線池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxActive(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWait(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲取Jedis例項
* @return
*/
public static Jedis getJedis() {
System.out.println("從連線池獲取jedis連線資源");
Jedis jedis = jedisThreadLocal.get();
if(jedis==null){
jedis = jedisPool.getResource();
jedisThreadLocal.set(jedis);
return jedis;
}
return jedis;
}
/**
* 釋放jedis資源
* @param jedis
*/
public static void returnResource(final Jedis jedis) {
System.out.println("jedis連線返回到連線池");
if (jedis != null) {
jedisPool.returnResource(jedis);//該方法僅僅將資源返回到連線池了,但是暫時沒有斷開連線
jedisThreadLocal.set(null);
}
}
}