1. 程式人生 > >redis有序集合效能 列表、集合、有序集合

redis有序集合效能 列表、集合、有序集合

1.1 列表

  列表(list)型別是用來儲存多個字串,元素從左到右組成一個有序的集合.列表中的每個字串被稱為元素(element),一個列表最多可以儲存(2的32次方)-1個元素.在redis中,可以對列表兩端插入(push)和彈出(pop),還可以獲取指定範圍的元素列表、獲取指定所有下標的元素等.

  列表型別有兩個特點:

    ①列表中的元素是有序的,這就意味著可以通過索引下標獲取某個元素或者某個範圍內的元素列表.

    ②列表中的元素可以是重複的.

1.1.1 命令 

  1) 插入命令

    (1) 從右邊插入元素.  rpush key value [value...]

    (2) 從左邊插入元素.  lpush

key value [value....]  使用方法與rpush一樣,從左側插入.
  

  2) 查詢命令

    (1) 查詢指定範圍內的元素列表  lrange key start end  

    lrange操作會獲取列表指定索引範圍所有的元素.索引下標有兩個特點:第一,索引下標從左到右分別是0到N-1,但是從右到左分別是-1到-N.第二,lrange中的end選項包含了自身.

    (2) 獲取列表指定索引下的元素  lindex key index

    (3) 獲取列表長度  llen key

  3) 刪除命令  

    (1) 從列表左側或右側彈出元素.  lpop

key  rpop key  將列表最左側與右側的元素彈出來.

    (2) 刪除指定元素  lrem key count value

     lrem命令會從列表中找到等於value的元素進行刪除,根據count的不同分為三種:

      count>0,從列表中刪除指定數量(count)的元素.

      count<0,從列表中刪除count絕對值數量的元素.

      count=0,刪除所有.

    (3) 按照索引範圍修剪列表  ltrim key start end

  4)修改命令

    修改指定索引下標的元素:  lset key index value

  5) 阻塞操作  

    阻塞式彈出:   blpop key [key...] timeout  brpop key [key...] timeout

    blpop與brpop命令是lpop和rpop命令的阻塞版本,他除了彈出方向不同,使用方法基本相同,所以下面以brpop命令進行說明,

    brpop命令包含兩個引數:

    1)列表為空:如果timeout等於3,那麼客戶端等到三秒後返回,如果timeout=0,那麼客戶端將一直阻塞,直到彈出成功.

    2)列表不為空:客戶端會立刻返回.

  在使用阻塞彈出命令時,有兩點需要注意.

  第一點:如果是多個鍵,那麼會從左到右遍歷鍵,一旦有一個鍵能彈出元素客戶端就會立刻返回.
  第二點:如果多個客戶端同時對一個鍵進行操作,那麼最先執行命令的客戶端可以獲取到值.

1.1.2 內部編碼

  列表型別的內部編碼有兩種:  編碼名 編碼描述

  ziplist(壓縮列表)  當列表的元素個數大於list-max-ziplist-entries配置(預設為512個),同時列表中每個元素的長度小於list-max-ziplist-value配置(預設為64位元組).

  linkedlist(連結串列)  當列表的長度或值得大小不滿足ziplist的要求,redis會採用linkedlist為列表的內部實現編碼.

1.1.3 使用場景

  訊息佇列:redis的lpush-brpop命令組合即可實現阻塞佇列,生產者客戶端使用lpush命令向列表插入元素.消費者客戶端使用brpop命令阻塞式的"搶"列表中的尾部元素.多個客戶端保證訊息的負載均衡與可用性.

文章列表:每個使用者都有屬於自己的文章列表.此時可以考慮使用列表,因為列表不但是有序的,同時支援使用lrange按照索引範圍獲取多個元素.

開發提示:列表的使用場景有很多如: lpush+lpop=Stack(棧)、lpush+rpop=queue(佇列)、lpush+brpop=message queue、lpush+ltrim=Capped Collection(有限集合)

1.2 集合  

  集合(set)型別也是用來儲存多個的字串元素,但和列表不同的是:它的元素是無序且不可重複的,不能通過索引獲取元素.如下圖,集合user:1:follows中包含著"his"、"it"、"sports"、"music"四個元素,一個集合最多可以儲存(2的32次方-1)個元素.

1.2.1 命令 

  1) 集合內操作

    (1) 新增元素  sadd key value [value...]  返回結果為新增成功的元素數量.

    (2) 刪除元素  srem key value [value...]  返回結果為刪除成功的元素數量.

    (3) 獲取元素個數  scard key

    (4) 判斷元素是否在集合中  sismember key value

    (5) 隨機從集合中返回指定個數元素  srandmember key [count]  [count]是可選引數,如果不寫預設為:1.

    (6) 從集合中隨機彈出元素  spop key  spop操作可以從集合中隨機彈出一個元素.

    (7) 獲取集合的所有元素  smembers key  獲取集合所有元素,且返回結果是無序的.

  2) 集合間操作

    (1) 求多個集合的交集  sinter key [key...]

    (2) 求多個集合的並集  sunion key [key...]

    (3) 求多個集合的差集  sdiff key [key...]

    (4) 將交集、並集、差集的結果儲存.

      sinterstore storeKey key [key...]
      sunionstore storeKey key [key...]
      sdiffstore storeKey key [key...]

    集合間的運算在元素比較多的情況下會比較耗時,所以redis提供了上面三個命令(原命令+store)將集合間交集、並集、差集的結果儲存到storeKey中,例如將user:1:follows和user:2:follows兩個集合之間的交集結果儲存到user:1_2:follows中.

1.2.2 內部編碼

  集合型別的內部編碼有兩種:

  編碼名            編碼描述

  intset(整數集合)    當集合中的元素全是整數,且長度不超過set-max-intset-entries(預設為512個)時,redis會選用intset作為內部編碼.

  hashtable(雜湊表)   當集合無法滿足intset的條件時,redis會使用hashtable作為內部編碼.

1.2.3 使用場景

  集合型別比較典型的使用場景是標籤(tag).例如一個使用者可能對音樂感興趣,另一個使用者對新聞感興趣,這些想去點就是標籤.有了這些資料就可以獲得喜歡同一個標籤的人,以及使用者的共同喜好的標籤,這些資料對於使用者體驗來說比較重要.

1.3 有序集合

  有序集合相對於雜湊、列表、集合來說會有一點陌生,但既然叫有序集合.那麼它和集合必然是有著聯絡,它保留了集合不能重複元素的特性.但不同的是,有序集合是可排序的.但是他和列表使用索引下標進行排序依據不同的是,它給每個元素設定一個分數(score)作為排序的依據.

列表、集合、有序結合的異同點

1.3.1 命令 

  1)集合內

    (1) 新增成員  zadd key score member [score member ...]

      有關zadd命令有兩點需要注意:  Redis 3.2為zadd命令添加了nx、xx、ch、incr四個選項:

        nx:member必須不存在,才可以設定成功,用於新增.

        xx:member必須存在,才可以設定成功,用於新增.

        ch:返回此次操作後,有序結合元素和分數發生變化的個數.

        incr: 對score進行新增操作,相當於後面介紹的zincrby.

      有序集合相比集合提供了排序欄位,但是也產生了代價,zadd的時間複雜度是O(log(n)),sadd的時間複雜度為O(1).

    (2) 獲取成員個數  zcard key

    (3) 獲取某個成員的分數  zscore key member

    (4) 獲取成員排名  zrank key member  zrevrank key member

    (5) 刪除成員  zrem key member [member...]  

    (6) 增加成員分數  zincrby key score member

    (7) 獲取制定範圍的元素  zrange key start end [withscores]  zrevrange key start end [withscores]

      有序集合是按照分值排名的,zrange是由低到高返回,zrevrange反之,查詢全部:zrange user:ranking 0 -1,加上withscores引數顯示分數.

    (8) 返回指定分數範圍的成員  zrangebyscore key min max [withscores] [limit offset count]  zrevrangebyscore key min max [withscores] [limit offset count]

    (9) 返回指定分數範圍成員個數  zcount key min max

    (10) 刪除指定排名內的升序元素  zremrangebyrank key start end

    (11) 刪除指定分數範圍的成員  zremrangebyscore key min max

  2) 集合間的操作

    (1) 交集  zinterstore storeKey keyNum key [key ...] [weights weight [weight...]] [aggregate sum|min|max]  引數說明:

      storeKey:交集計算結果儲存到這個鍵下.

      keyNum:需要做交集的鍵的個數.

      key[key ...]:需要做交集的鍵.

      weights weight [weight...]:每個鍵的權重,在做交集計算時,每個鍵中的每個member的分值會和這個權重相乘,每個鍵的權重預設為1.

      aggregate sum|min|sum:計算成員交集後,分值可以按照sum(和)、min(最小值)、max(最大值)做彙總.預設值為sum.

    (2) 並集  zunionstore storeKey keyNum key [key...] [weights weight [weight...]] [aggregate sum|min|max]  該命令的所有引數和zinterstore是一致的,只不過做的是並集計算.

1.3.2 內部編碼 

  編碼名稱        編碼描述

  ziplist(壓縮列表)    當有序集合的元素小於zset-max-ziplist-entries配置(預設是128個),同時每個元素的值都小於zset-max-ziplist-value(預設是64位元組)時,Redis會用ziplist來作為有序集合的內部編碼實現,ziplist可以有效的減少記憶體的使用

  skiplist(跳躍表)      當ziplist的條件不滿足時,有序集合將使用skiplist作為內部編碼的實現,來解決此時ziplist造成的讀寫效率下降的問題.

相關推薦

redis有序集合效能 列表集合有序集合

1.1 列表   列表(list)型別是用來儲存多個字串,元素從左到右組成一個有序的集合.列表中的每個字串被稱為元素(element),一個列表最多可以儲存(2的32次方)-1個元素.在redis中,可以對列表兩端插入(push)和彈出(pop),還可以獲取指定範圍的元素列表、獲取指定所有下標的元素等.

java集合列表:ArrayListVectorLinkedList

sta pop arraylist 允許 dex nsa pack java jdk 1 package com.jdk7.chapter4; 2 3 import java.util.ArrayList; 4 import java.util.Link

python 列表元組字符串字典集合return等梳理

插入 deepcopy fda 刪除 style import pan 查詢 inf 有必要對這些數據類型及操作做下梳理: 1.列表:增刪改查   a.查找: 1 >>> names=["zhang","wang","li","zhao"]

Python基礎2 字符串列表字典集合等操作

list 其他 查看 拼接 rep 之前 反轉 轉換成 title 列表、元祖操作 列表 語法: name = [‘jack‘, ‘tom‘, ‘bob‘] 列表切片 列表切片的特點是“顧頭不顧尾” >>> name = [‘jack‘, ‘tom‘

Python基礎2 列表字典集合

列表、字典、集合本節內容列表、元組操作字符串操作字典操作集合操作文件操作字符編碼與轉碼 1. 列表、元組操作列表是我們最以後最常用的數據類型之一,通過列表可以對數據實現最方便的存儲、修改等操作定義列表names = [‘Alex‘,"Tenglan",‘Eric‘]通過下標訪問列表中的元素,下標從0開始計數&

列表元組字典集合的相關練習

put alt 分數 不同 inpu src col lambda nds 一、建立學號成績字典,並進行怎刪改操作 s = {‘01‘:‘100‘,‘02‘:‘99‘,‘03‘:‘98‘,‘04‘:‘97‘,‘05‘:‘96‘,‘05‘:‘96‘,‘06‘:‘95‘,‘0

Python 數字字符串列表元祖字典集合

小數 item 斜杠 radi python 過濾 tabs 標題 映射 一.數字 Python 支持三種不同的數值類型: 整型(Int) :整數無大小限制。(Python3.x),也可用十六進制或八進制表示。 浮點型(float) :也可以使用科學計數法表示(2

(四)Python中的“四大才子”(字符串列表字典集合

不可 inf nbsp 創建 重新 指向 分享圖片 table 數據類型 前戲:在python中把數據序列分為可變(mutable)和不可變(immutable)兩種 不可變:string、int、float、tuple 特點

python基礎--列表元祖字典集合

count ear 輸出 定位 python基礎 xtend -c col spa 列表(List) 1、列表特點   列表是可變的!!   list 是一種有序的序列,可以添加、刪除其中的元素,並且可以通過下標(索引)訪問 數據 2、簡單的常用操作   A、通過下表訪問元

python的數據類型字符串列表字典元祖集合編碼補充等

數據類型;字符串;列表;字典1、字符串 : ‘內容‘ 少量數據的存儲索引:就是下標就是從0開始 s = ‘python自動化學習‘s1 = s[0]print(s1) #通過索引找到元素 切片:就是一段,【0:4】顧頭不顧尾 s = ‘python自動化學習‘#通過切片查找pythons1 = s[0:6

python基礎知識之列表元祖字典集合字符串。

終端 mes ror sort names int 字母 基礎知識 ndt 1.可變類型之列表 列表用 [ ]來定義是可變的,可以通過索引值來去查詢裏面的字段可以可以追加,刪除等 ```python names=‘zhangyang guyun xiangpeng xuli

列表元組字典集合的定義操作與綜合練習

alt 定義 cor sco end OS bubuko move remove l = [‘Lucy‘,‘Abb‘,‘Lily‘] l.append(‘Abb‘) l.pop() print(1) t = (‘Lucy‘,‘Abb‘,‘Lily‘) scores =

python的各種推導式(列表推導式字典推導式集合推導式)

out com tle 生成 字典推導式 bar tip 技術 格式 推導式comprehensions(又稱解析式),是Python的一種獨有特性。推導式是可以從一個數據序列構建另一個新的數據序列的結構體。 共有三種推導,在Python2和3中都有支持: 列表(list

(字符串列表字典元組集合)的常用內置方法

keys 相互 格式 dex nio nbsp pen lis 報錯 一、字符串: lis=‘my name is maple‘ res=lis.count(‘m‘)#計算字符串內相同字符的個數 print(res) lis=‘my name is mapl

【Python基礎知識】基本數據類型:數字字符串列表元組字典集合

tuple 位置 環境 htm 邏輯 python3 修改 yield 啟動 1.查看Python版本 python -V 2.Windows系統下使用命令行設置環境變量:path=%path%;D:\Python 3.幾個重要的Python環境變量 PYTHONPA

python--元組字典列表集合

1.python 元組 (1)定義元組,用()定義        eg:num = (1,2,3,4,5,6) (2)定義只有一個值的時候,必須加上一個逗號,才能成為一個元組        eg:num

Python_day04_列表元組字典集合

列表(list) username=['admin','root','user01','user02','user03','user04'] - username[0:3] ['admin', 'root', 'user

CS231python課程——基礎(列表字典元組集合函式類)

文章目錄 基礎 列表list 字典dict 集合set 元組tuple:不可修改的有序列表 函式 類 基礎 列表list #如果想要在迴圈體內訪問每個元素的指標,可以使用內建的enumerate函式 an

python學習小總結(列表元組字典集合字符串)

添加列 xtend 16px 指定 替換 需要 isa utf-8 head ---恢復內容開始--- 一、列表(list) 1.添加 append():追加,在列表末尾添加元素。 列表名.append(添加的元素) extend():擴展,在列表末尾添加元素。 列表名.e

每天學一點python---列表元組字典集合

資料結構(Data Structures)基本上人如其名——它們只是一種結構,能夠將一些資料聚合 在一起。換句話說,它們是用來儲存一系列相關資料的集合。 Python中有四種內建的資料結構——列表(List)、元組(Tuple)、字典(Dictionary)和集合(Set) 列表l