1. 程式人生 > >redis常見型別資料與操作(除String型別資料)

redis常見型別資料與操作(除String型別資料)

Hash型別

Hash是一個String型別的field和value之間的對映表,即redis的Hash資料型別的key(hash表名稱)對應的value實際的內部儲存結構為一個HashMap,因此Hash特別適合儲存物件。相對於把一個物件的每個屬性儲存為String型別,將整個物件儲存在Hash型別中會佔用更少記憶體。

Hash 資料型別內部結構示意圖

當前HashMap的實現有兩種方式:當HashMap的成員比較少時Redis為了節省記憶體會採用類似一維陣列的方式來緊湊儲存,而不會採用真正的HashMap結構,這時對應的value的redisObject的encoding為zipmap,當成員數量增大時會自動轉成真正的HashMap,此時encoding為ht。

應用場景

用一個物件來儲存使用者資訊,商品資訊,訂單資訊等等。

常用命令

(1)hset——設定key對應的HashMap中的field的value

(2)hget——獲取key對應的HashMap中的field的value

192.168.2.129:6379> hset myhash name zhangsan

(integer) 1

192.168.2.129:6379> hset myhash age 20

(integer) 1

192.168.2.129:6379> hget myhash name

"zhangsan"

192.168.2.129:6379> hget myhash age

"20"

192.168.2.129:6379>

(3)hgetall——獲取key對應的HashMap中的所有field的value

192.168.2.129:6379> hgetall myhash

1) "name"

2) "zhangsan"

3) "age"

4) "20"

192.168.2.129:6379>

(4)其它命令

 

List型別

Redis的List型別其實就是每一個元素都是String型別的雙向連結串列。我們可以從連結串列的頭部和尾部新增或者刪除元素。這樣的List既可以作為棧,也可以作為佇列使用。

List資料結構內部示意圖

應用場景

如好友列表,粉絲列表,訊息佇列,最新訊息排行等。

常用命令

(1)lpush——在key對應的list的頭部新增一個元素。

(2)lrange——獲取key對應的list的指定下標範圍的元素,-1表示獲取所有元素。

(3)lpop——從key對應的list的尾部刪除一個元素,並返回該元素。

192.168.2.129:6379> lpush newlist news1 news2 news3

(integer) 3

192.168.2.129:6379> lrange newlist 0 -1

1) "news3"

2) "news2"

3) "news1"

192.168.2.129:6379> lpop newlist

"news3"

192.168.2.129:6379> lrange newlist 0 -1

1) "news2"

2) "news1"

192.168.2.129:6379>

從上面的操作可以看出,lpush、lpop從表頭操作。

(4)rpush——在key對應的list的尾部新增一個元素。

(5)rpop——從key對應的list的尾部刪除一個元素,並返回該元素。

192.168.2.129:6379> rpush newlist2 news1 news2 news3

(integer) 3

192.168.2.129:6379> lrange newlist2 0 -1

1) "news1"

2) "news2"

3) "news3"

192.168.2.129:6379> rpop newlist2

"news3"

192.168.2.129:6379>

從上面的操作可以看出,rpush、rpop從表尾操作

(6)其他命令

Set型別

Redis 集合(Set型別)是一個無序的String型別資料的集合,類似List的一個列表,與List不同的是Set不能有重複的資料。實際上,Set的內部是用HashMap實現的,Set只用了HashMap的key列來儲存物件。我們來看看java中HashSet的原始碼:

public class HashSet<E>
    extends AbstractSet<E>

    implements Set<E>, Cloneable, java.io.Serializable

{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map

    private static final Object PRESENT = new Object();


    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
   public HashSet() {
        map = new HashMap<>();
}

......



/**
     * Returns an iterator over the elements in this set.  The elements
     * are returned in no particular order.
     *
     * @return an Iterator over the elements in this set
     * @see ConcurrentModificationException
     */

    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

可見建立一個HashSet的時候實際上建立了一個HashMap;Set中的元素,只是存放在了底層HashMap的key上,底層HashMap的value列為空,遍歷HashSet的時候從HashMap中取出keySet來遍歷。

Set底層結構示意圖

應用場景

集合有取交集、並集、差集等操作,因此可以求共同好友、共同興趣、分類標籤等。

常用命令

(1)sadd——在key對應的set中新增一個元素。

(2)smembers——獲取key對應的set的所有元素。

(3)spop——隨機返回並刪除key對應的set中的一個元素。

192.168.2.129:6379> sadd myset news1 news2 news3

(integer) 3

192.168.2.129:6379> smembers myset

1) "news3"

2) "news2"

3) "news1"

192.168.2.129:6379> spop myset

"news3"

192.168.2.129:6379>

(4)sdiff——求給定key對應的set與第一個key對應的set的差集

192.168.2.129:6379> smembers myset

1) "news3"

2) "news2"

3) "news1"

192.168.2.129:6379> sadd myset2 news3 news4 news5

(integer) 3

192.168.2.129:6379> smembers myset2

1) "news4"

2) "news3"

3) "news5"

192.168.2.129:6379> sdiff myset myset2

1) "news1"

2) "news2"

192.168.2.129:6379>

(5)suion——求給定key對應的set並集

192.168.2.129:6379> sunion myset myset2

1) "news3"

2) "news1"

3) "news2"

4) "news4"

5) "news5"

192.168.2.129:6379>

(6)sinter——求給定key對應的set交集

192.168.2.129:6379> sinter myset myset2

1) "news3"

192.168.2.129:6379>

(7)其他命令

SortSet

SortSet顧名思義,是一個排好序的Set,它在Set的基礎上增加了一個順序屬性score,這個屬性在新增修改元素時可以指定,每次指定後,SortSet會自動重新按新的值排序。

sorted set的內部使用HashMap和跳躍表(SkipList)來保證資料的儲存和有序,HashMap裡放的是成員到score的對映,而跳躍表裡存放的是所有的成員,排序依據是HashMap裡存的score。

應用場景

如按時間排序的時間軸。

常用命令

(1)zadd ——在key對應的zset中新增一個元素

(2)zrange——獲取key對應的zset中指定範圍的元素,-1表示獲取所有元素

192.168.2.129:6379> zadd myzset 1 "one" 2 "two" 3 "three"

(integer) 3

192.168.2.129:6379> zrange myzset 0 -1

1) "one"

2) "two"

3) "three"

192.168.2.129:6379> zrange myzset 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

192.168.2.129:6379>

(3)zrem——刪除key對應的zset中的一個元素

192.168.2.129:6379> zrem myzset one

(integer) 1

192.168.2.129:6379> zrange myzset 0 -1 withscores

1) "two"

2) "2"

3) "three"

4) "3"

192.168.2.129:6379>

(4)其它命令 

Redis常用命令

鍵值常用命令

keys/exits/del/expire/ttl/move/persist/randomkey/rename/type

伺服器常用命令

ping/echo/select/quit/dbsize/info/config get/flushdb/flushall

轉自:https://mp.weixin.qq.com/s/peS5A2jp9Rx0Dsafit6d7A