5種Redis資料結構詳解
本文我們主要和大家分享 5種Redis資料結構詳解,希望文中的案例和程式碼,能幫助大家。
2.1.1 全域指令
1 查看所有鍵key*
## p. key 回傳類型,不存在返回none
2.1.2 資料結構與內部編碼
## 多種實現,這樣Redis會在適當的場景選擇合適的內部編碼
每種資料結構都有兩種以上的內部編碼實現,例如list資料結構包含了linkedlist和ziplist兩種內部編碼,可透過object encoding指令查詢內部編碼
##
單一執行緒帶來幾個好處:第一,以單一執行緒簡化資料結構與演算法的實現。第二,單線程避免了線程切換和竟態產生的消耗。但是每個指令的執行指令是有要求的,如果某個指令執行時間過長,就會造成其他指令的阻塞,Redis是快速執行情境的資料庫,單執行緒是理解Redis的核心
# 2.2 字串
Redis的字串型別是其他幾種的基礎,數值可為字串(簡單,複雜的json,xml),數位(整數,浮點),二元(圖片,音頻,視頻),最大值不能超過512MB
#
setnx setxx同上
# 應用情境:由於Redis是一個單一執行緒指令處理機制,如果多個客戶同時執行setnx key value,根據特性,只有一個客戶端能設定成功,可以作為分散式鎖定的一種實現方案
# 2 取得值 key 不存在返回nil
## 4 批次取得值mget key
5 計數incr key
有三種狀況使用「「問題」## 數值不是整數回傳錯誤
且回復為整數,而產生自增後的結果
鍵不存在,且依值為0自增, 還有decr(自減),incrby(自增指定數字),decrby(自減指定數字),incrbyfloat(自增浮點數)
2 無指令
# 2字符串長度strlen key
3 設置並返回原值getset key value
4 設定指定位置的字符setrange key offset value
5 取得部分字串getrange key start end
1 快取功能
1 快取功能
由於Redis具有支援並發的特性,所以快取通常能起到加速讀寫和降低後段壓力的作用
# :鍵名命名方式:業務名:物件名:id:[屬性]作為鍵名
偽代碼實現:
rrree ## 發展提示:防作弊,依照不同維度計數,資料持久化到底層資料來源
## 4 定速
UserInfo getUserInfo(long id){ userRedisKey="user:info:"+id value=redis.get(userRedisKey); UserInfo userInfo; if(value!=null){ userInfo=deserialize(value) }else{ userInfo=mysql.get(id) if(userInfo!=null) redis.setex(userRedisKey,3600,serizelize(userInfo)) }
某網站限制一個ip位址不能在一秒鐘之內訪問超過n次也可以採用類似的思路
## 2.3 哈希
哈希類型是指鍵值本身又是一個鍵值對結構
2.3.1 設定值
1 設定值」
3 刪除者 hdel
## 2.3 .2 內部編碼
內部編碼有兩種:
者 max-ziplist-value設定時,Redis會使用ziplist作為hash的內部實現,ziplist使用更緊湊的結構實現多個元素存儲,節省內存方面比hashtable更加優秀
表) 當hash型態無法滿足ziplist 條件時,選擇,因為hashtable的讀寫時間度為O(1)
2.3.3.3 使用情境
UserInfo getUserInfo(long id){ userRedisKey="user:info:"+id; userInfoMap=redis.hgetAll(userRedisKey); userInfoMap userInfo; if(userInfoMap!=null){ userInfo=transferMapToUserInfo(userInfoMap); }else{ userInfo=mysql.get(id); redis.hmset(userRedisKey,tranferUserInfoToMap(userInfo)); redis.expire(userRedisKey,3600); } return userInfo; }
哈希类型和关系型数据库两点不同:
1 哈希类型是稀疏的,而关系型数据库是完全结构化的
2 关系型数据库可以做复杂的查询,而Redis去模拟关系型复杂查询开发困难,维护成本高
三种方法缓存用户信息
1 原声字符串类型:每个属性一个键
优点:简单直观,每个属性都支持更新操作
缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差,所以一般不会在生产环境用
2 序列化字符串类型:将用户信息序列化后用一个键保存
优点:简化编程,如果合理的使用序列化可以提高内存的使用效率
缺点:序列化和反序列化有一定的开销,同时每次更新属性,都需要把数据取出来反序列化,更新后再序列化到Redis中
3 哈希类型:每个用户属性使用一对field-value,但是只用一个键保存
优点:简单直观,如果使用合理,可以减少内存空间的使用
缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多的内存
2.4 列表
列表类型用来存储多个有序的字符串,一个列表最多存储2的32次方-1个元素,列表是一种比较灵活的数据结构,它可以灵活的充当栈和队列的角色,在实际开发上有很多应用场景
列表有两个特点:第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表。第二、列表中的元素可以是重复的
2.4.1 命令
1 添加操作
1.1 从右边往左插入元素 rpush key value
1.2 从左往右插入元素 lpush key value
1.3 向某个元素前或者后插入元素 linsert key before|after pivot value
2 查找
1 获取指定范围内的元素列表 lrange key start end
地,這個和許多程式語言不包含end不太相同
2 取得清單指定索引下標的元素lindex key index
## 3 移除
1 彈出rpop key
3 刪除指定元素lr 4 修改
修改指定指標下標的元素lset key index newValue
2 清單不為空白:客戶端立即回傳#c
2.4.2 內部編碼 # (壓縮列表):當列表元素個數< list-max-ziplist-entries,同時list-max-ziplist-value(64位元組),Redis會選用清單的內部實作來減少記憶體的使用
無法滿足ziplist的條件時,Redis會使用linkedlist作為清單的內部實作
2.4.3 使用情境
+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(訊息佇列)
#
## 1.7取得所有元素smembers key
2 集合間操作
2 求多個集合的並集suinon key..
3 求多集合的差集sdiff key ..
#保存
# suionstore destionation key
## 2.5.2 內部編碼
為集合型的內部有兩種:
# 都是整數且元素個數小於set-max-intset-entries配置(預設為512個)時,Redis會選用intset來作為集合內部的實現,從而減少內存的使用
## 雜湊表) 當集合類型無法滿足intset的條件時,Redis會使用hashtable作為集合的內部實現
2.5.3 使用場景
是標籤。
1 為使用者新增標籤
2 為標籤新增使用者
# sadd tag1:users user:1 user:3
命令
3 刪除使用者中的標籤
# 標籤下的使用者
srem tag1:users user:1
#
5 計算使用者共同感興趣的標籤
=Tagging(標籤) spop/srandmember =Random item(產生隨機數,如抽獎)
有序集合就是在集合之上加了個score作為排序的依據
2.6.1 指令
1 集合內
nx xx ch 返回此操作後,有序集合元素和分數發生變化的個數,incr:對score做增加
有序集合相比集合提供了排序字段,但是也產生排序字段,但是也產生了排序字段,但是也產生排序了代價,zadd的時間複雜度為O(log(n)),sadd的時間複雜度為O(1)
2 計算成員個數
scard key
3 計算某成員的分數zscore key member
5 刪除成員zrem key member
6 增加成員的分數zincrby key increment member
# 8 回復指定分數範圍的成員zrangebysore key min max
9 傳回指定分數範圍成員個數zcount key min
2.6.3 使用場景
例如影片網站需要對使用者上傳的影片做排行榜榜
crby user:ranking:2016_03_15 mike 1
2 取消使用者讚數
zrem user:rank:2016_03_15 mike 取得最多讚數的十個使用者
zrevrangebyrank user:ranking:2016_03_15 0 9
4 顯示使用者資訊與使用者分數
保存在哈希類型中,至於用戶的分數和排名可用zcore和zrank兩個功能
## ## 2.7.1 單一鍵管理
1 鍵重命名rename key newkey
-1 鍵沒有設定過期時間-2 鍵不存在
expire key seconds:鍵在seconds秒後過期
#
# 3 persist 指令可以將鍵的過期時間清除
#1
5 Redis不支援二級資料結構內部元素的過期功能,例如無法這清單類型的一個元素做過時間設定
否但原子執行,同時減少了網路通訊的時間
4 遷移鍵
的方法,它們的實現方式以及使用場景不太相同
1 move 用於在Redis內部進行資料遷移# restore 實作在不同的Redis實例之間進行資料遷移的功能,此遷移分兩步驟
1 在源源
Redis提供了兩個指令遍歷所有的鍵分別有任意字元
.代表與字元中配對一個字元
[] 代表為符合一個字元
號,問號需轉義
且容易造成阻塞
2為漸進式遍歷
對應的指令還有hsan、sscan、zcan
有增刪的時候,新來的鍵無法保證遍歷到
2.7.3 資料庫管理
## # 2 flushdb/flushall 用於清除資料庫資料多的時候會出現阻塞
相關建議:
Redis 資料結構
以上是5種Redis資料結構詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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