首頁 資料庫 Redis redis中的幾種常用基礎物件介紹

redis中的幾種常用基礎物件介紹

Feb 18, 2021 am 09:29 AM
redis 物件

redis中的幾種常用基礎物件介紹

一:前言

redis中有幾個常用的基礎對象,如string、hash、list、set、zset等,下面我們就來介紹他們的底層實現資料結構與常見應用場景和特點。

二:redisobject

原始碼位置位於server.h檔案中605行開始

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS;
    int refcount;
    void *ptr;
} robj;
登入後複製

2.1 type

redis中實際的物件類型,分為5種0-4聲明。位於檔案server.h中466行

#define OBJ_STRING 0    /* String object. */
#define OBJ_LIST 1      /* List object. */
#define OBJ_SET 2       /* Set object. */
#define OBJ_ZSET 3      /* Sorted set object. */
#define OBJ_HASH 4      /* Hash object. */
登入後複製

2.2 encoding

redis五種物件string、list、hash、set、zset會用到的八種編碼格式,每一種編碼都對應一個資料結構

#define OBJ_ENCODING_RAW 0    
#define OBJ_ENCODING_INT 1    
#define OBJ_ENCODING_HT 2      
#define OBJ_ENCODING_ZIPLIST 5 
#define OBJ_ENCODING_INTSET 6  
#define OBJ_ENCODING_SKIPLIST 7
#define OBJ_ENCODING_EMBSTR 8 
#define OBJ_ENCODING_QUICKLIST 9
登入後複製

2.3 refcount

redis中記憶體的回收採用了比較簡單的引用計數法進行,每個物件引用就refcount 1,當這個引用計數減少為0時記憶體就會被回收

三:string

3.1 常用場景

#分散式鎖定:分散式鎖定的實作基礎就是採用string的指令setnx使用者資訊:很多時候使用者資訊都會序列化後存到redis中快取,但是這裡可以考慮下hash。如果僅使用使用者資料部分資訊,畢竟序列化與反序列化也是一筆開銷

3.2 編碼格式

int:當字串中全是數字時會採用int編碼,這是真正的二進位資料儲存embstr:記憶體位址連續,記憶體一次申請。字串長度小於44raw:底層採用sds實作,相對於embstr差別在於sds的創建與redisobject的創建分兩次實現

3.3 常用命令

# 存储
set key value

# 互斥存储
# 已存在的key再次存入数据不会更改缓存
setnx key value

# 过期存储,单位秒
# 设定key过期时间,到期自动删除
setex key seconds value

# 过期存储,单位毫秒
psetex key milliseconds value

# 批量存储
mset key value [key value ...]

# 取值
get key

# 批量取值
mget key [key ...]

# 追加
append key value

# 长度
strlen key

# 自增,只能是int编码的字符串
incr key

# 自定义步长自增
incrby key increment

# 自减,只能是int编码的字符串
# 这个可以减到负数,秒杀扣减库存啥的想想能不能用这个命令
decr key

# 自定义步长自减
decrby key increment
登入後複製

四:list

4.1 常用場景

訊息佇列:一般不怎麼用,畢竟各種MQ、Kafka都已經很成熟了。而redis實作訊息佇列並不保證資料的安全排行榜計算:這種僅適用於定時計算更新,不能用於即時更新排行。例如美團每天計算區域入駐商家排行按讚列表:例如微信中的點讚(不知道咋做的,猜一下)

4.2 編碼格式

quicklist:快速列表,之前版本有使用linkedlist和ziplist。目前使用的quicklist為兩者結合體,詳情可以查看Redis(一) -- 淺談Redis中的資料結構

4.3 相關參數配置

配置參數位置位於redis.con文件中1083行與1099行

list-max-ziplist-size:設定單一ziplist大小list-compress-depth:設定LZF壓縮演算法開始節點

#4.4 常用指令

# 创建list并压入节点
# 压入节点位于链表头
lpush key value

# 压入节点位于链表尾
rpush key value

# 弹出list头节点
lpop key

# 弹出list尾节点
rpop key

# 删除节点
# count > 0 从左开始搜索删除count数量的value
# count < 0 从右开始搜索删除|count|数量的value
# count = 0 删除list中所有value
lrem key count value

# 范围保留
# -1 表示列表最后一个元素
# -2 表示倒数第二个,以此类推
ltrim key start stop

# 计算长度
llen key

# 索引查询节点
# index < 0 从右开始搜索
# index > 0 从左开始搜索
lindex key index

# 范围查询
# stop = -1 表示所有
lrange key start stop

# 阻塞弹出
# 队列中没有节点时会一直等待
# 多个key时表示挨着顺序依次检查,知道找到非空列表为止
# timeout可以设置等待时间,0表示一直等待
blpop key [key...] timeout
brpop key [key...] timeout
登入後複製

五:Hash

5.1 常用場景

商品物件、使用者物件。這個場景需要驗證性對待,如果商品物件、使用者物件資訊每次都需要全量的話不妨存string,但是僅僅部分使用就可以考慮使用hash結構SKU等資訊,這個場景下hash就比較合適了。一個hash結構中儲存某個商品所有sku

5.2 編碼格式

ziplist:使用ziplist儲存hash結構時一個資料會使用相鄰兩個ziplistEntry儲存field和valuehashtable:當資料存儲超過參數限制後就會將其底層結構由ziplist轉換為dict進行儲存

5.3 相關參數配置

hash-max-ziplist-entries:預設512,即ziplist節點為1024。當節點數量超過該值限制後底層資料結構轉為dicthash-max-ziplist-value:預設64,當hash中插入任意一個長度超過該限制的value後底層資料結構轉換為dict

#(學習影片分享:redis影片教學

5.4 常用指令

# 存储
hset key field value 

# 不允许更改存储
# 若field值存在则本次存储不会覆盖原有value值
hsetnx key field value

# 批量存储
hmset key field value [field value ...]

# 查询
hget key field

# 批量查询
hmget key field [field ...]

# 全量查询
hgetall key 

# 全量查询field值
hkeys key

# 全量查询value值
hvals key

# 删除field
hdel key field [field ...]

# 计算键值对数量
hlen key
# field存在判断
hexists key field

# 增量式迭代
# cursor表示迭代开始的游标
# count 表示迭代返回数据数量
# pattern 表示正则匹配结果限制
hscan key cursor [Count count] [Match pattern]
登入後複製

六:Set

6.1 常用場景

#建議:透過sinter指令計算交集,例如美團給你推薦附近外賣時就可以根據你的外賣記錄與附近商家計算交集推送安全提示:微信群成員保存在一個set中,用戶好友也保存在set中。當使用者加入群組聊天時可以提醒非好友使用者註意安全

6.2 編碼格式

intset:整數集合,用於儲存set集合中所有value都是整數的資料hashtable:field用於儲存set集合值

6.3 相關參數配置

set-max-inset-entries:預設512,表示當元素數量超過限定以後轉換為hashtable編碼

#6.4常用指令

# 存储
sadd member [member ...]

# 弹出元素并返回
spop key count

# 查询所有元素
smembers key [count]

# 计算元素数量
scard key 

# 删除指定元素
srem key member [member ...]

# 判断元素存在
sismember key member

# 计算给定集合与后续集合差集
# 返回计算结果
sdiff key [key ...]

# 计算给定集合与后续集合差集
# 存储结果到destination并返回
sdiffstore destination key [key ...]

# 计算给定集合与后续集合交集
# 返回计算结果
sinter key [key ...]

# 计算给定集合与后续集合差集
# 存储结果到destination并返回
sinterstore destination key [key ...]

# 计算给定集合与后续集合差集
# 返回计算结果
sunion key [key ...]

# 计算给定集合与后续集合差集
# 存储结果到destination并返回
sunionstore destination key [key ...]
登入後複製

七:Zset

7.1 常用場景

排行榜:美團要做一個銷售排行榜,就可以使用店家的訂單做score,這個查詢出來的結果就是有序的權重隊列:score作為優先權,這樣取出來的資料權重都是最大優先執行的延時任務:score作為任務啟動執行時間,取值時判斷該值執行即可

7.2 編碼格式

ziplist:與hash有異曲同工之妙,都是使用相鄰兩個節點儲存score和memberskiplist:跳躍表結構,可以查看Redis(一) -- 淺談Redis中的資料結構

7.3 相關參數配置

zset-max-ziplist-entries:預設值128,指定ziplist儲存元素最多128個。超過轉換為skiplistzset-max-ziplist-value:預設值64,儲存資料值最大64位元組,超過轉換為skiplist

7.4 常用指令

# 存储
# xx 表示当zset中存在本次插入的member时才存储
# nx 表示当zset中不存在本次插入的member时才存储
zadd key [nx|xx] score member [score member ...]

# 查询排序指定[start,stop]范围内元素
# withscores 查询结果顺带返回元素分数
zrange key start stop [withscores]

# 查询指定元素分数
zscore key member

# 元素数量统计
zcard key

# 返回score位于[min,max]区间的元素数量
zcount key min max 

# 对指定元素分数增加incrment值
zincrby key incrment member

# 返回指定分数区间范围内元素
# withscores 返回时携带分数一起返回
# limit offset count表示跳过offset数量结果再返回count数量结果
zrangebyscore key min max [withscores] [limit offset count]

# 倒序返回指定分数区间范围内元素
# withscores 返回时携带分数一起返回
# limit offset count表示跳过offset数量结果再返回count数量结果
zrevrangebyscore key max min [withrescores] [limit offset count]

# 删除指定分数范围[min,max]内元素
zremrangebyscore key min max

# 移除指定元素
zrem key member
登入後複製

相關推薦: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

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

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:12 PM

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

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

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

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: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)或本地緩存(如文件或數據庫)均可考慮。採用高效數據結構:如果自行實現目錄遍歷,選擇更高效的數據結構(例如哈希表而非線性搜索)存儲和訪問目錄信

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

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

See all articles