Redis詳解:lists數據類型及操作

2021-01-14 IT168

  【IT168 專稿】 list是一個鍊表結構,主要功能是push、pop、獲取一個範圍的所有值等等,操作中key理解為鍊表的名字。

  系列文章:

  Redis詳解:strings數據類型及操作

  Redis詳解:hashes數據類型及操作

  Redis的list類型其實就是一個每個子元素都是string類型的雙向鍊表。鍊表的最大長度是(2的32次方)。我們可以通過push,pop操作從鍊表的頭部或者尾部添加刪除元素。這使得list既可以用作棧,也可以用作隊列。

  有意思的是list的pop操作還有阻塞版本的,當我們[lr]pop一個list對象時,如果list是空,或者不存在,會立即返回nil。但是阻塞版本的b[lr]pop可以則可以阻塞,當然可以加超時時間,超時後也會返回nil。為什麼要阻塞版本的pop呢,主要是為了避免輪詢。舉個簡單的例子如果我們用list來實現一個工作隊列。執行任務的thread可以調用阻塞版本的pop去獲取任務這樣就可以避免輪詢去檢查是否有任務存在。當任務來時候工作線程可以立即返回,也可以避免輪詢帶來的延遲。說了這麼多,接下來看一下實際操作的方法吧:

  1、lpush

  在key對應list的頭部添加字符串元素:

redis 127.0.0.1:6379> lpush mylist "world"
(integer) 1
redis 127.0.0.1:6379> lpush mylist "hello"
(integer) 2
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379>

  在此處我們先插入了一個world,然後在world的頭部插入了一個hello。其中lrange是用於取mylist的內容。

  2、rpush

  在key對應list的尾部添加字符串元素:

redis 127.0.0.1:6379> rpush mylist2 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist2 "world"
(integer) 2
redis 127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379>

  在此處我們先插入了一個hello,然後在hello的尾部插入了一個world。

  3、linsert

  在key對應list的特定位置之前或之後添加字符串元素:

redis 127.0.0.1:6379> rpush mylist3 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist3 "world"
(integer) 2
redis 127.0.0.1:6379> linsert mylist3 before "world" "there"
(integer) 3
redis 127.0.0.1:6379> lrange mylist3 0 -1
1) "hello"
2) "there"
3) "world"
redis 127.0.0.1:6379>

  在此處我們先插入了一個hello,然後在hello的尾部插入了一個world,然後又在world的前面插入了there。

  4、lset

  設置list中指定下標的元素值(下標從0開始):

redis 127.0.0.1:6379> rpush mylist4 "one"
(integer) 1
redis 127.0.0.1:6379> rpush mylist4 "two"
(integer) 2
redis 127.0.0.1:6379> rpush mylist4 "three"
(integer) 3
redis 127.0.0.1:6379> lset mylist4 0 "four"
OK
redis 127.0.0.1:6379> lset mylist4 -2 "five"
OK
redis 127.0.0.1:6379> lrange mylist4 0 -1
1) "four"
2) "five"
3) "three"
redis 127.0.0.1:6379>

  在此處我們依次插入了one,two,three,然後將標是0的值設置為four,再將下標是-2的值設置為five。

  5、lrem

  從key對應list中刪除count個和value相同的元素。

  count>0時,按從頭到尾的順序刪除,具體如下:

redis 127.0.0.1:6379> rpush mylist5 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist5 "hello"
(integer) 2
redis 127.0.0.1:6379> rpush mylist5 "foo"
(integer) 3
redis 127.0.0.1:6379> rpush mylist5 "hello"
(integer) 4
redis 127.0.0.1:6379> lrem mylist5 2 "hello"
(integer) 2
redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "foo"
2) "hello"
redis 127.0.0.1:6379>

  count<0時,按從尾到頭的順序刪除,具體如下:

redis 127.0.0.1:6379> rpush mylist6 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist6 "hello"
(integer) 2
redis 127.0.0.1:6379> rpush mylist6 "foo"
(integer) 3
redis 127.0.0.1:6379> rpush mylist6 "hello"
(integer) 4
redis 127.0.0.1:6379> lrem mylist6 -2 "hello"
(integer) 2
redis 127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "foo"
redis 127.0.0.1:6379>

  count=0時,刪除全部,具體如下:

redis 127.0.0.1:6379> rpush mylist7 "hello"
(integer) 1
redis 127.0.0.1:6379> rpush mylist7 "hello"
(integer) 2
redis 127.0.0.1:6379> rpush mylist7 "foo"
(integer) 3
redis 127.0.0.1:6379> rpush mylist7 "hello"
(integer) 4
redis 127.0.0.1:6379> lrem mylist7 0 "hello"
(integer) 3
redis 127.0.0.1:6379> lrange mylist7 0 -1
1) "foo"
redis 127.0.0.1:6379>

  6、ltrim

  保留指定key 的值範圍內的數據:

redis 127.0.0.1:6379> rpush mylist8 "one"
(integer) 1
redis 127.0.0.1:6379> rpush mylist8 "two"
(integer) 2
redis 127.0.0.1:6379> rpush mylist8 "three"
(integer) 3
redis 127.0.0.1:6379> rpush mylist8 "four"
(integer) 4
redis 127.0.0.1:6379> ltrim mylist8 1 -1
OK
redis 127.0.0.1:6379> lrange mylist8 0 -1
1) "two"
2) "three"
3) "four"
redis 127.0.0.1:6379>

  7、lpop

  從list的頭部刪除元素,並返回刪除元素:

redis 127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379> lpop mylist
"hello"
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "world"
redis 127.0.0.1:6379>

  8、rpop

  從list的尾部刪除元素,並返回刪除元素:

redis 127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
2) "world"
redis 127.0.0.1:6379> rpop mylist2
"world"
redis 127.0.0.1:6379> lrange mylist2 0 -1
1) "hello"
redis 127.0.0.1:6379>

  9、rpoplpush

  從第一個list的尾部移除元素並添加到第二個list的頭部,最後返回被移除的元素值,整個操作是原子的.如果第一個list是空或者不存在返回nil:

redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
2) "foo"
3) "hello"
redis 127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "foo"
redis 127.0.0.1:6379> rpoplpush mylist5 mylist6
"hello"
redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
2) "foo"
redis 127.0.0.1:6379> lrange mylist6 0 -1
1) "hello"
2) "hello"
3) "foo"
redis 127.0.0.1:6379>

  10、lindex

  返回名稱為key的list中index位置的元素:

redis 127.0.0.1:6379> lrange mylist5 0 -1
1) "three"
2) "foo"
redis 127.0.0.1:6379> lindex mylist5 0
"three"
redis 127.0.0.1:6379> lindex mylist5 1
"foo"
redis 127.0.0.1:6379>

  11、llen

  返回key對應list的長度:

redis 127.0.0.1:6379> llen mylist5
(integer) 2
redis 127.0.0.1:6379>

相關焦點

  • Redis詳解:sets數據類型及操作
    【IT168 專稿】 set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交並差等操作,操作中key理解為集合的名字。  系列文章:  Redis詳解:strings數據類型及操作  Redis詳解:hashes數據類型及操作  Redis詳解:lists數據類型及操作  Redis的set是string類型的無序集合。set元素最大可以包含(2的32次方)個元素。
  • Redis入門教程:特性及數據類型的操作
    【IT168 技術】雖然Redis已經很火了,相信還是有很多同學對Redis只是有所聽聞或者了解並不全面,下面是一個比較系統的Redis介紹,對Redis的特性及各種數據類型及操作進行了介紹。是一個很不錯的Redis入門教程。
  • redis系列-基礎操作和數據類型
    Windows版本的redis伺服器只要點擊redis-server.exe即可啟動。但是客戶端的啟動需要我們熟悉一些命令行的輸入。命令行這種模式的工具我們一般需要學那些命令呢?的操作來對以上四點做個簡單的描述功能性命令:新增信息功能:設置 key,value 數據命令 set key value
  • Redis數據類型及場景應用
    一、 redis 特點所有數據存儲在內存中,高速讀寫提供豐富多樣的數據類型:string、 hash、 set、 sorted set、bitmap、hyperloglog提供了 AOF 和 RDB 兩種數據的持久化保存方式,保證了 Redis 重啟後數據不丟失Redis 的所有操作都是原子性的,還支持對幾個操作合併後的原子性操作,支持事務通常我們都把數據存到關係型資料庫中
  • redis數據類型及api操作,建議收藏
    1.stringstring是redis最基本的類型,你可以理解成與Memcached一模一樣的類型,一個key對應一個value。string類型是二進位安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象 。
  • redis數據類型使用場景_redis 五種數據類型的使用場景 - CSDN
    > HashSetsorted_set --> TreeSetString類型redis 數據存儲格式redis自身是一個Map類型的存儲方式,其中所有的數據都是採用key:value的形式存儲我們討論的數據類型指的是存儲的數據的類型,也就是value部分的類型,key部分永遠都是字符串
  • Redis數據類型知識分享
    字符串類型是redis最基礎的數據結構,首先鍵是字符串類型,而且其他幾種結構都是在字符串類型基礎上構建的,2. 所以字符串類型能為其他四種數據結構的學習尊定基礎。3. 字符串類型實際上可以是字符串4. (簡單的字符串、複雜的字符串(xml、json)、數字(整數、浮點數)、二進位(圖片、音頻、視頻)),5. 但最大不能超過512M。
  • Redis系列之數據類型
    上節我們介紹Redis的安裝和部署,這節我們就來正式步入學習Redis的過程,今天我們主要講講Redis中支持的數據類型。Redis支持數據類型有以下5種:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合),下面我們將一一介紹。
  • Redis的String類型的數據結構
    很多用過redis的同事都知道redis的5種基本數據結構。String、List、Hash、Set、zset。少部分同事會知道Redis中的Bitmap、Geo、HyperLogLog以及布隆過濾器。Redis這些數據類型的數據結構是怎麼設計的呢?人人都說redis對內存優化到了極致,具體是怎麼優化的呢?
  • 《Redis入門指南》第1集:Redis的5種數據類型
    想起最近學習了redis資料庫,所以嘗試用redis來搭建這個博客。首先第一個功能,發布文章,文章的發布有兩部分內容,一個是標題,一個是內容。這個功能可以用redis的字符型數據類型來實現。有的,是散列數據類型。散列類型所謂散列,就是我們常說的數組。有欄位有數值。
  • redis是什麼?有什麼用
    redis是什麼redis是一個高性能的key-value資料庫,它是完全開源免費的,而且redis是一個NOSQL類型資料庫,是為了解決高並發、高擴展,大數據存儲等一系列的問題而產生的資料庫解決方案,是一個非關係型的資料庫。
  • redis—底層數據結構詳解
    type:表示值的數據類型。當長度小於20,並且是數值類型時,其底層就是用long來進行數據存儲;這樣做的好處就是可以減少空間佔用,使用long的話最多也就佔8個字節,使用char類型的話,會佔用更多的內存空間。當存儲是字符串的數據時,並且字符串的長度小於等於44位元組時,以及長度大於22時,RedisObject和SDS會被分配到同一塊內存空間,這樣可以避免內存碎片化的問題,這種方式稱為embstr編碼方式。
  • 一文搞定Redis五大數據類型及使用場景
    字符串字符串類型是Redis最基礎的數據結構,字符串類型可以是JSON、XML甚至是二進位的圖片等數據,但是最大值不能超過512MB。1.1 內部編碼Redis會根據當前值的類型和長度決定使用哪種內部編碼來實現。字符串類型的內部編碼有3種:int:8個字節的長整型。embstr:小於等於39個字節的字符串。
  • 分享redis中除5種基礎數據類型以外的高級數據類型
    眾所周知,在redis中的數據類型有String(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)五種。但在這5種之外還有高級數據類型。今天和大家介紹下常用的高級數據類型:1、HyperLogLog。
  • Redis底層數據結構詳解
    上一篇說了Redis有五種數據類型,今天就來聊一下Redis底層的數據結構是什麼樣的。是這一周看了《redis設計與實現》一書,現來總結一下。(看書總是非常煩躁的!)的list數據類型的底層實現之一,類似於java集合類LinkedArrayList。
  • CentOS系統安裝Redis及Redis的PHP擴展詳解
    西崑雲這篇文章主要介紹了CentOS系統下安裝Redis資料庫的教程,以及詳解了Redis資料庫的PHP擴展,文中介紹的很詳細,相信對大家的理解和學習具有一定的參考借鑑價值,有需要的朋友們可以參考借鑑,下面來一起看看吧
  • Django實戰016:django中使用redis詳解
    安裝django-redisdjango-redis是一個使 Django支持 Redis cache/session 後端的全功能組件,通過該組件我們可以很方便快捷的操作redis。通過django_redis中的get_redis_connection來連接redis,連接成功之後通過redis提供的hash設置方法hset我們寫入一條數據。這裡我們定義一個名字叫jack的人,其中鍵為person,欄位為name,值為jack。
  • redis五種數據類型及使用場景
    無論存入的是字符串、整數、浮點類型都會以字符串寫入redis中所有的key都是字符串類型,其它幾種數據類型構成的元素也是字符串。注意字符串的長度不能超過512M。 常用命令: set,get,decr,incr,mget 等。
  • Redis的由來
    它支持多種類型的數據結構,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。
  • Redis怎麼實現查找附近的人之數據類型Geospatial
    前面我們已經把五大數據類型講完了,今天我開始講redis特殊數據類型Geospatial,地理位置的存儲,這個是數據類型可以實現朋友定位,兩個地方之間的距離,搜索附近的人等。具體操作就是將指定的地理空間位置(緯度、經度、名稱)添加到指定的key中,這些數據將會存儲到sorted set然後使用GEORADIUS或者GEORADIUSBYMEMBER命令對數據進行半徑查詢計算出範圍內的元素和元素之間的距離。