redis入門及相關API
redis入門及相關API
redis入門
1. 依賴
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> </dependency>
2. 編寫測試類
public class TestRedis { /** * 完成Redis入門案例測試 * 報錯說明: * 1.檢查Linux防火牆 * 2.檢查Redis3項配置 * 3.重啟redis. */ @Test public void test01(){ // 引數為IP地址和埠 Jedis jedis = new Jedis("192.168.126.130",6379); //1.向redis中儲存資料 jedis.set("msg", "哈哈哈 今天下雨了 不負眾望"); //2.從redis中獲取資料 String value = jedis.get("msg"); System.out.println(value); } }
redis_API
api基本上和redis命令相似, 但也有一些特殊件API使用更方便, 其中1和2最常用
1.對key操作的命令
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是所有集合對應元素中最小值和最大值。
zadd zset_01 0 java #新增
zadd zset_01 1 php #新增
zadd zset_01 2 python #新增
zrem zset_01 python #刪除
zrank zset_01 python #獲取score
zrange zset_01 0 -1 #獲取所有元素
zcard zset_01 #獲取元素個數
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
hset hash_01 age 22
hset hash_01 age 22
hmset hash_01 name robbie age 22
hget hash_01 name
hget hash_01 age
hincrby hash_01 age 2
hdel hash_01 age
API測試案例
package com.jt.test;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;
//@SpringBootTest //需要依賴spring容器,從容器中動態的獲取物件
public class TestRedis {
/**
* 完成Redis入門案例測試
* 報錯說明:
* 1.檢查Linux防火牆
* 2.檢查Redis3項配置
* 3.重啟redis.
*/
@Test
public void test01(){
Jedis jedis = new Jedis("192.168.126.129",6379);
//1.向redis中儲存資料
jedis.set("2004", "哈哈哈 今天下雨了 不負眾望");
//2.從redis中獲取資料
String value = jedis.get("2004");
System.out.println(value);
}
@Test
public void test02(){
Jedis jedis = new Jedis("192.168.126.129",6379);
//1.判斷redis中是否存在key
if(jedis.exists("2004")){
//2.如果存在則設定超時時間
jedis.expire("2004", 100);
//3.執行緒暫停2秒
try {
Thread.sleep(2000);
//4.獲取剩餘的存活時間
Long time = jedis.ttl("2004");
System.out.println("還能活:"+time);
//5.撤銷刪除操作
jedis.persist("2004");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 需求說明:
* 1.redis.set操作,後面的操作會將之前的value覆蓋
* 要求:如果key已經存在,則不允許賦值.
* 注意環境: 檢查redis中是否有改資料.
* */
@Test
public void test03() {
//A 潘石屹 B 馬雲
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.flushAll(); //清空redis快取
//如果key存在則不執行賦值操作.
jedis.setnx("boss", "潘石屹");
jedis.setnx("boss", "馬雲");
System.out.println(jedis.get("boss"));
}
/**
* 為資料新增超時時間.保證原子性操作
* 原子性: 一起完成一起回滾
* 鎖機制: 保證原子性 死鎖!!!!
* 小結: setnx 如果key存在則不賦值
* setex 保證原子性操作,並且新增超時時間.
* * */
@Test
public void test04() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.setex("aaa", 20, "xxxxx"); //滿足原子性需求.
}
/**
* 需求:
* 1.要求賦值操作時,如果資料已經存在則不允許賦值.
* 2.同時要求新增超時時間 並且滿足原子性要求.
* private static final String XX = "xx"; 只有key存在時,才能賦值
* private static final String NX = "nx"; 只有key不存在時,賦值
* private static final String PX = "px"; 毫秒
* private static final String EX = "ex"; 秒
*/
@Test
public void test05() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
SetParams setParams = new SetParams();
setParams.nx().ex(20);
jedis.set("AAA", "CCCCC", setParams); //原子性要求
System.out.println(jedis.get("AAA"));
}
/*測試hash資料型別*/
@Test
public void testHash() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.hset("person", "name", "tomcat");
jedis.hset("person", "age", "100");
Map<String,String> map = jedis.hgetAll("person");
System.out.println(map);
}
@Test
public void testList() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
jedis.lpush("list", "1","2","3","4");
String value = jedis.rpop("list");
System.out.println(value);
}
/**
* 實現Redis 事務控制
*/
@Test
public void testMulti() {
Jedis jedis = new Jedis("192.168.126.129", 6379);
Transaction transaction = jedis.multi();
try {
transaction.set("AAA", "XXX");
transaction.set("BBB", "XXX");
transaction.exec(); //提交事務
}catch (Exception exception){
exception.printStackTrace();
transaction.discard();//回滾事務
}
}
}