1. 程式人生 > >Jedis常用方法

Jedis常用方法

轉載:原文地址

一、Redis Client介紹
1.1、簡介

Jedis Client是Redis官網推薦的一個面向java客戶端,庫檔案實現了對各類API進行封裝呼叫。

Jedis原始碼工程地址:https://github.com/xetorthio/jedis

1.2、使用

Redis Client最好選用與服務端對應的版本,本例中使用Redis 2.8.19客戶端使用jedis -2.6.3,Maven工程新增如下引用即可。

     <groupId>redis.clients</groupId>

     <artifactId>jedis</artifactId>

     <version>2.6.3</version>

     <type>jar</type>

     <scope>compile</scope>

1.3、注意事項

Redis Client擁有眾多對接版本,本專案目前使用Jedis為官方推薦Java對接客戶端,是基於其對Redis良好的版本支援和API對接,另外編碼中儘量避免使用廢棄介面。

Redis目前正在新版過渡期,3.0版本暫未穩定,但是由於3.0版本提供了最新的叢集功能,可能在日後穩定版釋出以後升級到3.0,目前使用的Jedis支援3.0的目前版本API。

二、Redis Client常用API
2.1、環境要求

語言:Java

JDK:1.7

Redis : 2.8.19(穩定版)

2.2、系統使用

2.2.1、建立連線

普通連線
Jedis jedis = new Jedis(“localhost”);

   jedis.set("foo", "bar");

   String value = jedis.get("foo");

   System.out.println(value);

設定連線池配置
該方法用於得到redis連線池連線使用的連線池配置,該連線池配置也可以通過spring注入的方式來進行相對應的配置,連線池採用的是平時比較常用的org.apache.commons.pool2.impl.GenericObjectPoolConfig來進行的連線池管理

配置檔案如下

#redis伺服器ip #

redis.ip=172.30.5.117 



#redis伺服器埠號# 

redis.port=6379 

 

###jedis##pool##config### 

#jedis的最大分配物件# 

jedis.pool.maxActive=1024 



#jedis最大儲存idel狀態物件數 # 

jedis.pool.maxIdle=200 



#jedis池沒有物件返回時,最大等待時間 # 

jedis.pool.maxWait=1000 



#jedis呼叫borrowObject方法時,是否進行有效檢查# 

jedis.pool.testOnBorrow=true 



#jedis呼叫returnObject方法時,是否進行有效檢查 # 

jedis.pool.testOnReturn=true

連線池配置例項化程式碼(也可通過spring注入進行配置):

/**

* 獲取化連線池配置

* @return JedisPoolConfig

* */

private JedisPoolConfig getPoolConfig(){

  if(config == null){

     config = new JedisPoolConfig();

     //最大連線數

config.setMaxTotal(Integer.valueOf(getResourceBundle().getString(“redis.pool.maxTotal”)));

     //最大空閒連線數

config.setMaxIdle(Integer.valueOf(getResourceBundle().getString(“redis.pool.maxIdle”)));

     //獲取連線時的最大等待毫秒數(如果設定為阻塞時BlockWhenExhausted),如果超時就拋異常, 小於零:阻塞不確定的時間,  預設-1

config.setMaxWaitMillis(Long.valueOf(getResourceBundle().getString(“redis.pool.maxWaitMillis”)));

     //在獲取連線的時候檢查有效性, 預設false

config.setTestOnBorrow(Boolean.valueOf(getResourceBundle().getString(“redis.pool.testOnBorrow”)));

     //在獲取返回結果的時候檢查有效性, 預設false

config.setTestOnReturn(Boolean.valueOf(getResourceBundle().getString(“redis.pool.testOnReturn”)));

  }

  return config;

}

普通連線池連線
這裡展示的是普通的連線池方式連結redis的方案,跟普通的資料庫連線池的操作方式類似;

/**

    * 初始化JedisPool

    * */

private void initJedisPool(){

  if(pool == null){

     //獲取伺服器IP地址

     String ipStr = getResourceBundle().getString("redis.ip");

     //獲取伺服器埠

     int portStr = Integer.valueOf(getResourceBundle()

.getString(“redis.port”));

     //初始化連線池

     pool = new JedisPool(getPoolConfig(), ipStr,portStr);

  }

}

Sentinel連線池連線
該連線池用於應對Redis的Sentinel的主從切換機制,能夠正確在伺服器宕機導致伺服器切換時得到正確的伺服器連線,當伺服器採用該部署策略的時候推薦使用該連線池進行操作;

private void initJedisSentinelPool(){

  if(sentinelpool == null){

     //監聽器列表

     Set<String> sentinels = new HashSet<String>();

     //監聽器1

     sentinels.add(new HostAndPort("192.168.50.236",

26379).toString());

     //監聽器2

     sentinels.add(new HostAndPort("192.168.50.237",

26379).toString());

//實際使用的時候在properties裡配置即可:redis.sentinel.hostandports

=192.168.50.236:26379,192.168.50.237:26379

getResourceBundle().getString(“redis.sentinel.hostandports”)

//mastername是伺服器上的master的名字,在master伺服器的sentinel.conf中配置:

                 //[sentinel monitor server-1M  192.168.50.236 6379 2]

                 //中間的server-1M即為這裡的masterName

     String masterName = getResourceBundle()

.getString(“redis.sentinel.masterName”);

     //初始化連線池

     sentinelpool = new JedisSentinelPool(masterName,

sentinels, getPoolConfig());

  }

}

ShardedJedisPool連線池分片連線
/**

    * 初始化ShardedJedisPool

    * Redis在容災處理方面可以通過伺服器端配置Master-Slave模式來實現。

    * 而在分散式叢集方面目前只能通過客戶端工具來實現一致性雜湊分佈儲存,即key分片儲存。

    * Redis可能會在3.0版本支援伺服器端的分佈儲存

    * */

private void initShardedJedisPool() {

  if (shardPool == null) {

     // 建立多個redis共享服務

     String redis1Ip = getResourceBundle().getString("redis1.ip");

     int redis1Port = Integer.valueOf(bundle.getString("redis.port"));

     JedisShardInfo jedisShardInfo1 = new JedisShardInfo(redis1Ip, redis1Port);

     String redis2Ip = getResourceBundle().getString("redis2.ip");

     int redis2Port = Integer.valueOf(bundle.getString("redis.port"));

     JedisShardInfo jedisShardInfo2 = new JedisShardInfo(redis2Ip, redis2Port);



     List<JedisShardInfo> serverlist = new LinkedList<JedisShardInfo>();

     serverlist.add(jedisShardInfo1);

     serverlist.add(jedisShardInfo2);

     // 初始化連線池

     shardPool = new ShardedJedisPool(getPoolConfig(),serverlist);

  }

}

讀寫刪除操作
// 從池中獲取一個Jedis物件

  Jedis jedis = sentinelpool.getSentinelpoolResource();

  String keys = "name";

// 刪除key-value物件,如果key不存在則忽略此操作

  jedis.del(keys);

// 存資料

  jedis.set(keys, "snowolf");

// 判斷key是否存在,不存在返回false存在返回true

  jedis.exists(keys);

// 取資料

  String value = jedis.get(keys);

// 釋放物件池(3.0將拋棄該方法)

  sentinelpool.returnSentinelpoolResource(jedis);

三、示例程式碼

  1. String的簡單追加
    

// 從池中獲取一個Jedis物件

JedisUtil.getInstance().STRINGS.append(key, value);

  1. 價格時間排序(前提是已經儲存了價格,時間的SortSet)
    

//執行2級排序操作()

String stPriceSet = “stPriceSet”;//stPriceSet價格的sortset列表名

String stTimeSet = “stTimeSet”; // stTimeSet時間的sortset列表名

Set sumSet = JedisUtilEx.getInstance()

.getSortSetByPirceUpAndTimeDown(stPriceSet, stTimeSet);

//排序以後可以重複獲取上次排序結果(快取時間10分鐘)

Set sumSet = JedisUtilEx.getInstance()

getLastPirceUpAndTimeDownSet();

  1. 價格時間排序(前提是已經儲存了價格,時間的SortSet)
    //執行2級排序操作

String stPriceSet = “stPriceSet”;//stPriceSet價格的sortset列表名

String stTimeSet = “stTimeSet”; // stTimeSet時間的sortset列表名

Set sumSet = JedisUtilEx.getInstance()

. getSortSetByPirceDownAndTimeDown (stPriceSet, stTimeSet);

//排序以後可以重複獲取上次排序結果(快取時間10分鐘)

Set sumSet = JedisUtilEx.getInstance()

getLastPirceDownAndTimeDownSet ();

  1. 儲存JavaBean到hash表中
    

// bean繼承至RedisBean

JedisUtilEx.getInstance().setBeanToHash(bean);

  1. 從hash表中讀取JavaBean
    

//uuid為業務制定的唯一識別符號規則(相當於主鍵)

String uuid = “1”; //該ID是我們提前就知道的

//T繼承至RedisBean;

JedisUtilEx.getInstance().getBeanFromHash (uuid,Class cls);

  1. 將JavaBean列表裝入hash中
    

//list中的bean繼承至RedisBean

List beanList = …;

JedisUtilEx.getInstance().setBeanListToHash(beanList);

//非同步版本的儲存列表到hash

JedisUtilEx.getInstance().setBeanListToHashSyn(beanList);

  1. 普通的操作流程示例
    

//獲取jedis引用

Jedis jedis = JedisUtil.getInstance().getJedis();

//執行業務以及呼叫jedis提供的介面功能

jedis.hset(…);

//執行完成以後務必釋放資源

JedisUtil.getInstance().returnJedis(jedis);

//若以後不會使用JEDIS,需要關閉所有連結池

RedisConnetcion.destroyAllPools();

  1. 事務執行流程
    

//獲取連線資源

Jedis jd = JedisUtil.getInstance().getJedis();

//開啟事務

Transaction ts = jd.multi();

//執行業務以及呼叫jedis提供的介面功能

jedis.hset(…);

//執行事務

List list = ts.exec();

//釋放資源

JedisUtil.getInstance().returnJedis(jd);

  1. 非同步執行
    

//獲取連線資源

Jedis jedis = JedisUtil.getInstance().getJedis();

//獲取管道

Pipeline pipeline = jedis.pipelined();

//執行業務以及呼叫jedis提供的介面功能

jedis.hset(…);

//提交併釋放管道

pipeline.syncAndReturnAll();

//釋放資源

JedisUtil.getInstance().returnJedis(jedis);

  1. 如何獲取Jedis命名規則的合成KEY
    //獲取類的唯一鍵值key,例如:User:1(User為class,1為uuid)其中user繼承於Reidsbean

JedisUtilEx.getInstance().getBeanKey(user);

//另一種獲取類的唯一鍵值key的方法

JedisUtilEx.getInstance().getBeanKey(String uuid,Class cls);

//獲取bean對應的KEY(對應列的唯一鍵值key)

JedisUtilEx.getInstance().getBeanKey(String uuid,Class cls,String… fileds);

//獲取bean對應的KEY(叢集key)

JedisUtilEx.getInstance().getBeanKey(Class cls,String… fileds);

四、jedis操作命令:
1.對value操作的命令

 exists(key):確認一個key是否存在

 del(key):刪除一個key

 type(key):返回值的型別

 keys(pattern):返回滿足給定pattern的所有key

 randomkey:隨機返回key空間的一個key

 rename(oldname, newname):將key由oldname重新命名為newname,若newname存在則刪除newname表示的key

 dbsize:返回當前資料庫中key的數目

 expire:設定一個key的活動時間(s)

 ttl:獲得一個key的活動時間

 select(index):按索引查詢

 move(key, dbindex):將當前資料庫中的key轉移到有dbindex索引的資料庫

 flushdb:刪除當前選擇資料庫中的所有key

 flushall:刪除所有資料庫中的所有key

2.對String操作的命令

 set(key, value):給資料庫中名稱為key的string賦予值value

 get(key):返回資料庫中名稱為key的string的value

 getset(key, value):給名稱為key的string賦予上一次的value

 mget(key1, key2,…, key N):返回庫中多個string(它們的名稱為key1,key2…)的value

 setnx(key, value):如果不存在名稱為key的string,則向庫中新增string,名稱為key,值為value

 setex(key, time, value):向庫中新增string(名稱為key,值為value)同時,設定過期時間time

 mset(key1, value1, key2, value2,…key N, value N):同時給多個string賦值,名稱為key i的string賦值value i

 msetnx(key1, value1, key2, value2,…key N, value N):如果所有名稱為key i的string都不存在,則向庫中新增string,名稱key i賦值為value i

 incr(key):名稱為key的string增1操作

 incrby(key, integer):名稱為key的string增加integer

 decr(key):名稱為key的string減1操作

 decrby(key, integer):名稱為key的string減少integer

 append(key, value):名稱為key的string的值附加value

 substr(key, start, end):返回名稱為key的string的value的子串

3.對List操作的命令

 rpush(key, value):在名稱為key的list尾新增一個值為value的元素

 lpush(key, value):在名稱為key的list頭新增一個值為value的 元素

 llen(key):返回名稱為key的list的長度

 lrange(key, start, end):返回名稱為key的list中start至end之間的元素(下標從0開始,下同)

 ltrim(key, start, end):擷取名稱為key的list,保留start至end之間的元素

 lindex(key, index):返回名稱為key的list中index位置的元素

 lset(key, index, value):給名稱為key的list中index位置的元素賦值為value

 lrem(key, count, value):刪除count個名稱為key的list中值為value的元素。count為0,刪除所有值為value的元素,count>0      從頭至尾刪除count個值為value的元素,count<0從尾到頭刪除|count|個值為value的元素。

 lpop(key):返回並刪除名稱為key的list中的首元素

 rpop(key):返回並刪除名稱為key的list中的尾元素

 blpop(key1, key2,… key N, timeout):lpop 命令的block版本。即當timeout為0時,若遇到名稱為key i的list不存在或該list為空,則命令結束。如果 timeout>0,則遇到上述情況時,等待timeout秒,如果問題沒有解決,則對key i+1開始的list執行pop操作。

 brpop(key1, key2,… key N, timeout):rpop的block版本。參考上一命令。

 rpoplpush(srckey, dstkey):返回並刪除名稱為srckey的list的尾元素,並將該元素新增到名稱為dstkey的list的頭部

4.對Set操作的命令

 sadd(key, member):向名稱為key的set中新增元素member

 srem(key, member) :刪除名稱為key的set中的元素member

 spop(key) :隨機返回並刪除名稱為key的set中一個元素

 smove(srckey, dstkey, member) :將member元素從名稱為srckey的集合移到名稱為dstkey的集合

 scard(key) :返回名稱為key的set的基數

 sismember(key, member) :測試member是否是名稱為key的set的元素

 sinter(key1, key2,…key N) :求交集

 sinterstore(dstkey, key1, key2,…key N) :求交集並將交集儲存到dstkey的集合

 sunion(key1, key2,…key N) :求並集

 sunionstore(dstkey, key1, key2,…key N) :求並集並將並集儲存到dstkey的集合

 sdiff(key1, key2,…key N) :求差集

 sdiffstore(dstkey, key1, key2,…key N) :求差集並將差集儲存到dstkey的集合

 smembers(key) :返回名稱為key的set的所有元素

 srandmember(key) :隨機返回名稱為key的set的一個元素

5.對zset(sorted set)操作的命令

 zadd(key, score, member):向名稱為key的zset中新增元素member,score用於排序。如果該元素已經存在,則根據score更新該元素的順序。

 zrem(key, member) :刪除名稱為key的zset中的元素member

 zincrby(key, increment, member) :如果在名稱為key的zset中已經存在元素member,則該元素的score增加increment;否則向集合中新增該元素,其score的值為increment

 zrank(key, member) :返回名稱為key的zset(元素已按score從小到大排序)中member元素的rank(即index,從0開始),若沒有member元素,返回“nil”

 zrevrank(key, member) :返回名稱為key的zset(元素已按score從大到小排序)中member元素的rank(即index,從0開始),若沒有member元素,返回“nil”

 zrange(key, start, end):返回名稱為key的zset(元素已按score從小到大排序)中的index從start到end的所有元素

 zrevrange(key, start, end):返回名稱為key的zset(元素已按score從大到小排序)中的index從start到end的所有元素

 zrangebyscore(key, min, max):返回名稱為key的zset中score >= min且score <= max的所有元素

 zcard(key):返回名稱為key的zset的基數

 zscore(key, element):返回名稱為key的zset中元素element的score

 zremrangebyrank(key, min, max):刪除名稱為key的zset中rank >= min且rank <= max的所有元素

 zremrangebyscore(key, min, max) :刪除名稱為key的zset中score >= min且score <= max的所有元素

 zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):對N個zset求並集和交集,並將最後的集合儲存在dstkeyN中。對於集合中每一個元素的score,在進行AGGREGATE運算前,都要乘以對於的WEIGHT引數。如果沒有提供WEIGHT,預設為1。預設的AGGREGATE是SUM,即結果集合中元素的score是所有集合對應元素進行 SUM運算的值,而MIN和MAX是指,結果集合中元素的score是所有集合對應元素中最小值和最大值。

6.對Hash操作的命令

 hset(key, field, value):向名稱為key的hash中新增元素field<—>value

 hget(key, field):返回名稱為key的hash中field對應的value

 hmget(key, field1, …,field N):返回名稱為key的hash中field i對應的value

 hmset(key, field1, value1,…,field N, value N):向名稱為key的hash中新增元素field i<—>value i

 hincrby(key, field, integer):將名稱為key的hash中field的value增加integer

 hexists(key, field):名稱為key的hash中是否存在鍵為field的域

 hdel(key, field):刪除名稱為key的hash中鍵為field的域

 hlen(key):返回名稱為key的hash中元素個數

 hkeys(key):返回名稱為key的hash中所有鍵

 hvals(key):返回名稱為key的hash中所有鍵對應的value

 hgetall(key):返回名稱為key的hash中所有的鍵(field)及其對應的value

五、Redis命名規則
由於Redis所有資料為鍵值對,即所有資料均只能通過鍵值(Key)來進行管理,故需

要規範命名規則,jedis客戶端包裝了有專門的命名規則生產函式,呼叫即可!程式碼參考例項程式碼: