redis 五種資料型別入門到例項精通

2021-09-14 05:31:08 字數 4015 閱讀 1834

速度快資料存在記憶體中。

c語言實現,「距離」作業系統越近執行速度越快。

單執行緒,預防了多執行緒可能產生的競爭問題。

redis源**精打細磨。

鍵值對的資料結構儲存

五中鍵值對的形式,許多的應用場景,提高開發效率。

功能多鍵過期

發布訂閱

lua指令碼

事務功能

流水線簡單穩定

原始碼少單執行緒

不需要依賴作業系統的類庫,自己實現了事件處理的先關功能。

穩定到幾乎沒有宕機的情況。

客戶端語言多

提供了tcp通訊協議,很多程式語言可以很方便的接入到redis。

持久化rdb和aof

主從複製

高可用和分布式 快取

訪問快降低後端資料來源的壓力

鍵值過期,靈活控制最大記憶體和記憶體溢位後的淘汰策略。

排行榜系統

利用列表和有序集合的資料結構

計數器應用

利用加1操作

社交網路

redis提供的資料結構更好實現:贊/踩、粉絲、共同好友/喜好、推送、下拉重新整理等。

訊息佇列

冷資料。

資料規模相對比較大的。

檢視所有鍵

keys *

當儲存特別鍵的時候謹慎使用

鍵總數dbsize

鍵是否存在

exists key

存在返回1,不存在返回0。

刪除鍵del key 【鍵名字】

返回刪除鍵的個數,不存在返回0。

支援刪除多個鍵:del a b c

鍵過期expire 【key】【seconds】

ttl 【key】檢視鍵剩餘時間。

返回大於等於0的整數。-1:鍵沒設定過期時間。-2鍵不存在。

鍵的資料型別

type 【key】

鍵不存在返回none

資料型別都有自己的實現編碼,多種實現。redis會在合適的場景選擇合適的內部編碼。

檢視內部編碼命令:object encoding hello

redis設定內部編碼的兩個好處。

改進內部編碼對外的資料結構和命令沒有影響。對使用者基本感知不到。

資料型別的多種實現編碼在不同環境會轉換。例如列表的內部編碼,ziplist比較節省記憶體,但是在列表元素比較多的情況下,效能會有所下降,這時redis會根據配置選項列表型別的內部實現轉換為linkdlist。

字串常用命令

內部編碼3種

int:8個位元組的長整型。

embstr:小於等於39個位元組的字串。

raw:大於39個位元組的字串。

應用場景

快取功能(常用)

計數——利用自增1。

共享session

限速——一分鐘不超過5次,利用鍵過期和自增/自減。

value值最大為512mb

雜湊hash——value=,…}

常用命令

內部編碼,兩種

ziplist(壓縮列表):雜湊型別的元素個數小於hash-max-zoplist-entries配置(預設512個)。所有值都小於hash-max-ziplist-value配置(預設64位元組)。ziplist使用更加緊湊的結構實現多個元素的連續儲存,所以在節省記憶體方面比hashtable更加優秀。

hashtable(雜湊表):當ziplist無法滿足雜湊的條件時,元素多於512個或value大與64位元組時ziplist的讀寫速度效率會下降。redis會轉換成hashtable實現,讀寫快。

應用場景

雜湊來儲存關係型資料表記錄。

需要注意的是雜湊型別是稀疏的,而關係型資料庫是完全結構化的。關係型資料庫可以做複雜的關係查詢,redis很難。

三種實現的優缺點

原聲字串型別:每個屬性乙個鍵

set user:1:name tome

set user:1:age 23

set user:1:city beijing

優點:簡單直觀。

缺點:占用過多的鍵,記憶體佔用量較大,同時使用者資訊內舉行比較差,一般不會在生產環境使用。

序列化字串型別:將使用者資訊序列化用乙個鍵儲存。

set user:1: serialize(userinfo)

優點:簡化程式設計,如果合理的使用序列化可以提高記憶體的使用效率

缺點:序列化和反序列化有一定的開銷,同時每次更新屬性都需要把全部資料取出進行反序列化,更新後再序列化到redis中。

雜湊型別:每個使用者屬性使用一對field-value,但是只用乙個鍵儲存。

hmset user:1: name tom age 23 city beijing

優點:簡單直觀如果使用合理可以減少記憶體空間的使用

列表list——列表最多儲存2的23次方,減乙個元素。列表在兩端進行插入和彈出。

特點:1、列表中的元素是有序的,通過索引小標獲取某個元素和某個範圍的元素列表。2、元素可重複。

常用命令

內部編碼

ziplist(同上)

linkedlist(鍊錶):當ziplist無法滿足列表條件時,redis會使用linkedlist作為列表的內部實現。

應用場景

訊息佇列

利用redis的lpush+brpop命令實現阻塞佇列,多客戶端使用brpop命令阻塞式的「搶」列表兒,多客戶端保證了消費的負載均衡和高可用行。

文章列表

利用列表的有序性,不僅有序,同時支援索引範圍獲取元素。

其餘lpush+lpop = stack(棧)

lpush+rpop = queue(佇列)

lpush+brpop = massage queue(訊息佇列)

集合set——儲存多個元素,不予許重複並且元素無序。乙個元素最多可儲存2的32次方,減乙個元素。支援多個集合的交集、並集、差集,合理地使用好集合型別解決很多實際問題。

常用命令

集合內新增元素

sadd 【key】【 element element…】

返回結果為新增成功的個數。

刪除元素

srem 【key】【element element…】

返回刪除成功的個數。

計算元素個數

scard 【key】

判斷元素是否在集合中

sismemeber 【key】【element】

element在集合中返回1,反而為0。

隨機從集合返回指定個數元素

srandmember 【key】[count]

count是可選引數,不寫預設為1

從集合隨機彈出元素

spop 【key】

redis3.2版本開始支援spop[count]引數。

與srandmember的區別,spop彈出後在集合中刪除了。

獲取所有元素

smembers 【key】

當元素比較多時可能會發生阻塞

集合間操作多個集合的交集

sadd user:1:follow it music his sports

sadd user:2:follow it news ent sports

交集:sinter 【key1 key2】

並集sunion 【key1 key2】

差集sdiff 【key1 key2】

返回key1的字元

交並差的結果儲存

sinterstore key1_2 【key1 key2】

sunionstore key1_2 【key1 key2】

sdiffstore key1_2 【key1 key2】

將key1和key2操作後的記過儲存在key1_2中。

內部編碼兩種

intset整數集合:集合中的元素都為整數並且個數小於set-max-instet-entries配置(512個),為了減少使用記憶體的使用。

hashtable雜湊表:集合無法滿足intset時,使用hashtable作為內部實現。

應用場景

有序集合

Redis 五種資料型別

一 前言 上篇部落格已經對redis的一些基本知識做了一些簡介,這篇部落格,將簡單介紹一些redis的五種資料型別。分別為string 字串 hash 雜湊 list 鍊錶 set 集合 zset 有序集合 對這些型別可以執行很多原子性的操作 比如向乙個string型別的value後面追加字串 向l...

Redis 五種資料型別

目錄 redis共有strings hashs lists sets sorted sets五種資料型別,可以說已經比較豐富了。下面只對這幾種資料型別的資料結構與用途做簡要介紹。至於每種資料型別的操作api,這裡只簡單一提,不再一一詳細介紹,有需要的使用者可以google即可。string是最簡單的...

Redis 五種資料型別

redis支援五種資料型別 string 字串 hash 雜湊 list 列表 set 集合 及zset sorted set 有序集合 資料型別一 字串 0.1 6379 set name hubotao2 ok127.0 0.1 6379 get name hubotao2 資料型別二 hash...