redis的數據類型有好集中,例如:string,hash,list,set,sort set,sub/pub。每一中在網絡中都有大量的應用場景。結合jedis來說解這些數據類型的使用方式和場景。
java
string的數據類型是[key:value]的鍵值對,它的key形式官方推薦爲 xxx:xxx:xxx 的分類。在java中咱們能夠經過JSON工具,將object的數據轉換爲json字符串存放在其中,取值時在轉換成object對象。
redis
命令:
json
#設置、獲取 >set string:test:1 string1 ->ok >get string:test:1 ->string1 #根據字符串的長度獲取字符 >getrange string:test:1 0 3 ->stri #修改值 >setrange string:test:1 3 ->7 (修改後的字符串長度) >get string:test:1 ->strong1 #設置新的獲取舊值(替換) >getset string:test:1 setgetstring1 ->string1 >get string:test:1 ->getsetstring1 #批量獲取 >mget string:test:1 string:test:2 ->getsetstring1 ->string2 #批量設置 >mset string1 firststring string2 secendstring ->ok #設置key的時間 >setex string:test:3 20 string3 ->ok >ttl string:test:3 ->20 20s後查詢 >get string:test:3 ->null #遞增、遞減、加多少 >set string3 22 >incr string3 ->23 >decr string3 ->22 >incrby string3 5 ->27 >decrby string3 5 ->22 #追加 >set s1 s1 >append s1 s2 -->4 >get s1 ->s1s2 #刪除key >del string1 ->1 #當某個值不存在,就設置(能夠用來檢測是否存在) redis:0>setnx s1 s111 1 redis:0>setnx s1 s222 0
jedis使用:
服務器
/** * @see 測試string類型 */ @Test public void stringTest() { System.out.println(getJedis().set("string1", "string2")); System.out.print(getJedis().get("string1")); System.out.println(getJedis().getSet("string1", "string3")); System.out.println(getJedis().get("string1")); System.out.println(getJedis().mset("s1", "s1", "s2", "s2", "s3", "s3")); System.out.println(getJedis().mget("s1", "s2", "s3")); System.out.println(getJedis().setex("se1", 20, "sn1")); System.out.println(getJedis().ttl("se1")); System.out.println(getJedis().get("se1")); System.out.println(getJedis().set("inc1", "33")); System.out.println(getJedis().incr("inc1")); System.out.println(getJedis().decr("inc1")); System.out.println(getJedis().incrBy("inc1", 5)); System.out.println(getJedis().decrBy("inc1", 5)); System.out.println(getJedis().del("inc1", "s1", "string1", "s2", "s3")); System.out.println(getJedis().setnx("s1", "s111")); System.out.println(getJedis().setnx("s1", "s222")); }
Redis的哈希值是字符串字段和字符串值之間的映射,因此他們是表示對象的完美數據類型。在Redis中的哈希值,可存儲超過400十億鍵值對。hash類型有點像對象,使用它來修改存放對象,每次修改數據不用所有修改徹底。使用object轉換爲json字符串存放爲string類型,每次修改會所有修改。網絡
命令
app
#設置、獲取 >hset stest name "h1" -->1 >hget stest name -->h1 #設置、獲取多個 >hmset stext1 name "h2" age 22 cache "trueredis:0>" -->ok >hmget stext1 name age cache 1) h2 2) 22 3) true #將stext1建下的值做爲一個hash列出來 >hgetall stext1 1) name 2) h2 3) age 4) 22 5) cache 6) true #獲取全部的hash字段 redis:0>hkeys stext1 1) name 2) age 3) cache #獲取建的散列字段個數 redis:0>hlen redis:0> stext1 4 #增長某個hash字段的value值 redis:0>hincrby stext1 age 1 23 #某個值不存在的時候設置 redis:0>hsetnx stext1 sex male 1 redis:0>hsetnx stext1 sex fredis:0>male 0 #獲取全部的value redis:0>hvals stext1 1) h2 2) 23 3) true 4) male
jedis使用
工具
/** * @see 測試hash */ @Test public void testHash() { System.out.println(getJedis().hset("st1", "name", "t1")); System.out.println(getJedis().hget("st1", "name")); HashMap<String, String> hm = new HashMap<String, String>(); hm.put("age", "22"); hm.put("sex", "male"); hm.put("cache", "true"); System.out.println(getJedis().hmset("st1", hm)); System.out.println(getJedis().hmget("st1", "name", "age", "sex", "cache")); System.out.println(getJedis().hgetAll("st1")); System.out.println(getJedis().hkeys("st1")); System.out.println(getJedis().hlen("st1")); System.out.println(getJedis().hvals("st1")); System.out.println(getJedis().hsetnx("st1", "account", "111")); }
Redis列表是簡單的字符串列表,排序插入順序。您能夠在頭部或列表的尾部Redis的列表添加元素。列表的最大長度爲232 - 1 (每一個列表超過4十億元素4294967295)元素。list在可重複的一對多狀況使用測試
命令
code
#1、添加數據 #一、從頭部添加。(若是沒有key,則添加新key) redis:0>LPUSH tls t1 ->1 redis:0>LPUSH tls t2 ->2 #檢查添加,若是有key則添加,不然就換回0 redis:0>LPUSHX tls t6 ->6 redis:0>LPUSHX tls1 t7 ->0 #二、添加數據到尾部 redis:0>RPUSH tls ts7 ->8 #檢測插入尾部 redis:0>RPUSHX tls rp1 ->9 redis:0>RPUSHX tls1 rp2 ->0 #三、插入某個值前面 redis:0>LINSERT tls BEFORE t4 ti4 ->7 2、獲取 #一、經過索引獲取,從頭部開始(最新一個) redis:0>lindex tls 0 -t6 #二、長度 redis:0>llen tls ->9 #三、取出頭部、並刪除(最新一個) redis:0>LPOP tls -->t6 redis:0>llen tls -->8 #四、獲取尾部、並刪除 redis:0>RPOP tls -->rp1 redis:0>llen tls -->7 3、修改 #一、修改list中的value範圍,範圍以外的刪除 redis:0>LTRIM tls 0 4 ->OK redis:0>LLEN tls ->5 #二、修改特定索引的值 redis:0>LSET tls 0 lst ->OK 4、獲取全部 redis:0>lrange tls 0 -1 1) lst 2) ti4 3) t4 4) t3 5) t2
jedis做用
對象
@Test public void testList() { // 從頭部 System.out.println(getJedis().lpush("list1", "user1")); System.out.println(getJedis().lpushx("list2", "user1")); System.out.println(getJedis().lpop("list1")); // 從尾部 System.out.println(getJedis().rpush("list1", "user2")); System.out.println(getJedis().rpushx("list2", "user2")); System.out.println(getJedis().rpop("list1")); // 插入 System.out.println(getJedis().linsert("list1", LIST_POSITION.BEFORE, "user2", "user0")); // 獲取 System.out.println(getJedis().lindex("list1", 1)); System.out.println(getJedis().llen("list1")); // 修改 System.out.println(getJedis().ltrim("list1", 0, 1)); System.out.println(getJedis().lset("list1", 0, "user3")); }
Set類型看做爲沒有排序的字符集合, 和List有排序的字符集和惟一的區別是,Set集合中不容許出現重複的元素,並且這些操做的時間複雜度爲O(1),即常量時間內完成次操做。 Set可包含的最大元素數量是4294967295。換句話說,若是屢次添加相同元素,Set中將僅保留該元素的一份拷貝。和List類型相比,Set類型在功能上還存在着一個很是重要的特性,即在服務器端完成多個Sets之間的聚合計算操做,如unions、intersections和differences。因爲這些操做均在服務端完成,所以效率極高,並且也節省了大量的網絡IO開銷。能夠在例如用戶的地址記錄,操做記錄,文章訪問用戶的記錄等等一對多的場景。
命令
#1、添加(只能存放沒有的數據) redis:0>sadd stt a b c -->3 redis:0>sadd stt a b e -->1 #2、查詢 #一、是否存在 redis:0>sismember stt a -->1 #二、所用 redis:0>smembers stt 1) c 2) e 3) a 4) b #三、set中的值個數 redis:0>scard stt -->4 #四、隨機返回 redis:0>srandmember stt -->e #五、返回並刪除一個 redis:0>spop stt -->a redis:0>scard stt -->3
jedis
/** * @see 測試set */ @Test public void testSet() { // 插入 System.out.println(getJedis().sadd("set1", "1")); System.out.println(getJedis().sadd("set1", "2")); System.out.println(getJedis().sadd("set1", "3")); // 查詢是否存在 System.out.println(getJedis().sismember("set1", "1")); System.out.println(getJedis().sismember("set1", "4")); // 個數 System.out.println(getJedis().scard("set1")); // 隨機返回 System.out.println(getJedis().srandmember("set1")); // 隨機刪除 System.out.println(getJedis().spop("set1")); }
Redis有序集合相似Redis集合存儲在設定值惟一性。不一樣的是,一個有序集合的每一個成員帶有分數,用於以便採起有序set命令,從最小的到最大的分數有關。Redis 有序set添加,刪除和測試中的O(1)的存在成員(固定時間,不管裏面包含的元素集合的數量)。列表的最大長度爲232- 1元素(4294967295,超過4十億每一個元素的集合)。 有序集合和集合相似,可是每個value都會有一個分數。這個類型的用途很是廣,例如排名功能,有數據記錄的功能等等須要。
命令
1、添加 #一、添加:key,score,value redis:0> ZADD sost 0 -1 --> user1 2、修改 #一、增長某個value的score redis:0>ZINCRBY sost 10 user2 -->15 3、查詢 #一、獲取總數 redis:0>zcard sost -->1 #二、遞增查詢 redis:0>zrange sost 0 -1 withscores 1) user3 2) 2 3) user4 4) 3 5) user2 6) 5 7) user1 8) 555 #三、分數範圍個數範圍查詢 redis:0>zcount sost 3 555 -->3 #四、查詢value的排序(應該是排在哪一個檔次,由於存在份數相同的狀況) redis:0>zrank sost user1 -->2 #五、遞減查詢 redis:0>zrevrange sost1 0 -1 withscores 1) user3 2) 4 3) user1 4) 3 5) user2 6) 2 7) user4 8) 1 #六、查詢成員份數 redis:0>zscore sost1 user3 -->4 4、計算 #一、交集求和 redis:0>ZINTERSTORE sost2 2 sost sost1 -->4 #二、求並 redis:0>ZUNIONSTORE out 2 sost sost1 WEIGHTS 1 3 -->4 5、刪除 #刪除value成員 redis:0>ZREM sost user1 user2 -->2
jedis
/** * @see 測試sort set */ @Test public void testSortSet() { // 添加 System.out.println(getJedis().zadd("set1", 20, "user1")); System.out.println(getJedis().zadd("set1", 17, "user3")); // 修改積分 System.out.println(getJedis().zincrby("set1", 5, "user1")); // 總數 System.out.println(getJedis().zcard("set1")); // 查詢 System.out.println(getJedis().zrange("set1", 0, -1)); System.out.println(getJedis().zrangeWithScores("set1", 0, -1)); System.out.println(getJedis().zscore("set1", "user1")); // 分數範圍內的value個數 System.out.println(getJedis().zcount("set1", 0, 25)); // 排序範圍 System.out.println(getJedis().zrank("set1", "user1")); // 刪除 System.out.println(getJedis().zrem("set1", "user1")); // 並集求和 System.out.println(getJedis().zinterstore("out", "set1", "set2")); }
Redis 發佈訂閱(pub/sub)是一種消息通訊模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
命令
1、訂閱、退訂 #一、訂閱 redis:0>subscribe mytest mytest1 #二、匹配查詢 redis:0>psubscribe mytest* #三、退訂 redis:0>unsubscribe mytest 2、發送記錄 redis:0>publish mytest hello