redis系統學習

2021-10-03 19:28:51 字數 4852 閱讀 1452

redis是乙個開源的、高效能的、基於鍵值對的快取與儲存系統,通過提供多種鍵值資料 型別來適應不同場景下的快取與儲存需求。同時 redis 的諸多高層級功能使其可以勝任訊息 佇列、任務佇列等不同的角色。

redis是remote dictionary server(遠端字典伺服器)的縮寫。

a.以字典結構儲存資料(字典是一些元素的集合,每乙個元素都有乙個稱作為key的域,不同的元素key是不同的)

b.支援記憶體儲存和資料持久化

redis的資料儲存在記憶體中,由於記憶體的讀寫速度遠快於硬碟,所以redis對於其他資料庫有著明顯的效能優勢。

資料儲存在記憶體中容易導致資料丟失,所以redis支援資料的持久化,可以將資料非同步寫入硬碟中。

c.功能豐富

c.1 redis可以為每乙個元素的key設定生存時間,生存時間到期後自動刪除key,並且支援持久化和有著5種豐富的資料型別,所以常用來作為快取系統。

c.2 利用redis的列表型別鍵可以實現高效的佇列。

c.3 redis支援「發布/訂閱」的訊息模式,可以實現聊天室系統。

d.簡單穩定

直觀的儲存結構和提供了大量的類庫,這些類庫很好的封裝了redis命令,使得程式和redis互動十分簡單。

redis是c語言開發,只有3萬多行**,並且是開源的,方便開發人員學習已經優化。

全域性命令:

獲取key:keys pattern

刪除key:del key [key…]

判斷乙個鍵是否存在:exists key

獲取鍵值型別:type key

3.1 字串型別

字串型別是 redis 中最基本的資料型別,它能儲存任何形式的字串,包括二進位制數 據。你可以用其儲存使用者的郵箱、json化的物件甚至是一張。乙個字串型別鍵允許 儲存的資料的最大容量是512 mb。字串型別是其他4種資料型別的基礎,其他資料型別和字串型別的差別從某種角度 來說只是組織字串的形式不同,例如,列表是以列表的形式儲存字串,集合以集合的形式來儲存字串。

相關命令:3.2雜湊型別

redis採用字典結構以鍵值對的形式儲存資料,而雜湊型別(hash)的鍵值也是一種字典結構,儲存了字段(key)和字段值(value)的對映,但字段值只能是字串,不能是其他資料型別。鍵值對的個數最多為2^32-1個。

相關命令:

賦值:hset key field value (字段已經存在的,會更新value)

欄位不存在是賦值:hsetnx key field value (字段已經存在的,不會更新value)

多個字段同時賦值:hmset key field1 value1 field2 value2 field3 value3

取單個欄位的值:hget key field

取多個欄位的值:hmget key field1 field2 field3

取所以欄位的值:hgetall key

增加數字:hincrby key field increment (沒有hincr,hdecr,hdecrby命令)

判斷field是否存在:hexists key field

刪除字段:hdel key field

只獲取欄位名:hkeys key

只獲取字段值:hvals key

獲取欄位的數量:hlen key

3.3列表型別

列表型別可以儲存乙個有序的字串列表,內部使用雙向鍊錶實現,所以向兩端新增元素的時間複雜度是o(1),資料是有序不唯一的,最多可以儲存2^31-1。

相關命令:

向列表左邊新增元素:lpush key value [value…]

向列表右邊新增元素:rpush key value [vlaue…]

從列表左邊彈出元素:lpop key

從列表右邊彈出元素:rpop key

獲取列表的元素個數:llen key

獲取列表片段:lrange key start stop (lrange命令支援負索引,表示從右邊開始計算序數,例如:」-1「表示右邊的第乙個元素,」-2「表示右邊的第二個元素,lrange numbers 0 -1 可以獲取列表中的所有元素)

刪除列表中指定的值:lrem key count value

lrem命令會刪除列表中前count個值為value的元素,返回值是實際刪除的元素個數。根 據count值的不同,lrem命令的執行方式會略有差異。

(1)當 count > 0時 lrem 命令會從列表左邊開始刪除前 count 個值為 value的元素。

(2)當 count < 0時 lrem 命令會從列表右邊開始刪除前|count|個值為 value 的元素。

(3)當 count = 0是 lrem命令會刪除所有值為 value的元素。

獲取指定索引的值:lindex key index

設定指定索引的值:lset key indx value

保留列表指定的片段:ltrim key start top (ltrim 命令可以刪除指定索引範圍之外的所有元素)

向列表插入元素:linsert key before|after pivot value

linsert 命令首先會在列表中從左到右查詢值為 pivot 的元素,然後根據第二個引數是 before還是after來決定將value插入到該元素的前面還是後面。

將元素從乙個列表轉到另乙個列表:rpoplpush source destination

先執行rpop命令再執行lpush命令。rpoplpush命令會先從source列表型別鍵的右邊彈出乙個元素,然後將其加入到destination列表型別鍵的左邊,並返回這個元素的值,整個過程是原子的。

3.4集合型別

新增成員:sadd key member[member…]

獲得集合中的所有成員:smembers key

判斷元素是否在集合中:sismember key member

集合間的運算:

差集運算:sdiff key [key…] (集合a與集合b的差集表示為a?b,代 表所有屬於a且不屬於b的元素構成的集合)

交集運算:sinter key [key…] (集合a與集合b的交集表示為a ∩ b, 代表所有屬於a且屬於b的元素構成的集合)

並集運算:sunion key [key…] (集合a與集合b的並集表示為a∪b, 代表所有屬於a或屬於b的元素構成的集合)

獲取集合中的成員個數:scard key

進行集合運算並將結果儲存:

sdiffstore destination key [key …]

sdiffstore命令和sdiff命令功能一樣,唯一的區別就是前者不會直接返回運算結果, 而是將結果儲存在destination鍵中。

sinterstore destination key [key …]

sdiffstore命令常用於需要進行多步集合運算的場景中,如需要先計算差集再將結果 和其他鍵計算交集。

sunionstore destination key [key …]

sinterstore和sunionstore命令與之類似,不再贅述。

隨機獲得集合中的元素:srandmember key [count] (還可以傳遞count引數來一次隨機獲得多個元素)

從集合中彈出乙個元素:spop key

3.5有序集合型別

在集合型別的基礎上有序集合型別為集合中的每個元素都關聯了乙個分數,使得我們不僅可以完成插入,刪除和判斷元素是否存在等集合型別支援的操作,還能狗獲得分數最高的前n個元素,獲得指定分數範圍內的元素等與分數相關的操作,有序集合的每個元素雖然不同,但他們的分數是可以相同的。使用雜湊表和跳躍表實現的,所以讀取中間元素的速度也非常快。

相關命令:

增加元素:zadd key score member [score member …]

獲取元素的分數:zscore key memeber

獲得排名在某個範圍的元素列表:zrange key start stop [withscores]

獲得指定分數範圍的元素:zrangebyscore key min max [withscores] [limit offset count] (如果希望分數範圍不包含端點值,可以在分數前加上「(」符號。min和max還支援無窮大,同zadd命令一樣,-inf和+inf分別表示負無窮和正無窮。如果需要同時獲得元素的分數的話可以在 zrange 命令的尾部加上 withscores 參 數,limit offset count 與 sql 中的用法基本相同,即在獲得的元素列表的基礎上向後偏移offset個元素,並且只獲 取前count個元素。)

增加某個元素的分數:zincrby key increment member (如果指定的元素不存在,redis 在執行命令前會先建立它並將它的分數賦為 0 再執行操作。)

獲得集合中元素的數量:zcard key

獲得指定分數範圍內的元素個數:zcount key min max

刪除乙個或多個元素:zrem key member [member …]

按照排名範圍刪除元素:zremrangebyrank key start stop (按照元素分數從小到大的順序(即索引 0表示最小的值) 刪除處在指定排名範圍內的所有元素,並返回刪除的元素數量。)

按照分數範圍刪除元素:zremrangebyscore key min max (會刪除指定分數範圍內的所有元素)

獲得元素的排名:zrank key member

計算有序集合的交集:zinterstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum|min|max]

Redis系統學習 應用 佇列

此處可分為,訊息佇列 和 延時佇列 訊息佇列 專案中經常用到訊息機制,mq和kafka都很成熟了,所以某些專門的訊息處理還是交給他們。但是專案中有的只需要自己發自己收,實現非同步處理,redis也可以實現。基於list,當成佇列使用。此處有個問題,佇列空了就會出現,無效的查詢,業務系統的cpu增加負...

Redis系統學習 其他應用

redis很多應用都有其他更有的選擇,統一放一起。hyperloglog hyperloglog 提供不精確的去重計數方案,雖然不精確但是也不是非常不精確,標準誤差是 0.81 老錢在 redis深度歷險 核心原理和應用實踐 用 的uv來舉例,但是我們日常專案中,除非小公司,一般的公司都會有bi部門...

Ubuntu系統學習

分割槽 檔案系統型別 預設為 ext4,檔案系統分很多種,ext2 ext3 ext4 fat ntfs等等 什麼是檔案系統 檔案系統是作業系統用於明確磁碟或分割槽上的檔案的方法和資料結構 即在磁碟上組織檔案的方法。兩種檔案系統的對比 linux目錄結構 所有目錄都在 boot boot 配置檔案 ...