1. 簡介
Redis 是一個開源(BSD許可)的,內存中的key-value存儲系統,它可以用作數據庫、緩存和消息中間件。
2. 對key的操作
首先要建立連接Jedis jedis = new Jedis("127.0.0.1", 6379),然後就可以對string,set,zset,hash進行操作了。
//對key的測試public void keyTest() {System.out.println(jedis.flushDB());//清空數據System.out.println(jedis.echo("hello"));//打印helloSystem.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();//選擇一個隨機的keySystem.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的類型// 導出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 * 匹配數據庫中所有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*");//獲取所有相關的key keys方法System.out.println(set);jedis.del("key1");// 刪除key del方法System.out.println(jedis.exists("key1"));}3. String數據類型
set mystr "hello world!" //設置字符串類型get mystr //讀取字符串類型對字符串進行數值操作127.0.0.1:6379> set mynum "2"OK127.0.0.1:6379> get mynum"2"127.0.0.1:6379> incr mynum(integer) 3127.0.0.1:6379> get mynum"3"
Java操作代碼為:
//對string操作的測試public void stringTest() {jedis.set("hello", "hello");//setSystem.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"));// 設置過期時間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的valueList<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數據類型
redis中的lists在底層實現上並不是數組,而是鍊錶。
一系列操作:RPUSH, LPUSH, LLEN, LRANGE, LPOP和RPOP。
我們可以用LPUSH在lists的左側插入一個新元素,用RPUSH在lists的右側插入一個新元素,用LRANGE命令從lists中指定一個範圍來提取元素。
//新建一個list叫做mylist,並在列表頭部插入元素"1"127.0.0.1:6379> lpush mylist "1"//返回當前mylist中的元素個數(integer) 1//在mylist右側插入元素"2"127.0.0.1:6379> rpush mylist "2"(integer) 2//在mylist左側插入元素"0"127.0.0.1:6379> lpush mylist "0"(integer) 3//列出mylist中從編號0到編號1的元素127.0.0.1:6379> lrange mylist 0 11) "0"2) "1"//列出mylist中從編號0到倒數第一個元素127.0.0.1:6379> lrange mylist 0 -11) "0"2) "1"3) "2"
Java操作代碼為:
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開始,到倒數第1個(全部元素)System.out.println("all elements: " + jedis.lrange(key, 0, -1));// 索引為1的元素System.out.println("index of 1: " + jedis.lindex(key, 1));// 設置隊列裡面一個元素的值,當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為移除的個數。 // count < 0: 從尾往頭移除值為value 的元素,count為移除的個數。 // count = 0: 移除所有值為value 的元素。 jedis.lrem(key, 1, "cccc");System.out.println("all elements: " + jedis.lrange(key, 0, -1));// 即最右邊的那個元素也會被包含在內。 如果start比list的尾部下標大的時候,會返回一個空列表。 // 如果stop比list的實際尾部大的時候,Redis會當它是最後一個元素的下標。 System.out.println(jedis.lrange(key, 0, 2));System.out.println("all elements: " + jedis.lrange(key, 0, -1));// 刪除區間以外的元素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.
集合相關的操作也很豐富,如添加新元素、刪除已有元素、取交集、取並集、取差集等。
//向集合myset中加入一個新元素"one"127.0.0.1:6379> sadd myset "one"(integer) 1127.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//新建一個新的集合yourset127.0.0.1:6379> sadd yourset "1"(integer) 1127.0.0.1:6379> sadd yourset "2"(integer) 1127.0.0.1:6379> smembers yourset1) "1"2) "2"//對兩個集合求並集127.0.0.1:6379> sunion myset yourset 1) "1"2) "one"3) "2"4) "two"
Java操作代碼:
public void setTest() {// 清空數據System.out.println(jedis.flushDB());String key = "myset1";String key2 = "myset2";// 集合添加元素jedis.sadd(key, "aaa", "bbb", "ccc");jedis.sadd(key2, "bbb", "ccc", "ddd");// 獲取集合裡面的元素數量System.out.println(jedis.scard(key));//the number count of the set// 獲得兩個集合的交集,並存儲在一個關鍵的結果集jedis.sinterstore("destination", key, key2);System.out.println(jedis.smembers("destination"));// 獲得兩個集合的並集,並存儲在一個關鍵的結果集jedis.sunionstore("destination", key, key2);System.out.println(jedis.smembers("destination"));// key1集合中,key2集合沒有的元素,並存儲在一個關鍵的結果集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
//新增一個有序集合myzset,並加入一個元素baidu.com,給它賦予的序號是1127.0.0.1:6379> zadd myzset 1 baidu.com (integer) 1//向myzset中新增一個元素360.com,賦予它的序號是3127.0.0.1:6379> zadd myzset 3 360.com (integer) 1//向myzset中新增一個元素google.com,賦予它的序號是2127.0.0.1:6379> zadd myzset 2 google.com (integer) 1//列出myzset的所有元素,同時列出其序號,可以看出myzset已經是有序的了。 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 -11) "baidu.com"2) "google.com"3) "360.com"
Java操作代碼為:
public void zsetTest() {// 清空數據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);// 添加數據jedis.zadd(key, 1004.0, "ddd");jedis.zadd(key, scoreMembers);// 獲取一個排序的集合中的成員數量System.out.println(jedis.zcard(key));// 返回的成員在指定範圍內的有序集合,以0表示有序集第一個成員,以1表示有序集第二個成員,以此類推。 // 負數下標,以-1表示最後一個成員,-2表示倒數第二個成員Set<string> coll = jedis.zrange(key, 0, -1);System.out.println(coll);// 返回的成員在指定範圍內的逆序集合coll = jedis.zrevrange(key, 0, -1);System.out.println(coll);// 元素下標System.out.println(jedis.zscore(key, "bbb"));// 刪除元素System.out.println(jedis.zrem(key, "aaa"));System.out.println(jedis.zrange(key, 0, -1));// 給定值範圍內的成員數System.out.println(jedis.zcount(key, 1002.0, 1003.0));}7. Hash類型
hashes存的是字符串和字符串值之間的映射
//建立哈希,並賦值127.0.0.1:6379> HMSET user:001 username antirez password P1pp0 age 34OK//列出哈希的內容127.0.0.1:6379> HGETALL user:0011) "username"2) "antirez"3) "password"4) "P1pp0"5) "age"6) "34"//更改哈希中的某一個值127.0.0.1:6379> HSET user:001 password 12345(integer) 0//再次列出哈希的內容127.0.0.1:6379> HGETALL user:0011) "username"2) "antirez"3) "password"4) "12345"5) "age"6) "34"
Java操作代碼:
public void hashTest() {// 清空數據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");// 添加數據jedis.hmset(key, hash);jedis.hset(key, "ddd", "44");// 獲取hash的所有元素(key值)System.out.println(jedis.hkeys(key));// 獲取hash中所有的key對應的value值System.out.println(jedis.hvals(key));// 獲取hash裡所有元素的數量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裡面指定字段對應的值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 的值加上增量incrementSystem.out.println(jedis.hincrBy(key, "bbb", 100));System.out.println(jedis.hgetAll(key));}8. 事務
事務是指“一個完整的動作,要么全部執行,要么什麼也沒有做”。
在聊redis事務處理之前,要先和大家介紹四個redis指令,即MULTI、EXEC、DISCARD、WATCH。這四個指令構成了redis事務處理的基礎。
1.MULTI用來組裝一個事務;
2.EXEC用來執行一個事務;
3.DISCARD用來取消一個事務;
4.WATCH用來監視一些key,一旦這些key在事務執行之前被改變,則取消事務的執行。
redis> MULTI //標記事務開始OKredis> INCR user_id //多條命令按順序入隊QUEUEDredis> INCR user_idQUEUEDredis> INCR user_idQUEUEDredis> PINGQUEUEDredis> EXEC //執行1) (integer) 12) (integer) 23) (integer) 34) PONG
Java操作代碼為:
public void transactionTest() {Transaction t = jedis.multi();//組裝一個事務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);// 返回全部相應並以有序集合的方式返回System.out.println(response);System.out.println(sose);t.exec();// 此行注意,不能缺少執行String foolbar = response.get();// Response.get() 可以從響應中獲取數據int soseSize = sose.get().size();// sose.get()System.out.println(foolbar);System.out.println(sose.get());System.out.println("集合的size為:" + soseSize);}管道操作Java代碼:
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());}總結
以上就是本文關於Java操作Redis詳細介紹的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持。