主頁 > 資料庫 > Redis入門(2) - 資料型別

Redis入門(2) - 資料型別

2020-09-10 14:50:00 資料庫

  • Redis中的資料型別
  • 字串
  • 散列
  • 串列
  • 集合
  • 有序集合

Redis中的資料型別

Redis定義了這幾種資料型別:

  • string(字串)
  • hash(散列)
  • list(串列)
  • set(集合)
  • zset(有序集合)
    后面會介紹它們各自的特點和使用場景,可以用TYPE命令來獲取鍵的型別,

字串

字串型別是Redis中最基本的資料型別,它能存盤任何形式的字串,包括二進制資料,可以用其存盤用戶的郵箱、JSON化的物件甚至是一張圖片,一個字串型別鍵允許存盤的資料的最大容量是512 MB,
字串型別是其他4種資料型別的基礎,其他資料型別和字串型別的差別從某種角度來說只是組織字串的形式不同,例如,串列型別是以串列的形式組織字串,而集合型別是以集合的形式組織字串,

賦值、取值

SET key value
GET key

SET成功回傳OK,GET鍵不存在時回傳空(nil),

增加、減少數字

當操作的字串是數字形式時,可以用這些命令方便地增加、減少數字
遞增、遞減操作分別為:

INCR key
DECR key

當操作的鍵不存在時,會先創建一個默認為0的值,所以使用INCR得到的結果為1,
如果被操作的鍵值不是整數,會給出錯誤提示: (error) ERR value is not an integer or out of range

增加、減少指定整數:

INCRBY key increment
DECRBY key decrement

INCRBY key1 3就相當于DECRBY key1 -3

增加、減少指定浮點數,支持雙精度浮點數,

INCRBYFLOAT key increment
DECRBYFLOAT key decrement

這些命令都是原子操作,可以保證多客戶端連接的并發場景下讀取寫入不會出錯,

向尾部追加值

APPEND key value

如果鍵不存在則將該鍵的值設定為value,回傳值是追加后字串的總長度,

> SET key1 hello
OK
> APPEND key " world!"
(integer) 12

上面的操作得到的就是“hello world”,由于需要在單詞之間有空格,append時的值用雙引號包裹,

獲取字串長度

STRLEN key

如果鍵不存在則回傳0,

同時獲取/設定多個鍵值

MGET key1 key2 ...
MSET key value key1 value1 ...

散列

Redis是采用字典結構以鍵值對的形式存盤資料,而散列型別(hash)的鍵值也是一種字典結構,其存盤了欄位(field)和欄位值的映射,但欄位值只能是字串,不支持其他資料型別,所以不能嵌套存盤其他資料型別,Redis的其他資料型別也不支持資料型別的嵌套,比如集合型別的每個元素都只能是字串,
一個散列型別的鍵可以最多包含2^32-1個欄位,
散列型別適合存盤物件,使用類名和ID構成鍵名,使用欄位表示物件的屬性,而欄位值則存盤屬性的值,這樣散列型別就與最簡單的DTO類構成了映射關系,

賦值與取值

 HSET key field value
 HGET key field

這組命令用來設定、獲取單個欄位的值,HSET命令不區分插入和更新操作,修改資料時不用事先判斷欄位是否存在來決定要執行的是插入還是更新,可以通過命令的回傳結果來判斷插入還是更新,插入時回傳1,更新時會回傳0,當鍵或者欄位不存在時,HSET命令還會自動建立它們,

HMSET、HMGET則可以一次操作多個欄位:

 HMSET key field value [field value ...]
 HMGET key field [field value  ...]

獲取鍵的所有欄位使用HGETALL:

 HGETALL key

這個命令回傳的結果是欄位和欄位值組成的串列:

1)"price"
2)"500"
3)"name"
4)"BMW"

判斷欄位是否存在

 HEXISTS key field

如果存在則回傳1,否則回傳0,如果鍵不存在也會回傳0,

當欄位不存在時賦值

HSETNX key field value

HSETNX命令只有當欄位不存在時才進行賦值,如果欄位已經存在,將不執行任何操作,

增加、減少數字

HINCRBY key field increment

需要減少值時增量設為負值,如果鍵或者值不存在時將初始化并設定為1,

洗掉欄位

HDEL key field1 field2 ...

可以洗掉一個或多個欄位,被洗掉的欄位個數作為回傳值,

只獲取欄位名或欄位值

HKEYS key
HVALS key

這組命令會獲取鍵中所有欄位的名稱或值,

串列

串列型別可以存盤一個有序的字串串列,常用的操作是向串列兩端添加元素,或者獲得串列的某一個片段,串列型別內部是使用雙向鏈表實作的,向串列兩端添加元素的時間復雜度為O(1),獲取越接近兩端的元素速度就越快,但通過索引訪問元素的速度卻比較慢,

所以串列型別最適合于訪問前某幾個元素的場景,比如熱點新聞,一個串列型別鍵最多能容納的元素數量也是2^32-1個,

向串列兩端增加元素

 LPUSH key value [value ...]
 RPUSH key value [value ...]

LPUSH和RPUSH分別用來先串列的左邊和右邊增加元素,回傳值表示增加元素后串列的長度,可以同時增加多個元素,

從串列兩端彈出元素

 LPOP key
 RPOP key

LPOP和RPOP分別從串列的左邊和右邊彈出一個元素,回傳值元素的內容,如果串列為空,回傳(nil),

獲取串列中元素的個數

 LLEN key

如果串列為慷訓不存在,則回傳0,

獲得串列片段

 LRANGE key start stop

回傳索引從start到stop之間的所有元素(包含兩端的元素),與大多數人的直覺相同,Redis的串列起始索引,左邊為從0開始,右邊為從-1開始,-2表示右邊第二個元素,以此類推,
如果start的索引位置比stop的索引位置靠后,則會回傳空串列;如果stop大于實際的索引范圍,則會回傳到串列最右邊的元素,

洗掉串列中指定的值

LREM key count value

洗掉串列中前count個值為value的元素,回傳值是實際洗掉的元素個數,
count值的正負會決定從洗掉開始的方向:

  • 當count>0時LREM命令會從串列左邊開始洗掉前count個值為value的元素;
  • 當count<0時LREM命令會從串列右邊開始洗掉前|count|個值為value的元素;
  • 當count=0時LREM命令會洗掉串列中所有值為value的元素,

獲得/設定指定索引的元素值

LINDEX key index
LSET key index value

與LREM類似,index >= 0表示從左邊開始計算索引,index < 0則從右邊開始,

只保留串列指定片段

LTRIM key start end

洗掉指定索引范圍之外的所有元素,其指定串列范圍的方法和LRANGE命令相同,

向串列中插入元素

LINSERT key BEFORE|AFTER privot value

LINSERT命令首先會在串列中從左到右查找值為pivot的元素,然后根據第二個引數是BEFORE還是AFTER來決定將value插入到該元素的前面還是后面,命令的回傳值是插入后串列的元素個數,

將元素從一個串列轉到另一個串列

RPOPLPUSH source destination

這個命令會先對source執行RPOP命令,從它的右邊彈出一個元素,再對destination執行LPUSH命令,將元素加入到這個串列的左邊,并回傳這個元素的值,整個程序是原子的,
RPOPLPUSH命令可以很直觀地在多個佇列中傳遞資料,當source和destination相同時,RPOPLPUSH命令會不斷地將隊尾的元素移到隊首,同時串列中仍然可以增加、洗掉元素,

集合

同串列型別相比,集合型別中的元素不能相同,同時元素沒有順序,
一個集合型別鍵可以存盤的字串數量最多也是2^32 -1個,
集合型別的常用操作是向集合中加入或洗掉元素、判斷某個元素是否存在等,由于集合型別在Redis內部是使用值為空的散串列(hashtable)實作的,所以這些操作的時間復雜度都是O(1),最方便的是多個集合型別鍵之間還可以進行并集、交集和差集運算,

增加/洗掉元素

 SADD key member [member ...]
 SREM key member [member ...]

這組命令用來向集合中增加或洗掉一個或多個元素,增加時如果鍵不存在則會自動創建,因為在一個集合中不能有相同的元素,所以增加時如果要加入的元素已經存在于集合中,就會忽略這個元素,命令的回傳值是成功加入或洗掉的元素數量,

獲得集合中的所有元素

 SMEMBERS key

判斷元素是否在集合中

 SISMEMBER key mumber

這項操作的時間復雜度為O(1),無論集合中有多少個元素,SISMEMBER命令都可以非常快地回傳結果,當值存在時回傳1,不存在或鍵不存在時回傳0,

獲得集合中元素個數

SCARD key

集合間運算

 SDIFF key [key...]
 SINTER key [key...]
 SUNION key [key...]

這組命令用來對多個集合進行差集、交集、并集運算,

 SDIFFSTORE destination key [key...]
 SINTERSTORE destination key [key...]
 SUNIONSTORE destination key [key...]

這組命令會把集合間運算的結果存盤到destination中,

有序集合

有序集合型別與集合型別相比,它為其中的每個元素都關聯了一個分數,這使得可以對元素進行取前N個、獲得指定分數范圍內的元素等操作,
有序集合中的元素也是各不相同的,但元素的分數可以相同,

有序集合型別與串列型別相比,相似的地方在于二者都是有序的,也都可以獲得指定范圍的元素;但他們的區別大于共性:

  • 在存盤結構上,串列型別是通過鏈表實作的,獲取靠近兩端的資料速度極快,而當元素增多后,訪問中間資料的速度會較慢,所以它更適合很少訪問中間元素的場景;有序集合型別則是使用散串列和跳躍表實作的,所以即使讀取位于中間部分的資料速度也很快,

  • 串列中不能簡單地調整某個元素的位置,但是在有序集合中通過更改元素的分數就可以做到,

  • 有序集合要比串列型別更耗費記憶體,

增加元素

 ZADD key score member [score member ...]

ZADD命令用來向有序集合中加入若干元素和該元素的分數,如果該元素已經存在則會用新的分數替換原有的分數,命令的回傳值是新加入到集合中的元素個數(不包含之前已經存在的元素),
這里設定的分數可以是整數,也可以是雙精度浮點數,還可以設定為+inf和-inf來分別表示正無窮和負無窮,

獲得元素的分數

 ZSCORE key member

獲得排名在某個范圍的元素串列

 ZRANGE key start stop [WITHSCORES]
 ZREVRANGE key start stop [WITHSCORES]

ZRANGE和ZREVRANGE命令分別按照元素分數從小到大和從大到小的的順序回傳索引從start到stop之間的所有元素(包含兩端的元素),
在命令的尾部加上WITHSCORES可以同時獲得元素的分數,
如果兩個元素的分數相同,Redis會按照字典順序(即"0" < "9" <"A" < "Z" < "a" < "z"這樣的順序)來進行排列,如果元素是中文,會按照中文編碼來排序,

索引>=0表示從前往后查找,為<0表示從后往前查找,

 ZRANGE key1 0 4
 ZRANGE key1 1 -1

獲得指定分數范圍的元素

 ZRANGEBYSCORE key min max [WITHSCORE] [LIMIT offset count]

按照元素分數從小到大的順序回傳分數在min和max之間的元素,默認包含min和max,如果希望分數范圍不包含端點值,可以在分數前加上'('符號

 ZRANGEBYSCORE key1 (60 80

這樣寫獲取的范圍就是 60< score <= 80,

這里也同樣可以用-inf和+inf分別表示負無窮和正無窮,

用WITHSCORES可以同時獲得元素的分數,

[LIMIT offset count]表示在獲得的元素串列的基礎上向后偏移offset個元素,并且只獲取前 count個元素,
比如想獲得分數高于60分的從第二個人開始的3個人:

 ZRANGEBYSCORE key1 60 +inf LIMIT 1 3

與ZRANGEBYSCORE對應的,還有ZREVRANGEBYSCORE,它會按照元素分數從大到小的順序回傳分數在max和min之間的元素

 ZREVRANGEBYSCORE key max min [WITHSCORE] [LIMIT offset count]

增加某個元素的分數

 ZINCRBY key increment member

回傳值是更改后的分數,這個操作也是原子的,

獲得指定分數范圍內的元素個數

 ZCOUNT key min max

min max可以指定為+inf -inf,也可以用(來設定邊界條件,

洗掉一個或多個元素

 ZREM key member [member ...]

回傳值是成功洗掉的元素數量(不包含本來就不存在的元素),

按照排名范圍洗掉元素

 ZREMRANGEBYRANK key start stop

按照元素分數從小到大的順序(即索引0表示最小的值)洗掉處在指定排名范圍內的所有元素,并回傳洗掉的元素數量,索引負值表示從后向前查找,

按照分數范圍洗掉元素

 ZREMRANGEBYSCORE key min max

洗掉指定分數范圍內的所有元素,引數min和max的特性和ZRANGEBYSCORE命令中的一樣,回傳值是洗掉的元素數量,

獲得元素的排名

 ZRANK key member
 ZREVRANK key member

這組命令會分別按照元素分數從小到大、從大到小的順序獲得指定的元素的排名(從0開始,即分數最小或最大的元素排名為0)

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/2465.html

標籤:NoSQL

上一篇:Cassandra配置JMX

下一篇:Redis學習筆記(十二) 復制(上)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more