本文主要介紹使用jedis操作redis,使用到的軟體版本:Java 1.8.0_191、Redis 5.0.8、Jedis 3.3.0,
1、引入依賴
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
2、基本操作
package com.inspur.demo.general.redis; import org.junit.After; import org.junit.Before; import org.junit.Test; import redis.clients.jedis.Jedis; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** * 使用jedis來實作對redis的基本操作 */ public class JedisBaseCase { private Jedis jedis; @Before public void before() { jedis = new Jedis("10.49.196.10"); jedis.auth("123456"); } @After public void after() { jedis.close(); } /***********************************Key begin*****************************/ /** * 清空所有key */ @Test public void flushAll() { String status = jedis.flushAll(); System.out.println(status); } /** * 重命名key */ @Test public void rename() { String status = jedis.rename("name", "name2"); System.out.println(status); } /** * 重命名key,僅當新key不存在時才執行 * 回傳值: * 1:oldKey被重新命名 * 0:newKey已存在 */ @Test public void renamenx() { long status = jedis.renamenx("name", "name3"); System.out.println(status); } /** * 設定key的過期時間,以秒為單位 * 回傳值: * 1:成功設定了過期時間 * 0:key不存在 */ @Test public void expired() { long status = jedis.expire("name", 100); System.out.println(status); } /** * 設定key的過期時間,它是距歷元(即格林威治標準時間1970年1月1日00:00:00)的秒數, * 回傳值: * 1:成功設定了過期時間 * 0:key不存在 */ @Test public void expiredAt() { long status = jedis.expireAt("name", System.currentTimeMillis()/1000 + 100); System.out.println(status); } /** * 查詢key的過期時間,單位秒 * 回傳值: * -1: 表示沒有過期時間 * -2:表示key不存在 * 其他:key的過期時間 */ @Test public void ttl() { long time = jedis.ttl("name"); System.out.println(time); } /** * 持久化key * 回傳值: * 1:成功持久化了 * 0:key不存在 */ @Test public void persist() { long state = jedis.persist("name"); System.out.println(state); } /** * 洗掉key * 回傳值: * 成功洗掉的key的個數 * 0表示key都不存在 */ @Test public void del() { long state = jedis.del("name", "name1"); System.out.println(state); } /***********************************Key end*******************************/ /***********************************String begin***************************/ @Test public void set() { String status = jedis.set("name", "mayun"); System.out.println(status); } /** * 添加有過期時間的記錄 */ @Test public void setex() { String status = jedis.setex("name", 100, "mayun"); System.out.println(status); } /** * 添加一條記錄,僅當給定的key不存在時才插入 * 回傳值: * 1:成功設定了key * 0:可以不存在 */ @Test public void setnx() { long code = jedis.setnx("name", "mayun"); System.out.println(code); } @Test public void mset() { String status = jedis.mset("name", "mayun", "age", "50"); System.out.println(status); } @Test public void get() { String value = jedis.get("name"); System.out.println(value); } @Test public void mget() { List<String> value = https://www.cnblogs.com/wuyongyin/p/jedis.mget("name", "age"); System.out.println(value); } /** * 將key對應的value減去指定的值,只有value可以轉為數字時該方法才可用 * 回傳相減后的值 */ @Test public void decrBy() { long value = https://www.cnblogs.com/wuyongyin/p/jedis.decrBy("salary", 10); System.out.println(value); } /** * 將key對應的value加上指定的值,只有value可以轉為數字時該方法才可用 * 回傳相加后的值 * * <b>可以作為獲取唯一id的方法</b> */ @Test public void incrBy() { long value = https://www.cnblogs.com/wuyongyin/p/jedis.incrBy("salary", 10); System.out.println(value); } /** * 設定Key的值并回傳老的值 */ @Test public void getSet() { String value = jedis.getSet("name", "馬化騰"); System.out.println(value); } /***********************************String end***************************/ /***********************************list begin***************************/ /** * 將一個或多個值插入到串列頭部 * 回傳插入佇列的資料的個數 */ @Test public void lpush() { Long num = jedis.lpush("list", "a", "b", "c"); System.out.println(num); } /** * 將一個或多個值插入到串列尾部 * 回傳插入佇列的資料的個數 */ @Test public void rpush() { Long num = jedis.rpush("list", "a", "b", "c"); System.out.println(num); } /** * 將一個或多個值插入到已存在的串列頭部 * 回傳插入佇列的資料的個數 */ @Test public void lpushx() { Long num = jedis.lpushx("list", "1", "2", "3"); System.out.println(num); } /** * 將一個或多個值插入到已存在的串列尾部 * 回傳插入佇列的資料的個數 */ @Test public void rpushx() { Long num = jedis.rpushx("list", "1", "2", "3"); System.out.println(num); } /** * 回傳串列指定范圍內的資料 */ @Test public void lrange() { List<String> list = jedis.lrange("list", 0, 5); System.out.println(list); } /***********************************list end***************************/ /***********************************hash begin***************************/ /** * 回傳值新增加的field的個數,如果field都已存在則更新并回傳0 */ @Test public void hset() { HashMap<String, String> values = new HashMap<>(); values.put("age", "50"); values.put("sex", "male"); long code = jedis.hset("mayun", values); System.out.println(code); code = jedis.hset("mayun", "address", "杭州"); System.out.println(code); } @Test public void hgetAll() { Map<String, String> value = https://www.cnblogs.com/wuyongyin/p/jedis.hgetAll("mayun"); System.out.println(value); } /** * 將field對應的value加上指定的值,只有value可以轉為數字時該方法才可用 * 回傳增加后的值 */ @Test public void hincrBy() { long value = https://www.cnblogs.com/wuyongyin/p/jedis.hincrBy("mayun", "age", 1); System.out.println(value); } /***********************************hash begin***************************/ /***********************************set begin***************************/ /** * 往set里增加元素 * 成功增加元素的個數,如果都已存在回傳0 */ @Test public void sadd() { long value = https://www.cnblogs.com/wuyongyin/p/jedis.sadd("set", "a", "b"); System.out.println(value); } /** * 移除set中的元素 * 1:成功移除 * 0:元素不存在 */ @Test public void srem() { long value = https://www.cnblogs.com/wuyongyin/p/jedis.srem("set", "a"); System.out.println(value); } /** * 獲取set里的所有元素 */ @Test public void smembers() { Set<String> value = https://www.cnblogs.com/wuyongyin/p/jedis.smembers("set"); System.out.println(value); } /***********************************set begin***************************/ /***********************************sorted set begin***************************/ /** * 往sorted set里增加元素 * 1: 成功增加 * 0: 元素已存在 */ @Test public void zadd() { long value = https://www.cnblogs.com/wuyongyin/p/jedis.zadd("sortedset", 1, "a"); System.out.println(value); value = jedis.zadd("sortedset", 2, "b"); System.out.println(value); } /** * 移除sorted set中的元素 * 1:成功移除 * 0:元素不存在 */ @Test public void zrem() { long value = https://www.cnblogs.com/wuyongyin/p/jedis.zrem("sortedset", "a"); System.out.println(value); } /** * 獲取set里的所有元素 */ @Test public void zrange() { Set<String> value = https://www.cnblogs.com/wuyongyin/p/jedis.zrange("sortedkey", 0, 5); System.out.println(value); } /***********************************sorted set end***************************/ /***********************************hyper begin***************************/ /** * 添加指定元素到HyperLogLog中 * 回傳成功天的個數,如果元素都已存在則回傳0 */ @Test public void pfadd() { long code = jedis.pfadd("hyper", "a", "b", "d"); System.out.println(code); } /** * 回傳給定HyperLogLog的基數估算值 */ @Test public void pfcount() { long value = https://www.cnblogs.com/wuyongyin/p/jedis.pfcount("hyper"); System.out.println(value); } /***********************************hyper end***************************/ }
3、高級操作
package com.inspur.demo.general.redis; import org.junit.Before; import org.junit.Test; import redis.clients.jedis.*; import java.util.HashMap; import java.util.HashSet; import java.util.Set; /** * 高級操作 */ public class JedisAdvancedCase { private JedisPoolConfig config; @Before public void before() { config = new JedisPoolConfig(); config.setMaxWaitMillis(1000 * 30);//當連接池內的連接耗盡時,最大的等待時間 config.setMaxTotal(20);//資源池的最大連接數 config.setMaxIdle(10);//資源池的最大空閑連接數 config.setMinIdle(5);//資源池的最小空閑連接數 config.setTestOnBorrow(true);//獲取連接實體時,是否進行測驗,默認false config.setTestWhileIdle(true);//是否開啟空閑資源檢測, 默認false config.setTimeBetweenEvictionRunsMillis(1000 * 10);//空閑資源的檢測周期 } /** * 管道操作,可以挺高性能 */ @Test public void pipelined() { Jedis jedis = new Jedis("10.49.196.10"); jedis.auth("123456"); Pipeline pipeline = jedis.pipelined(); for (int i = 0; i < 100; i++) { pipeline.set("key" + i, i + ""); } pipeline.sync(); pipeline.close(); jedis.close(); } /** * 連接池操作 */ @Test public void jedisPool() { JedisPool pool = new JedisPool(config, "10.49.196.10", 6379, 1000 * 10, "123456"); //獲取Jedis實列 Jedis jedis = pool.getResource(); System.out.println(jedis.get("name")); jedis.close(); pool.close(); } /** * 哨兵模式 */ @Test public void jedisSentinelPool() { Set<String> sentinels = new HashSet<>(); sentinels.add("10.49.196.20:26379"); sentinels.add("10.49.196.21:26379"); sentinels.add("10.49.196.22:26379"); JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels, config, 1000 * 5, "123456"); //獲取Jedis實列 Jedis jedis = pool.getResource(); System.out.println(jedis.get("name")); jedis.close(); pool.close(); } /** * 集群模式 */ @Test public void jedisCluster() { Set<HostAndPort> set = new HashSet<HostAndPort>(); set.add(new HostAndPort("10.49.196.20", 7000)); set.add(new HostAndPort("10.49.196.20", 7001)); set.add(new HostAndPort("10.49.196.21", 7000)); set.add(new HostAndPort("10.49.196.21", 7001)); set.add(new HostAndPort("10.49.196.22", 7000)); set.add(new HostAndPort("10.49.196.22", 7001)); JedisCluster cluster = new JedisCluster(set, 1000 * 5, 1000 * 5, 5, "123456", config); //JedisCluster的基礎操作和Jedis很類似 //key System.out.println("判斷key是否存在:" + cluster.exists("name")); System.out.println("查詢key的過期時間:" + cluster.ttl("name")); //String System.out.println("設定鍵值對:" + cluster.set("name", "mahuateng")); System.out.println("獲取key對應的值:" + cluster.get("name")); //List System.out.println("將一個或多個值插入到串列頭部:" + cluster.lpush("list", "a", "b", "c")); System.out.println("回傳串列指定范圍內的資料:" + cluster.lrange("list", 0, 5)); //Hash HashMap<String, String> values = new HashMap<>(); values.put("age", "50"); values.put("sex", "male"); System.out.println("在hash中設定field及value:" + cluster.hset("mayun", values)); System.out.println("在hash中所有屬性及值:" + cluster.hgetAll("mayun")); //set System.out.println("往set里增加元素:" + cluster.sadd("set", "a", "b")); System.out.println("取set里的所有元素:" + cluster.smembers("set")); //sorted set System.out.println("往sorted set里增加元素1:" + cluster.zadd("sortedset", 1, "a")); System.out.println("往sorted set里增加元素2:" + cluster.zadd("sortedset", 2, "b")); System.out.println("獲取sorted set里的所有元素:" + cluster.zrange("sortedset",0, 5)); //集群資訊 System.out.println("集群節點資訊:" + cluster.getClusterNodes()); cluster.close(); } }
4、JedisPoolConfig引數說明
JedisPoolConfig用來設定連接池的相關屬性,具體引數如下:
| 引數名稱 | 說明 | 默認值 | 建議 |
| maxTotal | 資源池中的最大連接數 | 8 | |
| maxIdle | 資源池中的最大空閑連接數 | 8 | |
| minIdle | 資源池中的最少空閑連接數 | 0 | |
| blockWhenExhausted | 當資源池用盡后,呼叫者是否要等待,只有當值為true時,下面的maxWaitMillis才會生效, | true | 建議使用默認值 |
| maxWaitMillis | 當資源池連接用盡后,呼叫者的最大等待時間(單位為毫秒), | -1(表示永不超時) | 不建議使用默認值 |
| testOnBorrow | 向資源池借用連接時是否做連接有效性檢測(ping),檢測到的無效連接將會被移除, | false | 業務量很大時候建議設定為false,減少一次ping的開銷, |
| testOnReturn | 向資源池歸還連接時是否做連接有效性檢測(ping),檢測到無效連接將會被移除, | false | 業務量很大時候建議設定為false,減少一次ping的開銷, |
| jmxEnabled | 是否開啟JMX監控 | true | 建議開啟,注意應用本身也需要開啟, |
| testWhileIdle | 是否開啟空閑資源檢測 | false | 建議開啟 |
| timeBetweenEvictionRunsMillis | 空閑資源的檢測周期(單位為毫秒) | -1(不檢測) | 建議設定 |
| minEvictableIdleTimeMillis | 資源池中資源的最小空閑時間(單位為毫秒),達到此值后空閑資源將被移除, | 1800000(即30分鐘) | 可根據自身業務決定,一般默認值即可 |
| numTestsPerEvictionRun | 做空閑資源檢測時,每次檢測資源的個數, | 3 | 可根據自身應用連接數進行微調,如果設定為 -1,就是對所有連接做空閑監測, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/160512.html
標籤:Java
上一篇:java集合筆記
下一篇:XML--簡介和基本用法
