jedis常用API
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一、Redis Client介紹
1.1、簡(jiǎn)介
Jedis Client是Redis官網(wǎng)推薦的一個(gè)面向java客戶端,庫(kù)文件實(shí)現(xiàn)了對(duì)各類API進(jìn)行封裝調(diào)用。
Jedis源碼工程地址:https://github.com/xetorthio/jedis
1.2、使用
Redis Client最好選用與服務(wù)端對(duì)應(yīng)的版本,本例中使用Redis 2.8.19客戶端使用jedis -2.6.3,Maven工程添加如下引用即可。
?? <dependency>
???????? <groupId>redis.clients</groupId>
???????? <artifactId>jedis</artifactId>
???????? <version>2.6.3</version>
???????? <type>jar</type>
???????? <scope>compile</scope>
?? </dependency>
1.3、注意事項(xiàng)
Redis Client擁有眾多對(duì)接版本,本項(xiàng)目目前使用Jedis為官方推薦Java對(duì)接客戶端,是基于其對(duì)Redis良好的版本支持和API對(duì)接,另外編碼中盡量避免使用廢棄接口。
Redis目前正在新版過(guò)渡期,3.0版本暫未穩(wěn)定,但是由于3.0版本提供了最新的集群功能,可能在日后穩(wěn)定版發(fā)布以后升級(jí)到3.0,目前使用的Jedis支持3.0的目前版本API。
二、Redis Client常用API
2.1、環(huán)境要求
語(yǔ)言:Java
JDK:1.7
Redis : 2.8.19(穩(wěn)定版)
2.2、系統(tǒng)使用
2.2.1、建立連接
- 普通連接
Jedis?jedis?=?new?Jedis("localhost");
??? ?? jedis.set("foo", "bar");
??? ?? String value = jedis.get("foo");
??? ?? System.out.println(value);
- 設(shè)置連接池配置
該方法用于得到redis連接池連接使用的連接池配置,該連接池配置也可以通過(guò)spring注入的方式來(lái)進(jìn)行相對(duì)應(yīng)的配置,連接池采用的是平時(shí)比較常用的org.apache.commons.pool2.impl.GenericObjectPoolConfig來(lái)進(jìn)行的連接池管理
配置文件如下
#redis服務(wù)器ip #???
????redis.ip=172.30.5.117?
???
????#redis服務(wù)器端口號(hào)#?
????redis.port=6379?
?????
????###jedis##pool##config###?
????#jedis的最大分配對(duì)象#?
????jedis.pool.maxActive=1024?
???
????#jedis最大保存idel狀態(tài)對(duì)象數(shù)?#?
????jedis.pool.maxIdle=200?
???
????#jedis池沒(méi)有對(duì)象返回時(shí),最大等待時(shí)間?#?
????jedis.pool.maxWait=1000?
???
????#jedis調(diào)用borrowObject方法時(shí),是否進(jìn)行有效檢查#?
????jedis.pool.testOnBorrow=true?
???
????#jedis調(diào)用returnObject方法時(shí),是否進(jìn)行有效檢查?#?
????jedis.pool.testOnReturn=true
連接池配置實(shí)例化代碼(也可通過(guò)spring注入進(jìn)行配置):
?? /**
?? ?* 獲取化連接池配置
?? ?*?@return?JedisPoolConfig
?? ?* */
???private?JedisPoolConfig getPoolConfig(){
??????if(config?==?null){
?????????config?=?new?JedisPoolConfig();
???????? //最大連接數(shù)
config.setMaxTotal(Integer.valueOf(getResourceBundle().getString("redis.pool.maxTotal")));
???????? //最大空閑連接數(shù)
config.setMaxIdle(Integer.valueOf(getResourceBundle().getString("redis.pool.maxIdle")));
???????? //獲取連接時(shí)的最大等待毫秒數(shù)(如果設(shè)置為阻塞時(shí)BlockWhenExhausted),如果超時(shí)就拋異常, 小于零:阻塞不確定的時(shí)間,? 默認(rèn)-1
config.setMaxWaitMillis(Long.valueOf(getResourceBundle().getString("redis.pool.maxWaitMillis")));
???????? //在獲取連接的時(shí)候檢查有效性, 默認(rèn)false
config.setTestOnBorrow(Boolean.valueOf(getResourceBundle().getString("redis.pool.testOnBorrow")));
???????? //在獲取返回結(jié)果的時(shí)候檢查有效性, 默認(rèn)false
config.setTestOnReturn(Boolean.valueOf(getResourceBundle().getString("redis.pool.testOnReturn")));
????? }
??????return?config;
?? }
- 普通連接池連接
? 這里展示的是普通的連接池方式鏈接redis的方案,跟普通的數(shù)據(jù)庫(kù)連接池的操作方式類似;
/**
?????? ?* 初始化JedisPool
?????? ?* */
???private?void?initJedisPool(){
??????if(pool?==?null){
???????? //獲取服務(wù)器IP地址
???????? String ipStr = getResourceBundle().getString("redis.ip");
???????? //獲取服務(wù)器端口
?????????int?portStr = Integer.valueOf(getResourceBundle()
.getString("redis.port"));
???????? //初始化連接池
?????????pool?=?new?JedisPool(getPoolConfig(), ipStr,portStr);
????? }
?? }?
- Sentinel連接池連接
該連接池用于應(yīng)對(duì)Redis的Sentinel的主從切換機(jī)制,能夠正確在服務(wù)器宕機(jī)導(dǎo)致服務(wù)器切換時(shí)得到正確的服務(wù)器連接,當(dāng)服務(wù)器采用該部署策略的時(shí)候推薦使用該連接池進(jìn)行操作;
???private?void?initJedisSentinelPool(){
??????if(sentinelpool?==?null){
???????? //監(jiān)聽器列表
???????? Set<String> sentinels =?new?HashSet<String>();
???????? //監(jiān)聽器1
???????? sentinels.add(new?HostAndPort("192.168.50.236",
26379).toString());
???????? //監(jiān)聽器2
???????? sentinels.add(new?HostAndPort("192.168.50.237",
26379).toString());
//實(shí)際使用的時(shí)候在properties里配置即可:redis.sentinel.hostandports
=192.168.50.236:26379,192.168.50.237:26379
getResourceBundle().getString("redis.sentinel.hostandports")
//mastername是服務(wù)器上的master的名字,在master服務(wù)器的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在容災(zāi)處理方面可以通過(guò)服務(wù)器端配置Master-Slave模式來(lái)實(shí)現(xiàn)。
?????? ?* 而在分布式集群方面目前只能通過(guò)客戶端工具來(lái)實(shí)現(xiàn)一致性哈希分布存儲(chǔ),即key分片存儲(chǔ)。
?????? ?*?Redis可能會(huì)在3.0版本支持服務(wù)器端的分布存儲(chǔ)
?????? ?* */
???private?void?initShardedJedisPool() {
??????if?(shardPool?==?null) {
???????? // 創(chuàng)建多個(gè)redis共享服務(wù)
???????? 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);
????? }
?? }
- 讀寫刪除操作
// 從池中獲取一個(gè)Jedis對(duì)象
????? Jedis jedis =?sentinelpool.getSentinelpoolResource();
????? String keys = "name";
?? // 刪除key-value對(duì)象,如果key不存在則忽略此操作
????? jedis.del(keys);
?? // 存數(shù)據(jù)
????? jedis.set(keys, "snowolf");
//?判斷key是否存在,不存在返回false存在返回true
??????jedis.exists(keys);
?? // 取數(shù)據(jù)
????? String value = jedis.get(keys);
?? // 釋放對(duì)象池(3.0將拋棄該方法)
??????sentinelpool.returnSentinelpoolResource(jedis);
三、示例代碼
// 從池中獲取一個(gè)Jedis對(duì)象
?? JedisUtil.getInstance().STRINGS.append(key, value);
//執(zhí)行2級(jí)排序操作()
String stPriceSet = “stPriceSet”;//stPriceSet價(jià)格的sortset列表名
String stTimeSet = “stTimeSet”; // stTimeSet時(shí)間的sortset列表名
?? Set<Tuple> sumSet = JedisUtilEx.getInstance()
.getSortSetByPirceUpAndTimeDown(stPriceSet, stTimeSet);
//排序以后可以重復(fù)獲取上次排序結(jié)果(緩存時(shí)間10分鐘)
Set<Tuple> sumSet = JedisUtilEx.getInstance()
getLastPirceUpAndTimeDownSet();
//執(zhí)行2級(jí)排序操作
String stPriceSet = “stPriceSet”;//stPriceSet價(jià)格的sortset列表名
String stTimeSet = “stTimeSet”; // stTimeSet時(shí)間的sortset列表名
?? Set<Tuple> sumSet = JedisUtilEx.getInstance()
. getSortSetByPirceDownAndTimeDown (stPriceSet, stTimeSet);
?? //排序以后可以重復(fù)獲取上次排序結(jié)果(緩存時(shí)間10分鐘)
Set<Tuple> sumSet = JedisUtilEx.getInstance()
getLastPirceDownAndTimeDownSet ();
// bean繼承至RedisBean
JedisUtilEx.getInstance().setBeanToHash(bean);
//uuid為業(yè)務(wù)制定的唯一標(biāo)識(shí)符規(guī)則(相當(dāng)于主鍵)
String uuid = “1”; //該ID是我們提前就知道的
//T繼承至RedisBean;
JedisUtilEx.getInstance().getBeanFromHash (uuid,Class<T> cls);
//list中的bean繼承至RedisBean
List<T> beanList = …;
JedisUtilEx.getInstance().setBeanListToHash(beanList);
//異步版本的存儲(chǔ)列表到hash
JedisUtilEx.getInstance().setBeanListToHashSyn(beanList);
//獲取jedis引用
Jedis jedis = JedisUtil.getInstance().getJedis();
//執(zhí)行業(yè)務(wù)以及調(diào)用jedis提供的接口功能
…
jedis.hset(…);
…
//執(zhí)行完成以后務(wù)必釋放資源
JedisUtil.getInstance().returnJedis(jedis);
//若以后不會(huì)使用JEDIS,需要關(guān)閉所有鏈接池
?? RedisConnetcion.destroyAllPools();
//獲取連接資源
?? Jedis jd = JedisUtil.getInstance().getJedis();
//開啟事務(wù)
Transaction ts = jd.multi();
//執(zhí)行業(yè)務(wù)以及調(diào)用jedis提供的接口功能
…
jedis.hset(…);
…
//執(zhí)行事務(wù)
?? List<Object> list = ts.exec();
//釋放資源
JedisUtil.getInstance().returnJedis(jd);
//獲取連接資源
?? Jedis jedis = JedisUtil.getInstance().getJedis();
?? //獲取管道
Pipeline pipeline = jedis.pipelined();
//執(zhí)行業(yè)務(wù)以及調(diào)用jedis提供的接口功能
…
jedis.hset(…);
…
//提交并釋放管道
pipeline.syncAndReturnAll();
//釋放資源
JedisUtil.getInstance().returnJedis(jedis);
//獲取類的唯一鍵值key,例如:User:1(User為class,1為uuid)其中user繼承于Reidsbean
JedisUtilEx.getInstance().getBeanKey(user);
//另一種獲取類的唯一鍵值key的方法
JedisUtilEx.getInstance().getBeanKey(String uuid,Class<T> cls);
//獲取bean對(duì)應(yīng)的KEY(對(duì)應(yīng)列的唯一鍵值key)
JedisUtilEx.getInstance().getBeanKey(String uuid,Class<T> cls,String... fileds);
//獲取bean對(duì)應(yīng)的KEY(集群key)
JedisUtilEx.getInstance().getBeanKey(Class<T> cls,String... fileds);
四、jedis操作命令:
1.對(duì)value操作的命令
?????exists(key):確認(rèn)一個(gè)key是否存在
?????del(key):刪除一個(gè)key
?????type(key):返回值的類型
?????keys(pattern):返回滿足給定pattern的所有key
?????randomkey:隨機(jī)返回key空間的一個(gè)key
?????rename(oldname,?newname):將key由oldname重命名為newname,若newname存在則刪除newname表示的key
?????dbsize:返回當(dāng)前數(shù)據(jù)庫(kù)中key的數(shù)目
?????expire:設(shè)定一個(gè)key的活動(dòng)時(shí)間(s)
?????ttl:獲得一個(gè)key的活動(dòng)時(shí)間
?????select(index):按索引查詢
?????move(key,?dbindex):將當(dāng)前數(shù)據(jù)庫(kù)中的key轉(zhuǎn)移到有dbindex索引的數(shù)據(jù)庫(kù)
?????flushdb:刪除當(dāng)前選擇數(shù)據(jù)庫(kù)中的所有key
?????flushall:刪除所有數(shù)據(jù)庫(kù)中的所有key
2.對(duì)String操作的命令
?????set(key,?value):給數(shù)據(jù)庫(kù)中名稱為key的string賦予值value
?????get(key):返回?cái)?shù)據(jù)庫(kù)中名稱為key的string的value
?????getset(key,?value):給名稱為key的string賦予上一次的value
?????mget(key1,?key2,…,?key?N):返回庫(kù)中多個(gè)string(它們的名稱為key1,key2…)的value
?????setnx(key,?value):如果不存在名稱為key的string,則向庫(kù)中添加string,名稱為key,值為value
?????setex(key,?time,?value):向庫(kù)中添加string(名稱為key,值為value)同時(shí),設(shè)定過(guò)期時(shí)間time
?????mset(key1,?value1,?key2,?value2,…key?N,?value?N):同時(shí)給多個(gè)string賦值,名稱為key?i的string賦值value?i
?????msetnx(key1,?value1,?key2,?value2,…key?N,?value?N):如果所有名稱為key?i的string都不存在,則向庫(kù)中添加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.對(duì)List操作的命令
?????rpush(key,?value):在名稱為key的list尾添加一個(gè)值為value的元素
?????lpush(key,?value):在名稱為key的list頭添加一個(gè)值為value的?元素
?????llen(key):返回名稱為key的list的長(zhǎng)度
?????lrange(key,?start,?end):返回名稱為key的list中start至end之間的元素(下標(biāo)從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個(gè)名稱為key的list中值為value的元素。count為0,刪除所有值為value的元素,count>0 ? ? ?從頭至尾刪除count個(gè)值為value的元素,count<0從尾到頭刪除|count|個(gè)值為value的元素。
?????lpop(key):返回并刪除名稱為key的list中的首元素
?????rpop(key):返回并刪除名稱為key的list中的尾元素
?????blpop(key1,?key2,…?key?N,?timeout):lpop 命令的block版本。即當(dāng)timeout為0時(shí),若遇到名稱為key?i的list不存在或該list為空,則命令結(jié)束。如果 timeout>0,則遇到上述情況時(shí),等待timeout秒,如果問(wèn)題沒(méi)有解決,則對(duì)key?i+1開始的list執(zhí)行pop操作。
?????brpop(key1,?key2,…?key?N,?timeout):rpop的block版本。參考上一命令。
?????rpoplpush(srckey,?dstkey):返回并刪除名稱為srckey的list的尾元素,并將該元素添加到名稱為dstkey的list的頭部
4.對(duì)Set操作的命令
?????sadd(key,?member):向名稱為key的set中添加元素member
?????srem(key,?member)?:刪除名稱為key的set中的元素member
?????spop(key)?:隨機(jī)返回并刪除名稱為key的set中一個(gè)元素
?????smove(srckey,?dstkey,?member)?:將member元素從名稱為srckey的集合移到名稱為dstkey的集合
?????scard(key)?:返回名稱為key的set的基數(shù)
?????sismember(key,?member)?:測(cè)試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)?:隨機(jī)返回名稱為key的set的一個(gè)元素
5.對(duì)zset(sorted?set)操作的命令
?????zadd(key,?score,?member):向名稱為key的zset中添加元素member,score用于排序。如果該元素已經(jīng)存在,則根據(jù)score更新該元素的順序。
?????zrem(key,?member)?:刪除名稱為key的zset中的元素member
?????zincrby(key,?increment,?member)?:如果在名稱為key的zset中已經(jīng)存在元素member,則該元素的score增加increment;否則向集合中添加該元素,其score的值為increment
?????zrank(key,?member)?:返回名稱為key的zset(元素已按score從小到大排序)中member元素的rank(即index,從0開始),若沒(méi)有member元素,返回“nil”
?????zrevrank(key,?member)?:返回名稱為key的zset(元素已按score從大到小排序)中member元素的rank(即index,從0開始),若沒(méi)有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的基數(shù)
?????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):對(duì)N個(gè)zset求并集和交集,并將最后的集合保存在dstkeyN中。對(duì)于集合中每一個(gè)元素的score,在進(jìn)行AGGREGATE運(yùn)算前,都要乘以對(duì)于的WEIGHT參數(shù)。如果沒(méi)有提供WEIGHT,默認(rèn)為1。默認(rèn)的AGGREGATE是SUM,即結(jié)果集合中元素的score是所有集合對(duì)應(yīng)元素進(jìn)行 SUM運(yùn)算的值,而MIN和MAX是指,結(jié)果集合中元素的score是所有集合對(duì)應(yīng)元素中最小值和最大值。
6.對(duì)Hash操作的命令
?????hset(key,?field,?value):向名稱為key的hash中添加元素field<—>value
?????hget(key,?field):返回名稱為key的hash中field對(duì)應(yīng)的value
?????hmget(key,?field1,?…,field?N):返回名稱為key的hash中field?i對(duì)應(yīng)的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中元素個(gè)數(shù)
?????hkeys(key):返回名稱為key的hash中所有鍵
?????hvals(key):返回名稱為key的hash中所有鍵對(duì)應(yīng)的value
?????hgetall(key):返回名稱為key的hash中所有的鍵(field)及其對(duì)應(yīng)的value
五、Redis命名規(guī)則
由于Redis所有數(shù)據(jù)為鍵值對(duì),即所有數(shù)據(jù)均只能通過(guò)鍵值(Key)來(lái)進(jìn)行管理,故需
要規(guī)范命名規(guī)則,jedis客戶端包裝了有專門的命名規(guī)則生產(chǎn)函數(shù),調(diào)用即可!代碼參考實(shí)例代碼
轉(zhuǎn)載于:https://my.oschina.net/zhanggc/blog/1605142
總結(jié)
以上是生活随笔為你收集整理的jedis常用API的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LNMP(nginx防盗链,访问控制,解
- 下一篇: 元气骑士破碎的剑刃怎么合成