搜尋
首頁資料庫Redisredis中的幾種常用基礎物件介紹
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刪除
es和redis区别es和redis区别Jul 06, 2019 pm 01:45 PM

Redis是现在最热门的key-value数据库,Redis的最大特点是key-value存储所带来的简单和高性能;相较于MongoDB和Redis,晚一年发布的ES可能知名度要低一些,ES的特点是搜索,ES是围绕搜索设计的。

一起来聊聊Redis有什么优势和特点一起来聊聊Redis有什么优势和特点May 16, 2022 pm 06:04 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于redis的一些优势和特点,Redis 是一个开源的使用ANSI C语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式存储数据库,下面一起来看一下,希望对大家有帮助。

实例详解Redis Cluster集群收缩主从节点实例详解Redis Cluster集群收缩主从节点Apr 21, 2022 pm 06:23 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis Cluster集群收缩主从节点的相关问题,包括了Cluster集群收缩概念、将6390主节点从集群中收缩、验证数据迁移过程是否导致数据异常等,希望对大家有帮助。

Redis实现排行榜及相同积分按时间排序功能的实现Redis实现排行榜及相同积分按时间排序功能的实现Aug 22, 2022 pm 05:51 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,希望对大家有帮助。

详细解析Redis中命令的原子性详细解析Redis中命令的原子性Jun 01, 2022 am 11:58 AM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于原子操作中命令原子性的相关问题,包括了处理并发的方案、编程模型、多IO线程以及单命令的相关内容,下面一起看一下,希望对大家有帮助。

一文搞懂redis的bitmap一文搞懂redis的bitmapApr 27, 2022 pm 07:48 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了bitmap问题,Redis 为我们提供了位图这一数据结构,位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已,希望对大家有帮助。

实例详解Redis实现排行榜及相同积分按时间排序功能的实现实例详解Redis实现排行榜及相同积分按时间排序功能的实现Aug 26, 2022 pm 02:09 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,下面一起来看一下,希望对大家有帮助。

redis error什么意思redis error什么意思Jun 17, 2019 am 11:07 AM

redis error就是redis数据库和其组合使用的部件出现错误,这个出现的错误有很多种,例如Redis被配置为保存数据库快照,但它不能持久化到硬盘,用来修改集合数据的命令不能用。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),