首頁 資料庫 Redis redis資料類型及應用程式場景

redis資料類型及應用程式場景

Feb 13, 2020 pm 01:23 PM
redis 應用場景 資料類型

redis資料類型及應用程式場景

redis資料型別及應用場景

Redis支援5種資料型別:string(字串),hash(雜湊),list (列表),set(集合)及zset(sorted set:有序集合)。

1、string

簡介:Strings資料類型是最常用、簡單的key-value類型,普通的key/ value 儲存都可以歸為此。 value不只可以是字串,也可以是數字。因為是二進位安全的,所以你完全可以把一個圖片檔案的內容當作string來儲存。 Redis的string可以完全實現目前memcached的功能,並且效率更高。除了提供與Memcached 一樣的get、set、incr、decr 等操作外,Redis還額外提供了下面一些操作:

1. 取得字串長度

2. 往字串append內容

3. 設定與取得字串的某一段內容

4. 設定及取得字串的某一位(bit)

5. 批次設定一系列字串的內容

常用指令: set,get,decr,incr,mget 等。

應用場景:

1. 應用 Memcached和CKV的所有場景。字串和數字直接存取。結構化資料需要先序列化,再set到value;對應的,get到value後要反序列化。

2. 可以利用redis的INCR、INCRBY、DECR、DECRBY等指令來實現原子計數的效果。即可以用來實現業務上的統計計數需求。也可用於實作idmaker,即產生全域唯一的id。

3. 存放session key,實作一個分散式session系統。 Redis的key可以方便地設定過期時間,用於實現session key的自動過期。驗證skey時先根據uid路由到對應的redis,如取不到skey,則表示skey已過期,需要重新登入;如取到skey且校驗通過則升級此skey的過期時間即可。

4. Set nx或SetNx,僅當key不存在時才Set。可以用來選出Master或實作分散式鎖定:所有Client不斷嘗試使用SetNx master myName搶註Master,成功的那位不斷使用Expire刷新它的過期時間。如果Master掛掉了key就會失效,剩下的節點又會發生新一輪搶奪。

5. 借助redis2.6開始支援的lua腳本,可以實現更安全的2種分散式鎖定:一種適用於各進程競爭但總是單一進程獲取鎖並處理的場景。除非原處理程序掛掉因而鎖過期才會被其它程序取得到鎖。無須主動解鎖。透過get、expire/pexpire、setnx ex| px的lua腳本實作;一種適用於各流程競爭取得鎖定並處理的場景。透過set nx ex| px取得鎖,用完需要先get判斷再del釋放鎖,否則在鎖過期之前不能取得到鎖。

6. GetSet, 設定新值,傳回舊值。例如實作一個計數器,可以用GetSet取得計數並重置為0。

7. GetBit/SetBit/BitOp/BitCount, BitMap的玩法,例如統計今天的獨立存取用戶數時,每個註冊用戶都有一個offset,他今天進來的話就把他那個位設為1,用BitCount就可以得出今天的總人數。

8. Append/SetRange/GetRange/StrLen,對文字進行擴展、替換、截取和求長度,對特定資料格式非常有用。

實作方式:String在redis內部儲存預設就是一個字串,被redisObject所引用,當遇到incr,decr等操作時會轉成數值類型進行計算,此時redisObject的encoding欄位為int 。

二、Hash

簡介:Hash存的是字串和字串值之間的對應。 Hash將物件的各個屬性存入Map裡,可以只讀取/更新物件的某些屬性。這樣有些屬性超長就讓它一邊呆著不動,另外不同的模組可以只更新自己關心的屬性而不會互相並發導致覆蓋衝突。

常用指令:hget,hset,hgetall 等。

應用程式場景:

1. 存放結構化數據,例如使用者資訊。在Memcached或CKV中,對於使用者資訊例如使用者的暱稱、年齡、性別、積分等,我們需要先序列化後儲存為字串的值,這時候在需要修改其中某一項時,通常需要將所有值取出反序列化後,修改某一項的值,再序列化儲存回去。這樣不僅增大了開銷,也不適用於一些可能並發操作的場合(例如兩個並發的操作都需要修改積分)。而Redis的Hash結構可以讓你像在資料庫中Update一個屬性一樣只修改某一項屬性值。如下圖:

2. Key是使用者ID, value是一個Map,這個Map的key是成員的屬性名,value是屬性值,這樣資料的修改和存取都可以直接透過其內部Map的Key(Redis裡稱內部Map的key為field), 也就是透過key(用戶ID) field(屬性標籤) 就可以操作對應屬性數據了,既不需要重複存儲數據,也不會帶來序列化和並發修改控制的問題。

3. 不過這裡需要注意,Redis提供了介面(hgetall)可以直接取到全部的屬性資料,但是如果內部Map的成員很多,那麼涉及到遍歷整個內部Map的操作,由於Redis單執行緒模型的緣故,這個遍歷操作可能會比較耗時,而對其它客戶端的請求完全不響應,這點需要格外注意。

4. 可用來建立索引。例如User對象,除了id有時還要按name來查詢,可以建一個Key為user:name:id的Hash,在插入User對象時(set user:101{"id":101,"name":"calvin "}), 順便往這個hash插入一條(hset user:name:id calvin 101),這時calvin作為hash裡的一個key,值為101。按name查詢的時候,用hgetuser:name:id calvin 就能從名為calvin的key裡取出id。如果需要使用多種索引來查找某條資料時可以使用,一個hash key搞定,避免使用多個string key存放索引值。

5. HINCRBY同樣可用來實作idmaker。相對string類型的idmaker每一個類型需要一個key,hash類型的用一個key即可。

實作方式:

Redis Hash對應Value內部實際就是一個HashMap,這裡會有2種不同實現,這個Hash的成員比較少時Redis為了節省記憶體會採用類似一維數組的方式來緊湊存儲,而不會採用真正的HashMap結構,對應的value redisObject的encoding為zipmap,當成員數量增大時會自動轉成真正的HashMap,此時encoding為ht。

三、List

簡介:List是雙向鍊錶,支援雙向的Pop/Push,江湖規矩一般從左端Push,右端Pop-LPush/RPop ,而且還有Blocking的版本BLPop/BRPop,客戶端可以阻塞在那直到有訊息到來。還有RPopLPush/ BRPopLPush,彈出來返回給client的同時,把自己又推入另一個list,LLen獲取列表的長度。還有按值進行的操作:LRem(按值刪除元素)、LInsert(插在某個值的元素的前後),複雜度是O(N),N是List長度,因為List的值不唯一,所以要遍歷全部元素,而Set只要O(log(N))。

按下標進行的動作:下標從0開始,佇列由左至右算,下標為負數時則由右至左。 LSet ,按下標設定元素值。 LIndex,按下標返回元素。 LRange,不同於POP直接彈走元素,只是傳回清單內一段下標的元素,是分頁的最愛。 LTrim,限制List的大小,例如只保留最新的20則訊息。複雜度也是O(N),其中LSet的N是List長度,LIndex的N是下標的值,LRange的N是start的值列出元素的個數,因為是鍊錶而不是數組,所以按標訪問其實要遍歷鍊錶,除非下標正好是隊頭和隊尾。 LTrim的N是移除元素的個數。

常用指令:lpush,rpush,lpop,rpop,lrange等。

應用場景:

1. 各種列表,例如twitter的關注列表、粉絲列表等,最新消息排行、每篇文章的評論等也可以用Redis的list結構來實現。

2  訊息佇列,可以利用Lists的PUSH操作,將任務存在Lists中,然後工作執行緒再用POP操作將任務取出執行。這裡的訊息佇列並沒有ack機制,如果消費者把任務給Pop走了又沒處理完就死機了怎麼辦?其中一個解決方法是加多一個sorted set,分發的時候同時發到list與sorted set,以分發時間為score,用戶把任務做完了之後要用ZREM消掉sorted set裡的job,並且定時從sorted set中取出超時沒有完成的任務,重新放回list。另一個做法是為每個worker多加一個的list,彈出任務時改用RPopLPush,將job同時放到worker自己的list中,完成時用LREM消掉。如果叢集管理(如zookeeper)發現worker已經掛掉,就將worker的list內容重新放回主list。

3  利用LRANGE可以很方便的實現list內容分頁的功能。

4. 取最新N個資料的操作:LPUSH用來插入一個內容ID,作為關鍵字儲存在清單頭部。 LTRIM用來限制清單中的項目數最多為5000。如果使用者需要的檢索的資料量超越這個快取容量,這時才需要把請求傳送到資料庫。

實作方式:

Redis list的實作為雙向鍊錶,即可以支援反向查找和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷,Redis內部的很多實現,包括發送緩衝隊列等也都是用的這個資料結構。

四、Set

簡介:是一種無序的集合,集合中的元素沒有先後順序,不重複。將重複的元素放入Set會自動去重。

常用指令:

sadd,spop,smembers,sunion等。

應用場景:

1. 某些需要去重的列表,並且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。

2. 可以儲存一些集合性的數據,例如在微博應用中,可以將一個用戶所有的追蹤人存在一個集合中,將其所有粉絲存在一個集合。 Redis也為集合提供了求交集、並集、差集等操作,可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果傳回給客戶端還是存集到一個新的集合。又例如QQ有一個社交功能叫做“好友標籤”,大家可以給你的好友貼標籤,比如“大美女”、“土豪”、“歐巴”等等,這裡也可以把每個用戶的標籤都存放在一個集合之中。

3. 想要知道某些特定的註冊使用者或IP位址,他們到底有多少造訪了某個頁面,可以這樣實現:SADD page:day1: 。想知道特定使用者的數量,使用SCARD page:day1:。需要測試某個特定使用者是否造訪了這個頁面? SISMEMBER page:day1:

實作方式:

set 的內部實作是value永遠是null的HashMap,實際上就是透過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因。

五、Sorted Set

簡介:有序集合,相較於set,元素放入集合時還要提供該元素的分數,可依分數自動排序。

常用指令:

zadd,zrange,zrem,zcard等

使用場景:

1. 存放一個有順序的並且不重複的集合列表,例如twitter 的public timeline可以以發表時間作為score來存儲,這樣獲取時就是自動按時間排好序的。

2. 可以做有權重的佇列,例如普通訊息的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來取得工作任務。讓重要的任務優先執行。

3. 排行榜相關:ZADD leaderboard 。要得到前100名高分用戶很簡單:ZREVRANGE leaderboard 0 99。使用者的全球排名也相似,只需要執行:ZRANK leaderboard

4. 新聞依照用戶投票和時間排序,ZADD時的score = points / time^alpha, 這樣用戶的投票會相應的把新聞挖出來,但時間會按照一定的指數將新聞埋下去。

5. 過期項目處理:使用unix時間作為關鍵字,用來保持清單能夠依時間排序。對current_time和time_to_live進行檢索,完成尋找過期項目的艱鉅任務。另一項後台任務使用ZRANGE...WITHSCORES進行查詢,刪除過期的項目。

實作方式:

Redis sorted set的內部使用HashMap和跳躍表(SkipList)來確保資料的儲存和有序,HashMap裡放的是成員到score的映射,而跳躍表裡存放的是所有的成員,排序依據是HashMap裡存的score,使用跳躍表的結構可以獲得比較高的查找效率,並且在實現上比較簡單。

 更多redis知識請關注redis資料庫教學欄位。

以上是redis資料類型及應用程式場景的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1323
25
PHP教程
1272
29
C# 教程
1251
24
redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis計數器怎麼實現 redis計數器怎麼實現 Apr 10, 2025 pm 10:21 PM

Redis計數器是一種使用Redis鍵值對存儲來實現計數操作的機制,包含以下步驟:創建計數器鍵、增加計數、減少計數、重置計數和獲取計數。 Redis計數器的優勢包括速度快、高並發、持久性和簡單易用。它可用於用戶訪問計數、實時指標跟踪、遊戲分數和排名以及訂單處理計數等場景。

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

如何優化debian readdir的性能 如何優化debian readdir的性能 Apr 13, 2025 am 08:48 AM

在Debian系統中,readdir系統調用用於讀取目錄內容。如果其性能表現不佳,可嘗試以下優化策略:精簡目錄文件數量:盡可能將大型目錄拆分成多個小型目錄,降低每次readdir調用處理的項目數量。啟用目錄內容緩存:構建緩存機制,定期或在目錄內容變更時更新緩存,減少對readdir的頻繁調用。內存緩存(如Memcached或Redis)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信

See all articles