1. 簡介
Redis 是一個開源(BSD許可)的,內(nèi)存中的key-value存儲系統(tǒng),它可以用作數(shù)據(jù)庫、緩存和消息中間件。
2. 對key的操作
首先要建立連接Jedis jedis = new Jedis("127.0.0.1", 6379),然后就可以對string,set,zset,hash進行操作了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
//對key的測試 public void keyTest() { System.out.println(jedis.flushDB()); //清空數(shù)據(jù) System.out.println(jedis.echo( "hello" )); //打印hello System.out.println(jedis.exists( "foo" )); //判斷key是否存在 jedis.set( "key1" , "values1" ); jedis.set( "key2" , "values2" ); System.out.println(jedis.exists( "key1" )); //判斷key是否存在 String randomKey = jedis.randomKey(); //選擇一個隨機的key System.out.println( "randomKey的為: " + randomKey); jedis.expire( "key1" , 60 ); //生存時間 System.out.println(jedis.pttl( "key1" )); //剩下的生存時間 //移除key的過期時間 jedis.persist( "key1" ); // 獲取key的類型, "string", "list", "set" "none" none表示key不存在 System.out.println( "type的類型為: " + jedis.type( "key1" )); //key的類型 // 導(dǎo)出key的值 String value = jedis.get( "key1" ); System.out.println(value); // 將key重命名 jedis.renamenx( "key1" , "keytest" ); System.out.println( "key1是否存在: " + jedis.exists( "key1" )); // 判斷是否存在 System.out.println( "keytest是否存在: " + jedis.exists( "keytest" )); // 判斷是否存在 // 查詢匹配的key // KEYS * 匹配數(shù)據(jù)庫中所有 key 。 // KEYS h?llo 匹配 hello , hallo 和 hxllo 等。 // KEYS h*llo 匹配 hllo 和 heeeeello 等。 // KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。 // 特殊符號用 \ 隔開。 Set<string> set = jedis.keys( "k*" ); //獲取所有相關(guān)的key keys方法 System.out.println(set); jedis.del( "key1" ); // 刪除key del方法 System.out.println(jedis.exists( "key1" )); } |
3. String數(shù)據(jù)類型
1
2
3
4
5
6
7
8
9
10
11
12
|
set mystr "hello world!" //設(shè)置字符串類型 get mystr //讀取字符串類型 對字符串進行數(shù)值操作 127.0 . 0.1 : 6379 > set mynum "2" OK 127.0 . 0.1 : 6379 > get mynum "2" 127.0 . 0.1 : 6379 > incr mynum (integer) 3 127.0 . 0.1 : 6379 > get mynum "3" |
Java操作代碼為:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
//對string操作的測試 public void stringTest() { jedis.set( "hello" , "hello" ); //set System.out.println(jedis.get( "hello" )); //get // 使用append 向字符串后面添加 jedis.append( "hello" , " world" ); //追加 append方法 System.out.println(jedis.get( "hello" )); // set覆蓋字符串 jedis.set( "hello" , "123" ); System.out.println(jedis.get( "hello" )); // 設(shè)置過期時間 jedis.setex( "hello2" , 2 , "world2" ); System.out.println(jedis.get( "hello2" )); try { Thread.sleep( 3000 ); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(jedis.get( "hello2" )); // 一次添加多個key-value對 jedis.mset( "a" , "1" , "b" , "2" ); // 獲取a和b的value List<string> valus = jedis.mget( "a" , "b" ); System.out.println(valus); // 批量刪除 jedis.del( "a" , "b" ); System.out.println(jedis.exists( "a" )); System.out.println(jedis.exists( "b" )); } |
4. List數(shù)據(jù)類型
redis中的lists在底層實現(xiàn)上并不是數(shù)組,而是鏈表。
一系列操作:RPUSH, LPUSH, LLEN, LRANGE, LPOP和 RPOP。
我們可以用LPUSH在lists的左側(cè)插入一個新元素,用RPUSH在lists的右側(cè)插入一個新元素,用LRANGE命令從lists中指定一個范圍來提取元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//新建一個list叫做mylist,并在列表頭部插入元素"1" 127.0 . 0.1 : 6379 > lpush mylist "1" //返回當(dāng)前mylist中的元素個數(shù) (integer) 1 //在mylist右側(cè)插入元素"2" 127.0 . 0.1 : 6379 > rpush mylist "2" (integer) 2 //在mylist左側(cè)插入元素"0" 127.0 . 0.1 : 6379 > lpush mylist "0" (integer) 3 //列出mylist中從編號0到編號1的元素 127.0 . 0.1 : 6379 > lrange mylist 0 1 1 ) "0" 2 ) "1" //列出mylist中從編號0到倒數(shù)第一個元素 127.0 . 0.1 : 6379 > lrange mylist 0 - 1 1 ) "0" 2 ) "1" 3 ) "2" |
Java操作代碼為:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
public void listTest() { String key = "mylist" ; jedis.del(key); //把之前的刪除 // 隊列添加元素 jedis.rpush(key, "aaaa" ); jedis.rpush(key, "aaaa" ); jedis.rpush(key, "bbbb" ); jedis.rpush(key, "cccc" ); jedis.rpush(key, "cccc" ); //隊列長度 System.out.println( "lenth: " + jedis.llen(key)); // 打印隊列,從索引0開始,到倒數(shù)第1個(全部元素) System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 )); // 索引為1的元素 System.out.println( "index of 1: " + jedis.lindex(key, 1 )); // 設(shè)置隊列里面一個元素的值,當(dāng)index超出范圍時會返回一個error。 jedis.lset(key, 1 , "aa22" ); System.out.println( "index of 1: " + jedis.lindex(key, 1 )); // 從隊列的右邊入隊一個元素 jedis.rpush(key, "-2" , "-1" ); // 先-2,后-1入隊列 System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 )); // 從隊列的左邊入隊一個或多個元素 jedis.lpush(key, "second element" , "first element" ); // 先second // element,后first // elementF入隊列 System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 )); // 從隊列的右邊出隊一個元素 System.out.println(jedis.rpop(key)); // 從隊列的左邊出隊一個元素 System.out.println(jedis.lpop(key)); System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 )); // count > 0: 從頭往尾移除值為 value 的元素,count為移除的個數(shù)。 // count < 0: 從尾往頭移除值為 value 的元素,count為移除的個數(shù)。 // count = 0: 移除所有值為 value 的元素。 jedis.lrem(key, 1 , "cccc" ); System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 )); // 即最右邊的那個元素也會被包含在內(nèi)。 如果start比list的尾部下標(biāo)大的時候,會返回一個空列表。 // 如果stop比list的實際尾部大的時候,Redis會當(dāng)它是最后一個元素的下標(biāo)。 System.out.println(jedis.lrange(key, 0 , 2 )); System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 )); // 刪除區(qū)間以外的元素 System.out.println(jedis.ltrim(key, 0 , 2 )); System.out.println( "all elements: " + jedis.lrange(key, 0 , - 1 )); } |
5. Set類型
redis的集合,是一種無序的集合,集合中的元素沒有先后順序。
一系列操作:SADD, SREM, SISMEMBER, SMEMBERS 和 SUNION.
集合相關(guān)的操作也很豐富,如添加新元素、刪除已有元素、取交集、取并集、取差集等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
//向集合myset中加入一個新元素"one" 127.0 . 0.1 : 6379 > sadd myset "one" (integer) 1 127.0 . 0.1 : 6379 > sadd myset "two" (integer) 1 //列出集合myset中的所有元素 127.0 . 0.1 : 6379 > smembers myset 1 ) "one" 2 ) "two" //判斷元素1是否在集合myset中,返回1表示存在 127.0 . 0.1 : 6379 > sismember myset "one" (integer) 1 //判斷元素3是否在集合myset中,返回0表示不存在 127.0 . 0.1 : 6379 > sismember myset "three" (integer) 0 //新建一個新的集合yourset 127.0 . 0.1 : 6379 > sadd yourset "1" (integer) 1 127.0 . 0.1 : 6379 > sadd yourset "2" (integer) 1 127.0 . 0.1 : 6379 > smembers yourset 1 ) "1" 2 ) "2" //對兩個集合求并集 127.0 . 0.1 : 6379 > sunion myset yourset 1 ) "1" 2 ) "one" 3 ) "2" 4 ) "two" |
Java操作代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public void setTest() { // 清空數(shù)據(jù) System.out.println(jedis.flushDB()); String key = "myset1" ; String key2 = "myset2" ; // 集合添加元素 jedis.sadd(key, "aaa" , "bbb" , "ccc" ); jedis.sadd(key2, "bbb" , "ccc" , "ddd" ); // 獲取集合里面的元素數(shù)量 System.out.println(jedis.scard(key)); //the number count of the set // 獲得兩個集合的交集,并存儲在一個關(guān)鍵的結(jié)果集 jedis.sinterstore( "destination" , key, key2); System.out.println(jedis.smembers( "destination" )); // 獲得兩個集合的并集,并存儲在一個關(guān)鍵的結(jié)果集 jedis.sunionstore( "destination" , key, key2); System.out.println(jedis.smembers( "destination" )); // key1集合中,key2集合沒有的元素,并存儲在一個關(guān)鍵的結(jié)果集 jedis.sdiffstore( "destination" , key, key2); System.out.println(jedis.smembers( "destination" )); // 確定某個元素是一個集合的成員 System.out.println(jedis.sismember(key, "aaa" )); // 從key集合里面隨機獲取一個元素 System.out.println(jedis.srandmember(key)); // aaa從key移動到key2集合 jedis.smove(key, key2, "aaa" ); System.out.println(jedis.smembers(key)); //獲取集合中的元素 System.out.println(jedis.smembers(key2)); // 刪除并獲取一個集合里面的元素 System.out.println(jedis.spop(key)); // 從集合里刪除一個或多個元素 jedis.srem(key2, "ccc" , "ddd" ); System.out.println(jedis.smembers(key2)); } |
6. Sorted Sets類型
我們都將redis中的有序集合叫做zsets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//新增一個有序集合myzset,并加入一個元素baidu.com,給它賦予的序號是1 127.0 . 0.1 : 6379 > zadd myzset 1 baidu.com (integer) 1 //向myzset中新增一個元素360.com,賦予它的序號是3 127.0 . 0.1 : 6379 > zadd myzset 3 360 .com (integer) 1 //向myzset中新增一個元素google.com,賦予它的序號是2 127.0 . 0.1 : 6379 > zadd myzset 2 google.com (integer) 1 //列出myzset的所有元素,同時列出其序號,可以看出myzset已經(jīng)是有序的了。 127.0 . 0.1 : 6379 > zrange myzset 0 - 1 with scores 1 ) "baidu.com" 2 ) "1" 3 ) "google.com" 4 ) "2" 5 ) "360.com" 6 ) "3" //只列出myzset的元素 127.0 . 0.1 : 6379 > zrange myzset 0 - 1 1 ) "baidu.com" 2 ) "google.com" 3 ) "360.com" |
Java操作代碼為:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public void zsetTest() { // 清空數(shù)據(jù) System.out.println(jedis.flushDB()); String key = "mysortset" ; Map<string, double = "" > scoreMembers = new HashMap<>(); scoreMembers.put( "aaa" , 1001.0 ); scoreMembers.put( "bbb" , 1002.0 ); scoreMembers.put( "ccc" , 1003.0 ); // 添加數(shù)據(jù) jedis.zadd(key, 1004.0 , "ddd" ); jedis.zadd(key, scoreMembers); // 獲取一個排序的集合中的成員數(shù)量 System.out.println(jedis.zcard(key)); // 返回的成員在指定范圍內(nèi)的有序集合,以0表示有序集第一個成員,以1表示有序集第二個成員,以此類推。 // 負數(shù)下標(biāo),以-1表示最后一個成員,-2表示倒數(shù)第二個成員 Set<string> coll = jedis.zrange(key, 0 , - 1 ); System.out.println(coll); // 返回的成員在指定范圍內(nèi)的逆序集合 coll = jedis.zrevrange(key, 0 , - 1 ); System.out.println(coll); // 元素下標(biāo) System.out.println(jedis.zscore(key, "bbb" )); // 刪除元素 System.out.println(jedis.zrem(key, "aaa" )); System.out.println(jedis.zrange(key, 0 , - 1 )); // 給定值范圍內(nèi)的成員數(shù) System.out.println(jedis.zcount(key, 1002.0 , 1003.0 )); } |
7. Hash類型
hashes存的是字符串和字符串值之間的映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//建立哈希,并賦值 127.0 . 0.1 : 6379 > HMSET user: 001 username antirez password P1pp0 age 34 OK //列出哈希的內(nèi)容 127.0 . 0.1 : 6379 > HGETALL user: 001 1 ) "username" 2 ) "antirez" 3 ) "password" 4 ) "P1pp0" 5 ) "age" 6 ) "34" //更改哈希中的某一個值 127.0 . 0.1 : 6379 > HSET user: 001 password 12345 (integer) 0 //再次列出哈希的內(nèi)容 127.0 . 0.1 : 6379 > HGETALL user: 001 1 ) "username" 2 ) "antirez" 3 ) "password" 4 ) "12345" 5 ) "age" 6 ) "34" |
Java操作代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public void hashTest() { // 清空數(shù)據(jù) System.out.println(jedis.flushDB()); String key = "myhash" ; Map<string, string= "" > hash = new HashMap<>(); hash.put( "aaa" , "11" ); hash.put( "bbb" , "22" ); hash.put( "ccc" , "33" ); // 添加數(shù)據(jù) jedis.hmset(key, hash); jedis.hset(key, "ddd" , "44" ); // 獲取hash的所有元素(key值) System.out.println(jedis.hkeys(key)); // 獲取hash中所有的key對應(yīng)的value值 System.out.println(jedis.hvals(key)); // 獲取hash里所有元素的數(shù)量 System.out.println(jedis.hlen(key)); // 獲取hash中全部的域和值,以Map<string, string=""> 的形式返回 Map<string, string= "" > elements = jedis.hgetAll(key); System.out.println(elements); // 判斷給定key值是否存在于哈希集中 System.out.println(jedis.hexists(key, "bbb" )); // 獲取hash里面指定字段對應(yīng)的值 System.out.println(jedis.hmget(key, "aaa" , "bbb" )); // 獲取指定的值 System.out.println(jedis.hget(key, "aaa" )); // 刪除指定的值 System.out.println(jedis.hdel(key, "aaa" )); System.out.println(jedis.hgetAll(key)); // 為key中的域 field 的值加上增量 increment System.out.println(jedis.hincrBy(key, "bbb" , 100 )); System.out.println(jedis.hgetAll(key)); } |
8. 事務(wù)
事務(wù)是指“一個完整的動作,要么全部執(zhí)行,要么什么也沒有做”。
在聊redis事務(wù)處理之前,要先和大家介紹四個redis指令,即MULTI、EXEC、DISCARD、WATCH。這四個指令構(gòu)成了redis事務(wù)處理的基礎(chǔ)。
1.MULTI用來組裝一個事務(wù);
2.EXEC用來執(zhí)行一個事務(wù);
3.DISCARD用來取消一個事務(wù);
4.WATCH用來監(jiān)視一些key,一旦這些key在事務(wù)執(zhí)行之前被改變,則取消事務(wù)的執(zhí)行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
redis> MULTI //標(biāo)記事務(wù)開始 OK redis> INCR user_id //多條命令按順序入隊 QUEUED redis> INCR user_id QUEUED redis> INCR user_id QUEUED redis> PING QUEUED redis> EXEC //執(zhí)行 1 ) (integer) 1 2 ) (integer) 2 3 ) (integer) 3 4 ) PONG |
Java操作代碼為:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public void transactionTest() { Transaction t = jedis.multi(); //組裝一個事務(wù) t.set( "hello" , "world" ); Response<string> response = t.get( "hello" ); t.zadd( "foo" , 1 , "barowitch" ); t.zadd( "foo" , 0 , "barinsky" ); t.zadd( "foo" , 0 , "barikoviev" ); Response<set<string>> sose = t.zrange( "foo" , 0 , - 1 ); // 返回全部相應(yīng)并以有序集合的方式返回 System.out.println(response); System.out.println(sose); t.exec(); // 此行注意,不能缺少 執(zhí)行 String foolbar = response.get(); // Response.get() 可以從響應(yīng)中獲取數(shù)據(jù) int soseSize = sose.get().size(); // sose.get() System.out.println(foolbar); System.out.println(sose.get()); System.out.println( "集合的size為:" + soseSize); } |
管道操作Java代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public void transactionPipelineTest() { Pipeline p = jedis.pipelined(); //開一個管道 p.set( "fool" , "bar" ); p.zadd( "foo" , 1 , "barowitch" ); p.zadd( "foo" , 0 , "barinsky" ); p.zadd( "foo" , 0 , "barikoviev" ); Response<string> pipeString = p.get( "fool" ); Response<set<string>> sose = p.zrange( "foo" , 0 , - 1 ); System.out.println(pipeString); System.out.println(sose); p.sync(); //提交 System.out.println( "==========" ); System.out.println(p.get( "fool" )); System.out.println(p.zrange( "foo" , 0 , - 1 )); int soseSize = sose.get().size(); Set<string> setBack = sose.get(); System.out.println(soseSize); System.out.println(setBack); System.out.println(pipeString.get()); } |
總結(jié)
以上就是本文關(guān)于Java操作Redis詳細介紹的全部內(nèi)容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持。
原文鏈接:https://www.2cto.com/kf/201608/541731.html