redis的各類數據類型

redis的各類數據類型

        redis的數據類型有好集中,例如:string,hash,list,set,sort set,sub/pub。每一中在網絡中都有大量的應用場景。結合jedis來說解這些數據類型的使用方式和場景。
java

一、string

        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"));
	}

二、hash

        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"));
	}

三、list

        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

    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"));
	}

五、sort set(重要)

       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"));
	}

六、sub/pub

        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
相關文章
相關標籤/搜索