Java 操作 Redis
環境準備
引入依賴
<!--引入jedis連接依賴-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
創建 jedis 對象
Centos 7 關閉防火牆:
systemctl stop firewalld.service
開啓遠程連接:詳見 Redis入門之Redis安裝、配置及常用指令
/**
* 測試 Redis 連接
*/
public class TestRedis {
public static void main(String[] args) {
// 1.創建 jedis 對象
// redis服務必須關閉防火牆
// redis服務必須開始遠程連接
Jedis jedis = new Jedis("192.168.3.65", "6379");
// 2.執行相關操作
jedis.select(0); // 選擇操作的數據庫, 默認0號
// ......
// 3.釋放資源
jedis.close();
}
}
操作 Key 相關 API
DEL 指令
- 語法 :
DEL key [key ...]
- 作用 : 刪除給定的一個或多個 key,不存在的 key 會被忽略。
- 可用版本: >= 1.0.0
- 返回值: 被刪除 key 的數量。
EXISTS 指令
- 語法:
EXISTS key
- 作用: 檢查給定 key 是否存在。
- 可用版本: >= 1.0.0
- 返回值: 若 key 存在,返回1 ,否則返回0。
EXPIRE 指令
- 語法:
EXPIRE key seconds
- 作用: 爲給定 key 設置生存時間(秒),當 key 過期時(生存時間爲 0),它會被自動刪除。
- 可用版本: >= 1.0.0
- 時間複雜度: O(1)
- 返回值:設置成功返回 1 。
KEYS 指令
- 語法 :
KEYS pattern
- 作用 : 查找所有符合給定模式 pattern 的 key 。
- 語法:
KEYS *
:匹配數據庫中所有 key 。
KEYS h?llo
:匹配 hello ,hallo 和 hxllo 等。
KEYS h*llo
:匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo
: 匹配 hello 和 hallo ,但不匹配 hillo 。特殊符號用\
隔開 - 可用版本: >= 1.0.0
- 返回值: 符合給定模式的 key 列表。
MOVE 指令
- 語法 :
MOVE key db
- 作用 : 將當前數據庫的 key 移動到給定的數據庫 db 當中。
- 可用版本: >= 1.0.0
- 返回值: 移動成功返回 1 ,失敗則返回 0 。
PEXPIRE 指令
- 語法 :
PEXPIRE key milliseconds
- 作用 : 這個命令和
EXPIRE
命令的作用類似,但是它以 毫秒 爲單位設置 key 的生存時間
(EXPIRE
以秒爲單位) - 可用版本: >= 2.6.0
- 時間複雜度: O(1)
- 返回值:設置成功,返回1。key 不存在或設置失敗,返回0
PEXPIREAT 指令
- 語法 :
PEXPIREAT key milliseconds-timestamp
- 作用 : 這個命令和
EXPIREAT
命令類似,但它以 毫秒 爲單位設置 key 的過期 unix 時間戳(EXPIREAT
以秒爲單位) - 可用版本: >= 2.6.0
- 返回值:如果生存時間設置成功,返回 1 。當 key 不存在或沒辦法設置生存時間時,返回 0 。
(查看EXPIRE 命令獲取更多信息)
TTL 指令
- 語法 :
TTL key
- 作用 : 以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)。
- 可用版本: >= 1.0.0
- 返回值:
當 key 不存在時,返回 -2 。
當 key 存在但沒有設置剩餘生存時間時,返回 -1 。
否則,以秒爲單位,返回 key 的剩餘生存時間。 - Note : Redis 2.8 以前,當 key 不存在,或者 key 沒有設置剩餘生存時間時,命令都返回 -1 。
PTTL 指令
- 語法 :
PTTL key
- 作用 : 這個命令類似於 TTL 命令,但它以毫秒爲單位返回 key 的剩餘生存時間
(TTL 以秒爲單位) - 可用版本: >= 2.6.0
- 返回值: 當 key 不存在時,返回 -2 。當 key 存在但沒有設置剩餘生存時間時,返回 -1 。
- 否則,以毫秒爲單位,返回 key 的剩餘生存時間。
- 注意 : Redis 2.8 以前,當 key 不存在,或者 key 沒有設置剩餘生存時間時,命令都返回 -1 。
RANDOMKEY 指令
- 語法 :
RANDOMKEY
- 作用 : 從當前數據庫中隨機返回(不刪除) 一個 key 。
- 可用版本: >= 1.0.0
- 返回值:當數據庫不爲空時,返回一個 key 。當數據庫爲空時,返回
nil
。
RENAME 指令
- 語法 :
RENAME key newkey
- 作用 : 將 key 改名爲 newkey 。
當 key 和 newkey 相同,或者 key 不存在時,返回一個錯誤。
當 newkey 已經存在時,RENAME
命令將覆蓋舊值。 - 可用版本: >= 1.0.0
- 返回值: 改名成功時提示OK ,失敗時候返回一個錯誤。
TYPE 指令
- 語法 :
TYPE key
- 作用 : 返回 key 所儲存的值的類型。
- 可用版本: >= 1.0.0
- 返回值:
none
:key 不存在
string
:字符串
list
:列表
set
:集合
zset
:有序集
hash
:哈希表
public class TestKeys {
private Jedis jedis;
@Before
public void before() {
// 連接開啓了redis服務的虛擬機
jedis = new Jedis("192.168.3.65", 6379);
}
@After
public void after() {
jedis.close();
}
@Test
public void testKeys() {
// 刪除一個key
jedis.del("name");
// 刪除多個key
jedis.del("name", "age");
// 設置一個key
jedis.set("age", "hello");
// 判斷一個key是否存在
Boolean name = jedis.exists("name");
System.out.println(name);
// 設置一個key超時時間
Long age = jedis.expire("age", 100);
System.out.println(age);
// 獲取一個key超時時間
Long ttl = jedis.ttl("age");
System.out.println(ttl);
// 隨機獲取一個key
String s = jedis.randomKey();
// 修改key名稱
jedis.rename("age", "newage");
// 查看對應值的類型
String type1 = jedis.type("name");
System.out.println(type1);
String type2 = jedis.type("maps");
System.out.println(type2);
}
}
操作 String 相關 API
命令 | 說明 |
---|---|
set | 設置一個key/value |
get | 根據key獲得對應的value |
mset | 一次設置多個key value |
mget | 一次獲得多個key的value |
getset | 獲得原始key的值,同時設置新值 |
strlen | 獲得對應key存儲value的長度 |
append | 爲對應key的value追加內容 |
getrange 索引0開始 | 截取value的內容 |
setex | 設置一個key存活的有效期(秒) |
psetex | 設置一個key存活的有效期(毫秒) |
setnx | 存在不做任何操作,不存在添加 |
msetnx原子操作(只要有一個存在不做任何操作) | 可以同時設置多個key,只要有一個存在都不保存 |
decr | 進行數值類型的-1操作 |
decrby | 根據提供的數據進行減法操作 |
incr | 進行數值類型的+1操作 |
incrby | 根據提供的數據進行加法操作 |
incrbyfloat | 根據提供的數據加入浮點數 |
public class TestString {
private Jedis jedis;
@Before
public void before() {
jedis = new Jedis("192.168.3.65", 6379);
}
@After
public void after() {
jedis.close();
}
@Test
public void testString() {
jedis.set("name", "zhenyu"); // set
String name = jedis.get("name"); // get
System.out.println(name);
jedis.mset("content", "好人", "address", "蘇州市"); // mset
List<String> mget = jedis.mget("name", "content", "address"); // mget
mget.forEach(v -> System.out.println("v = " + v));
String set = jedis.getSet("name", "yusael");
System.out.println(set);
// ...
}
}
操作 List 相關 API
命令 | 說明 |
---|---|
lpush | 將某個值加入到一個key列表頭部 |
lpushx | 同lpush,但是必須要保證這個key存在 |
rpush | 將某個值加入到一個key列表末尾 |
rpushx | 同rpush,但是必須要保證這個key存在 |
lpop | 返回和移除列表左邊的第一個元素 |
rpop | 返回和移除列表右邊的第一個元素 |
lrange | 獲取某一個下標區間內的元素 |
llen | 獲取列表元素個數 |
lset | 設置某一個指定索引的值(索引必須存在) |
lindex | 獲取某一個指定索引位置的元素 |
lrem | 刪除重複元素 |
ltrim | 保留列表中特定區間內的元素 |
linsert | 在某一個元素之前,之後插入新元素 |
public class TestList {
private Jedis jedis;
@Before
public void before() {
jedis = new Jedis("192.168.3.65", 6379);
}
@After
public void after() {
jedis.close();
}
@Test
public void testList() {
jedis.flushDB(); // 清除當前數據庫
jedis.lpush("names1", "1", "2", "3", "4", "5"); // lpush
jedis.rpush("names1", "a", "b", "c", "d", "e"); // rpush
List<String> names1 = jedis.lrange("names1", 0, -1);
names1.forEach(v -> System.out.println("name = " + v));
String name = jedis.lpop("names1"); // lpop rpop
System.out.println(name); // 5
System.out.println(jedis.llen("names1")); // llen
// names1 中 2 左邊插入一個 world
Long linsert = jedis.linsert("names1", BinaryClient.LIST_POSITION.BEFORE, "2", "world");// linsert
System.out.println("linsert: " + linsert);
names1 = jedis.lrange("names1", 0, -1);
names1.forEach(v -> System.out.println("name = " + v));
// ...
}
}
操作 Set 的相關 API
命令 | 說明 |
---|---|
sadd | 爲集合添加元素 |
smembers | 顯示集合中所有元素 無序 |
scard | 返回集合中元素的個數 |
spop | 隨機返回一個元素 並將元素在集合中刪除 |
smove | 從一個集合中向另一個集合移動元素 必須是同一種類型 |
srem | 從集合中刪除一個元素 |
sismember | 判斷一個集合中是否含有這個元素 |
srandmember | 隨機返回元素 |
sdiff | 去掉第一個集合中其它集合含有的相同元素 |
sinter | 求交集 |
sunion | 求和集 |
public class TestSet {
private Jedis jedis;
@Before
public void before() {
jedis = new Jedis("192.168.3.65", 6379);
}
@After
public void after() {
jedis.close();
}
@Test
public void testSet() {
jedis.sadd("names","zhangsan", "lisi");
Set<String> names = jedis.smembers("names");
names.forEach(v -> System.out.println("v = " + v));
Boolean sismember = jedis.sismember("names", "zhenyu");
System.out.println(sismember);
}
}
操作 ZSet 相關 API
命令 | 說明 |
---|---|
zadd | 添加一個有序集合元素 |
zcard | 返回集合的元素個數 |
zrange 升序 zrevrange 降序 | 返回一個範圍內的元素 |
zrangebyscore | 按照分數查找一個範圍內的元素 |
zrank | 返回排名 |
zrevrank | 倒序排名 |
zscore | 顯示某一個元素的分數 |
zrem | 移除某一個元素 |
zincrby | 給某個特定元素加分 |
public class TestZSet {
private Jedis jedis;
@Before
public void before() {
jedis = new Jedis("192.168.3.65", 6379);
}
@After
public void after() {
jedis.close();
}
@Test
public void testZSet() {
jedis.zadd("zset", 8, "張三");
jedis.zadd("zset", 5, "李四");
jedis.zadd("zset", 7, "王五");
jedis.zadd("zset", 2, "趙六");
jedis.zadd("zset", 33, "Win7");
jedis.zadd("zset", 6, "Win8");
jedis.zadd("zset", 77, "Win9");
Set<String> names = jedis.zrange("zset", 0, -1);
names.forEach(v -> System.out.println("v = " + v +", zscore = " + jedis.zscore("zset", v)));
Long zcard = jedis.zcard("zset");
System.out.println(zcard);
names = jedis.zrangeByScore("zset", "0", "100", 0, 5);
names.forEach(v -> System.out.println("v = " + v +", zscore = " + jedis.zscore("zset", v)));
}
}
操作 Hash 相關 API
命令 | 說明 |
---|---|
hset | 設置一個key/value對 |
hget | 獲得一個key對應的value |
hgetall | 獲得所有的key/value對 |
hdel | 刪除某一個key/value對 |
hexists | 判斷一個key是否存在 |
hkeys | 獲得所有的key |
hvals | 獲得所有的value |
hmset | 設置多個key/value |
hmget | 獲得多個key的value |
hsetnx | 設置一個不存在的key的值 |
hincrby | 爲value進行加法運算 |
hincrbyfloat | 爲value加入浮點值 |
public class TestHash {
private Jedis jedis;
@Before
public void before() {
jedis = new Jedis("192.168.3.65", 6379);
}
@After
public void after() {
jedis.close();
}
@Test
public void testHash() {
jedis.hset("maps","name","zhangsan");
Map<String, String> map = new HashMap<>();
map.put("age", "12");
map.put("content", "好人");
jedis.hmset("maps", map);
String maps = jedis.hget("maps", "name");
System.out.println(maps);
Map<String, String> all = jedis.hgetAll("maps");
all.forEach((k, v) -> System.out.println("k = " + k + ", v = " + v));
}
}