共計 10745 個字符,預計需要花費 27 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章將為大家詳細講解有關 redis 有哪些 api,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
一、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 工程添加如下引用即可。
dependency
groupId redis.clients /groupId
artifactId jedis /artifactId
version 2.6.3 /version
type jar /type
scope compile /scope
/dependency
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);
2. 價格時間排序(前提是已經存儲了價格,時間的 SortSet)
// 執行 2 級排序操作()
String stPriceSet =“stPriceSet”;//stPriceSet 價格的 sortset 列表名
String stTimeSet =“stTimeSet”; // stTimeSet 時間的 sortset 列表名
Set Tuple sumSet = JedisUtilEx.getInstance()
.getSortSetByPirceUpAndTimeDown(stPriceSet, stTimeSet);
// 排序以后可以重復獲取上次排序結果 (緩存時間 10 分鐘)
Set Tuple sumSet = JedisUtilEx.getInstance()
getLastPirceUpAndTimeDownSet();
3. 價格時間排序(前提是已經存儲了價格,時間的 SortSet)
// 執行 2 級排序操作
String stPriceSet =“stPriceSet”;//stPriceSet 價格的 sortset 列表名
String stTimeSet =“stTimeSet”; // stTimeSet 時間的 sortset 列表名
Set Tuple sumSet = JedisUtilEx.getInstance()
. getSortSetByPirceDownAndTimeDown (stPriceSet, stTimeSet);
// 排序以后可以重復獲取上次排序結果 (緩存時間 10 分鐘)
Set Tuple sumSet = JedisUtilEx.getInstance()
getLastPirceDownAndTimeDownSet ();
4. 保存 JavaBean 到 hash 表中
// bean 繼承至 RedisBean
JedisUtilEx.getInstance().setBeanToHash(bean);
5. 從 hash 表中讀取 JavaBean
//uuid 為業務制定的唯一標識符規則(相當于主鍵)String uuid =“1”; // 該 ID 是我們提前就知道的
// T 繼承至 RedisBean;
JedisUtilEx.getInstance().getBeanFromHash (uuid,Class T cls);
6. 將 JavaBean 列表裝入 hash 中
//list 中的 bean 繼承至 RedisBean
List T beanList = …;
JedisUtilEx.getInstance().setBeanListToHash(beanList);
// 異步版本的存儲列表到 hash
JedisUtilEx.getInstance().setBeanListToHashSyn(beanList);
7. 普通的操作流程示例
// 獲取 jedis 引用
Jedis jedis = JedisUtil.getInstance().getJedis();
// 執行業務以及調用 jedis 提供的接口功能
jedis.hset(…);
// 執行完成以后務必釋放資源
JedisUtil.getInstance().returnJedis(jedis);
// 若以后不會使用 JEDIS,需要關閉所有鏈接池
RedisConnetcion.destroyAllPools();
8. 事務執行流程
// 獲取連接資源
Jedis jd = JedisUtil.getInstance().getJedis();
// 開啟事務
Transaction ts = jd.multi();
// 執行業務以及調用 jedis 提供的接口功能
jedis.hset(…);
// 執行事務
List Object list = ts.exec();
// 釋放資源
JedisUtil.getInstance().returnJedis(jd);
9. 異步執行
// 獲取連接資源
Jedis jedis = JedisUtil.getInstance().getJedis();
// 獲取管道
Pipeline pipeline = jedis.pipelined();
// 執行業務以及調用 jedis 提供的接口功能
jedis.hset(…);
// 提交并釋放管道
pipeline.syncAndReturnAll();
// 釋放資源
JedisUtil.getInstance().returnJedis(jedis);
10. 如何獲取 Jedis 命名規則的合成 KEY
// 獲取類的唯一鍵值 key, 例如:User:1(User 為 class,1 為 uuid) 其中 user 繼承于 Reidsbean
JedisUtilEx.getInstance().getBeanKey(user);
// 另一種獲取類的唯一鍵值 key 的方法
JedisUtilEx.getInstance().getBeanKey(String uuid,Class T cls);
// 獲取 bean 對應的 KEY(對應列的唯一鍵值 key)
JedisUtilEx.getInstance().getBeanKey(String uuid,Class T cls,String... fileds);
// 獲取 bean 對應的 KEY(集群 key)
JedisUtilEx.getInstance().getBeanKey(Class T 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 客戶端包裝了有專門的命名規則生產函數,調用即可!
關于 redis 有哪些 api 就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
向 AI 問一下細節
丸趣 TV 網 – 提供最優質的資源集合!