首頁  >  文章  >  資料庫  >  總結Redis常用資料類型操作指令

總結Redis常用資料類型操作指令

coldplay.xixi
coldplay.xixi轉載
2021-02-19 09:45:081840瀏覽

總結Redis常用資料類型操作指令

建議(免費):redis教學

#Redis 指令用於在redis 服務上執行操作。要在 redis 服務上執行指令需要一個 redis
用戶端。可以使用redis-cli指令啟動Redis客戶端。完整的啟動指令是redis-cli -h host -p port -a password

Redis常用的資料型別有五種:stringhashlistsetzset(sorted set有序集合)。學習這些類型之前還需要學習常用命令Key的管理。以下詳細介紹這些類型:更詳細的API可以參考此處

常用命令Key管理

Key的應用程式場景:

  • #限時的優惠活動資訊。
  • 網站的數據快取(對於一些需要定時更新的數據,如積分排行榜)
  • 手機驗證碼
  • 限制網站訪客訪問頻率(例如1分鐘最多訪問10次​​)

Key的命名建議:
key名稱區分大小寫;key不要太長,盡量不超過1024字節,太長會降低查找效率;在一個專案中最好使用統一的命名模式,如user:id:password

keys pattern           傳回滿足給定pattern的所有key,可以模糊匹配,如keys abc*代表abc開頭的key
exists key            判斷一個是否存在,存在返回1,不存在返回0
#expkey是否存在,存在返回1,不存在返回0#expkey是否存在,存在返回1,不存在返回0#expkey是否存在,存在返回# key second
       設定一個key的活動時間(秒)pexpire key milliseconds
    key  刪除一個keyttl key
            返回一個key的剩餘時間,key不存在時返回-2;key #              取消過期時間select dbindex
        選擇資料庫,預設有16個,索引從0開始move key, dbindex
  資料  randomkey            隨機傳回一個key
keyrename key, key2          傳回目前資料庫中key的數量
info               檢視資料庫資訊
#config get *                 傳回值的型別
flushdb
             刪除目前選擇資料庫中的所有keyflushall
         、字串String
String是redis最基本的型別,一個鍵最大能儲存523MB。 String類型是二進位安全的。意思是redis的String可以包含任何資料。例如圖片或序列化的物件 。

String的應用程式場景:
String通常用於保存單一字串或JSON字串資料。

因為String是二進位安全的,可以把圖片檔案的內容當作字串來儲存。 計數器(常規key-value快取應用,粉絲數、微博數量,投票等)

INCR 等指令本身就具有原子操作的特性,所以完全可以利用Redis 的NCR、INCRBY、DECR、DECRBY 等指令來實現原子計數的效果。假如,在某種場景下有 3 個客戶端同時讀取了 minum 的值(值為 2),然後對其同時進行了加 1 的操作,那麼,最後 bynum 的值一定是 5。不少網站都利用 reds 的這個特性來實現業務上的統計計數需求。

賦值語法

  • set key value
  •         為key賦予值value,多次設定會覆寫舊值且無視型別
  • setnx key value
  •        為key賦予值value,如果key已存在,則不設定並回傳0,否則設定並回傳1。是解決分散式鎖的方案之一。
setex key time value
    為key賦予值value並設定過期時間time,到期後key和value都清除。

setrange key start end
   設定指定區間範圍內的值,下標從0開始,取代字串。

取值語法
<p><code>get key           取得指定key的value值,key不存在則傳回nil
getrange key start end##   end角標
getbit key offset      對key 所儲存的字串值,取得指定偏移量的bit(二進位)
getset key value      值,同時傳回舊值,key不存在傳回nil
substr(key, start, end)  傳回名稱為key的string的value的子字串
#刪值語法
del key                  同Key

批量寫入
mset k1 v1 k2 v2...kn vn        批量設置多個的值

批量讀出

mget k1 k2 ... kn           獲取多個key的值
自增自減
incr key                的 key的value對應integer
decr key                key的value對應-1
decrby key。 #eger#     四      問題   公   -字串拼接
append key value             將value附加到指定key的末尾

msetnx(key1, value1...keyN, valueN)
msetnx(key1, value1...keyN, valueN) 生效

字串長度

strlen key
                                        〔                       key ＀     二、雙鍵值#Hash類型是String類型的field和value的映射表。 Hash特別適合用於儲存對象,相較於String可以佔用較少的磁碟空間,可以看成具有key和value的map容器。 Redis中每個hash可以儲存(2^32)-1個鍵值對。

Hash的應用程式場景:

通常用來儲存一個使用者資訊物件資料。

Redis的Hash實際上是將內部儲存的value作為一個HashMap。

賦值語法

  • hset key field value
  •           為指定key設定field和value
  • ##hsetnxkey field  為指定key設定field和value
  • ##hsetnxkey field value
        為指定key設定field和value,如果key已存在則不生效。

hmset key f1 v1 f2 v2 ... fn vn   同時將多個field-value(域值對)設定到雜湊表的key中。

取值語法
hget key field
             根據field fnvalue值##hmget 提供 f1 fg .... ##        根據多個field取得所有的value值

hgetall key

                     取得所有Hash表中的欄位hvals key

               取得所有Hash表中的欄位對應的value

 ists  取得所有Hash表中的欄位對應的value
 ists  取得所有Hash表中的欄位對應的value## 中,指定的欄位是否存在
hlen key                取得Hash表中欄位的數量
field # 
##12 1#112 月#2# Hash表的欄位del key
                同Key## 減語法##n#n#ef#n#n#hin#n#n#n#n#v#n#n#n#v#n#n#n#v#n#n#v#n#n#n#v#n#n#n#n#n#n#n#F#v#n#n#n#n#n#F#v# #n#n#n#n#F#Fv#n#Fv# #FFv#n#n#n#n#n#n#FF# #(F)#n#n#n#n#n#n#n#n#n#n#n#n#n#n#n#n#n#F#v# 為Hash表Key中field對應的value增加integer
hincrbyfloat key field increment   為Hash表Key中field對應的value增加increment

三、雙端鍊錶List

List類型是一個鍊錶結構的集合,主要功能有push、pop、取得元素等。更詳細的說,List類型是一個雙端鍊錶的結構,可以透過相關的操作進行集合頭部或尾部元素的新增和刪除,List既可以作為堆疊,又可以作為佇列,能夠滿足絕大多數需求。
如果鍵不存在,建立新的鍊錶。

如果鍵已存在,新增內容。

如果值全移除,對應的鍵也就消失了。

鍊錶操作無論是頭和尾效率都極高,但中間元素的操作效率很低。


應用場景

#對資料量大的集合資料刪減

列表資料顯示、關注列表、粉絲列表、留言評價等…分頁、熱門新聞(Top10)等。利用lrange可以很方便的實現分頁的功能,在部落格系統中,每篇部落格文章的評論也可以存入一個單獨的list中。
  • 任務佇列
    在處理web客戶端發送的命令請求時,某些操作的執行時間可能會比我們預期的更長一些,透過將待執行任務的相關資訊放入隊列裡面,並在之後對隊列進行處理,使用者可以推遲執行那些需要一段時間才能完成的操作,這種將工作交給任務處理器來執行的做法被稱為任務隊列(task queue)。 list通常可以用來實作一個訊息佇列,而且可以確保先後順序。

  • 賦值語法

    lpush key value1 value2 ... valueN    將一個或多個值插入到清單頭部(從左側新增)
    rpush key value1 value2 ...valueN     將一個或多個值插入到列表頭(從右側新增)
    lpushx key value               將一個值插入到已存在的列表頭部(最左邊),如果列表不存在,操作無效。
    rpushx key value              將一個值插入到已存在的列表尾部(最右邊),如果列表不存在,操作無效。

    「取值語法

    llen key                                
    lrange key start stop      取得清單指定範圍內的元素
    刪除語法

    並且取得清單的第一個元素(從左側移除)

    lpop key            移除並取得清單的最後一個元素(從右側移除)
    lrem keykey count value      刪除count個值為value的key
    blpop key1 key2 timeout    移除並取得清單的第一個元素,如果清單沒有元素會阻塞列表,直到清單等待逾時或發現清單的第一個元素,直到清單沒有元素會阻塞列表,直到清單等待逾時或發現可彈出元素為止
    brpop key1 key2 timeout    移除並獲取列表的最後一個元素,如果列表沒有元素會阻塞列表,直到等待超時或發現可彈出元素為止
    ltrim key start stop      將一個清單修剪,只保留指定區間內的元素,不在指定區間內的元素都刪除。
    修改語法

    lset key index value           透過索引設定清單元素的值

    ##linsert    透過索引設定清單元素的值

    ##linsert key   透過索引設定列表元素的值##linsert key before|   在清單的某個元素world前後插入元素value。
    進階指令

    rpoplpush source destination

           移除source清單的最後一個元素,並將此元素新增至destination列表,並傳回。 (可以對自己本身操作,類似隊列)

    brpoplpush source destination timeout   移除source列表的最後一個元素,並將該元素添加到destination列表,並返回;如果source 列表沒有元素會阻塞清單知道等待逾時或發現可移除元素為止。
    四、無序集合Set

    Set 是 String 類型的無序集合。集合成員是唯一的,集合中不能出現重複的資料。

    Redis 中的集合是透過哈希表實現的,所以添加,刪除,查找的複雜度都是 O(1)。
    集合中最大的成員數為 232 - 1 (4294967295, 每個集合可儲存40多億個成員)。

    類似JAVA中的Hashtable集合


    Redis的set的底層儲存結構特別神奇,底層使用了intset和hashtable兩種資料結構儲存的,intset我們可以理解為數組,hashtable就是普通的雜湊表(key為set的值,value為null)。

      intset內部其實是一個陣列(int8_t coentents[]陣列),而且儲存資料的時候是有序的,因為在尋找資料的時候是透過二分查找來實現的。
    應用場景

    對兩個集合間的資料[計算]進行交集、並集、差集運算

      以非常方便的實現如共同關注、共同喜好、二度好友等功能。對上面的所有集合操作,你也可以使用不同的指令選擇將結果傳回給客戶端還是儲存到一個新的集合。
    • 利用唯一性,可以統計訪問網站的所有獨立IP
    • 賦值語法

    sadd key member1 member2 .. . memberN

      新增一個或多個成員

    #################################################

    ##scard key                                  四    傳回集合中的所有成員
    sismember key member           member 元素是否是判斷member 元素是否是集合key 的成員(開發中:驗證是否存在判斷)
    srandmember key count            傳回集合中一個或多個隨機數


    #1

    #srem key member1 member2...memberN     移除集合中一個或多個成員

    spop kye count

                         隨機元素

    smove source destincation member

         將member元素從source集合移到destination集合
    #差集語法

    sdiff key1 key2                           傳回給定所有集合的差集(左側)

    sdiffstore destination 1 傳回給定所有集合的差集(左側)

    ##sdiffstore destination 集數 傳回給定所有集合的差集(左側)"#sdiffstore destination 1 傳回給定。中原有的資料清除)
    交集語法

    sinter key1 key2                                          共有返回給定數據集合的數據共享。 sinterstore destination key1 key2
         傳回給定所有集合的交集並儲存在destination 中##並    給定集合的並集
    sunionstore destination key1 key2      所有給定集合的並集存儲在destination 集合中

    ##五、有序集合Zset











    ##Redis zset 和set 一樣也是string類型元素的集合,且不允許重複的成員。不同的是每個元素都會關聯一個double類型的分數。 redis正是透過分數來為集合中的成員進行從小到大的排序。 zset的成員是唯一的,但分數(score)卻可以重複。
    之前的set是k1 v1 v2
    現在的zset是k1 score1 v1 score2 v2
    應用場景

    排行榜

    ①twitter 的public timeline可以以發表時間作為score來存儲,這樣獲取時就是自動按時間排好序的。 ②一個儲存全班同學成績的Sorted Set,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。 ③用Sorted Set來做帶有權重的佇列,例如普通訊息的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來取得工作任務。讓重要的任務優先執行。

    賦值語法

    zadd key score1 member1 score2 member2

     在有序集合中新增一個或多個成員,或更新已存在成員的分數

    取值語法

    zcard key###                                                     〴      計算在有序集合中指定區間分數的成員數######zrank key member###              傳回有序」中指定成員的索引#####zrange    傳回有序區」中指定成員的索引#####zrange 關係序集合成指定區間內的成員(低到高)######zrevrange key start stop [withscores]###   透過索引區間返回有序集合成指定區間內的成員(高到低)### ###zlexcount key,min,max###           在有序集合中計算指定字典區間內成員數量#########          移除集合######zrem key member [member ...]###        移除有序集合中的一個或多個成員######zremrangebyrank 移除有序集合中的一個或多個成員######zremrangebyrank 移除 stop###    中給定的排名區間的所有成員(第一名是0)(低到高排序)######zremrangebyscore key min max###        移除有序集合中給定的順序分數區間的所有成員# ########分數自增#########zincrby key ncrement member###        有序集合中對指定成員的分數加上增量increment######################################################################################################################################################################################################################################六、HyperLoglog#########Redis在2.8.9版本中加入了HyperLoglog結構。這個結構是用來做基數統計的演算法,######優點:無論輸入元素多少,計算基數所需的空間總是固定的,而且很小。 ######缺點:只會根據輸入元素的計算基數,而不會儲存輸入元素本身,索引不能像集合那樣,傳回輸入的各個元素。 ###

    什麼是基數?
    例如資料集{1,2,3,3,4,5,5},那麼這個資料集的基數集為{1,2,3,4,5},基數為5。所謂基數估計就是在誤差可接受的範圍內,快速計算基數。
    為什麼要使用HyperLogLog?
    傳統的統計一個對象的基數值需要12M內存,如果統計1萬個對象,需要將近120G內存,無法廣泛應用於大數據場景;而使用了HyperLogLog,統計1億個數據的基數值,大約需要12M,記憶體佔用減少明顯。

    總結Redis常用資料類型操作指令
    pfadd key element1 element2 ... elementN         加入指定元素到HyperLog2中## #pfcount           回給定HyperLogLog的基數估算值
    pfmerge destkey sourcekey1 sourcekey2 ...sourcekeyN   將多個HyperLogLog合併為一個HyperLogLog

    #更多相關免費學習推薦:
    redis

    #

    以上是總結Redis常用資料類型操作指令的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除