Redis基本數(shù)據(jù)類型示例詳解
Redis 的所有數(shù)據(jù)都是以 key-value(鍵值對(duì))的形式存儲(chǔ)的,我們所說(shuō)的數(shù)據(jù)類型指的是 value 的數(shù)據(jù)類型。key 永遠(yuǎn)都是一個(gè)字符串(String)。
0、通用命令
keys:查看當(dāng)前庫(kù)所有key (匹配:keys *1)
exists key:判斷某個(gè)key是否存在
type key:查看你的key是什么類型
del key:刪除指定的key數(shù)據(jù)
expire key 10:10秒鐘:為給定的key設(shè)置過(guò)期時(shí)間
ttl key:查看還有多少秒過(guò)期,-1表示永不過(guò)期,-2表示已過(guò)期
select:命令切換數(shù)據(jù)庫(kù)
dbsize:查看當(dāng)前數(shù)據(jù)庫(kù)的key的數(shù)量
flushdb:清空當(dāng)前庫(kù)
flushall:清空全部庫(kù)
1、String(字符串)
String是Redis最基礎(chǔ)的數(shù)據(jù)類型,可存儲(chǔ)字符串、數(shù)字和二進(jìn)制數(shù)據(jù)(如圖片),單個(gè)值最大512MB。對(duì)于整數(shù)和浮點(diǎn)數(shù)類型,可以直接執(zhí)行原子性的自增/自減操作。
數(shù)據(jù)結(jié)構(gòu):簡(jiǎn)單動(dòng)態(tài)字符串(Simple Dynamic String,縮寫SDS)。是可以修改的字符串,內(nèi)部結(jié)構(gòu)實(shí)現(xiàn)上類似于Java的ArrayList,采用預(yù)分配冗余空間的方式來(lái)減少內(nèi)存的頻繁分配
常用命令示例
# 基礎(chǔ)操作 127.0.0.1:6379> SET user:name "Alice" # 設(shè)置鍵值對(duì) OK 127.0.0.1:6379> GET user:name # 獲取值 "Alice" 127.0.0.1:6379> DEL user:name # 刪除鍵 (integer) 1 127.0.0.1:6379> GET user:name (nil) # 數(shù)字操作(原子性) 127.0.0.1:6379> SET article:100:views 0 OK 127.0.0.1:6379> INCR article:100:views # 自增1 (integer) 1 127.0.0.1:6379> INCRBY article:100:views 10 # 增加10 (integer) 11 127.0.0.1:6379> DECR article:100:views # 自減1 (integer) 10 # 批量操作(節(jié)省網(wǎng)絡(luò)開(kāi)銷) 127.0.0.1:6379> MSET user:1:name "Bob" user:1:email "bob@example.com" OK 127.0.0.1:6379> MGET user:1:name user:1:email 1) "Bob" 2) "bob@example.com" # 設(shè)置過(guò)期時(shí)間(常用于緩存) 127.0.0.1:6379> SET session:xyz123 "user_data" EX 3600 # 3600秒后自動(dòng)過(guò)期 OK # 不存在時(shí)設(shè)置(分布式鎖常用) 127.0.0.1:6379> SETNX lock:order 1 # 成功返回 1,失敗返回 0
應(yīng)用場(chǎng)景
- 緩存:存儲(chǔ)數(shù)據(jù)庫(kù)查詢結(jié)果
- 計(jì)數(shù)器:網(wǎng)站訪問(wèn)量、點(diǎn)贊數(shù)
- 會(huì)話存儲(chǔ):用戶登錄令牌
- 分布式鎖:使用 SETNX 實(shí)現(xiàn)
2、Hash(哈希)
Hash 是一個(gè)鍵值對(duì)集合,適合存儲(chǔ)對(duì)象。每個(gè) Hash 可以存儲(chǔ) 2³² - 1 個(gè)字段-值對(duì)。
數(shù)據(jù)結(jié)構(gòu):ziplist(壓縮列表),hashtable(哈希表)。當(dāng)field-value長(zhǎng)度較短且個(gè)數(shù)較少時(shí),使用ziplist,否則使用hashtable。
常用命令示例
# 存儲(chǔ)一個(gè)用戶對(duì)象 127.0.0.1:6379> HSET user:1000 name "Alice" age 30 email "alice@example.org" # 設(shè)置多個(gè)field (integer) 3 127.0.0.1:6379> HGET user:1000 name # 獲取一個(gè)field的值 "Alice" 127.0.0.1:6379> HGETALL user:1000 # 獲取整個(gè)哈希 1) "name" 2) "Alice" 3) "age" 4) "30" 5) "email" 6) "alice@example.org" 127.0.0.1:6379> HKEYS user:1000 # 獲取所有field名 1) "name" 2) "age" 3) "email" 127.0.0.1:6379> HVALS user:1000 # 獲取所有value 1) "Alice" 2) "30" 3) "alice@example.org" # 批量獲取字段 127.0.0.1:6379> HMGET user:1001 name age # ["Alice", "30"] # 統(tǒng)計(jì)字段數(shù)量 127.0.0.1:6379> HLEN user:1001 # 2 # 單獨(dú)操作某個(gè)field 127.0.0.1:6379> HINCRBY user:1000 age 1 # 給age字段的值增加1 (integer) 31 127.0.0.1:6379> HSET user:1000 age 32 # 直接設(shè)置age字段 (integer) 0 127.0.0.1:6379> HDEL user:1000 email # 刪除email字段 (integer) 1
應(yīng)用場(chǎng)景
- 對(duì)象存儲(chǔ):用戶信息、商品信息
- 購(gòu)物車:用戶ID為鍵,商品ID為字段,數(shù)量為值
- 配置存儲(chǔ):系統(tǒng)配置項(xiàng)
3、List(列表)
List 是簡(jiǎn)單的字符串列表,按照插入順序排序。元素可以重復(fù)??梢詮念^部或尾部添加元素。
它的底層實(shí)際是個(gè)雙向鏈表,對(duì)兩端的操作性能很高,通過(guò)索引下標(biāo)的操作中間的節(jié)點(diǎn)性能會(huì)較差。
常用命令示例
# 像一個(gè)隊(duì)列(FIFO:先進(jìn)先出) 127.0.0.1:6379> LPUSH orders:queue "order1001" # 從左邊插入 (integer) 1 127.0.0.1:6379> LPUSH orders:queue "order1002" (integer) 2 127.0.0.1:6379> RPOP orders:queue # 從右邊取出,得到最早進(jìn)入的"order1001" "order1001" 127.0.0.1:6379> RPOP orders:queue # 取出"order1002" "order1002" # 像一個(gè)棧(LIFO:后進(jìn)先出) 127.0.0.1:6379> LPUSH my:stack "task1" 127.0.0.1:6379> LPUSH my:stack "task2" 127.0.0.1:6379> LPOP my:stack # 從左邊取出,得到最后進(jìn)入的"task2" "task2" # 獲取列表范圍 127.0.0.1:6379> RPUSH news:latest "news_id_555" # 從右邊插入,構(gòu)建時(shí)間順序列表 127.0.0.1:6379> RPUSH news:latest "news_id_556" 127.0.0.1:6379> RPUSH news:latest "news_id_557" 127.0.0.1:6379> LRANGE news:latest 0 2 # 獲取前3個(gè)元素 1) "news_id_555" 2) "news_id_556" 3) "news_id_557" 127.0.0.1:6379> LRANGE news:latest 0 -1 # 獲取所有元素,-1表示最后一個(gè) 1) "news_id_555" 2) "news_id_556" 3) "news_id_557"
典型場(chǎng)景
- 消息隊(duì)列(LPUSH + BRPOP 實(shí)現(xiàn)生產(chǎn)者 - 消費(fèi)者模型)
- 最新列表(如用戶最新動(dòng)態(tài)、商品評(píng)論)
- 棧(LPUSH + LPOP)和隊(duì)列(LPUSH + RPOP)
4、Set(集合)
Set 是 String 類型的無(wú)序集合,元素唯一不重復(fù),支持交集、并集、差集等操作
數(shù)據(jù)結(jié)構(gòu):它底層其實(shí)是一個(gè)value為null的hash表,所以添加,刪除,查找的復(fù)雜度都是O(1)。
常用命令示例
# 添加成員并自動(dòng)去重 127.0.0.1:6379> SADD article:800:tags "tech" "redis" "database" "tech" (integer) 3 # 返回成功添加的數(shù)量,重復(fù)的"tech"被忽略 127.0.0.1:6379> SMEMBERS article:800:tags # 獲取集合所有成員(無(wú)序) 1) "database" 2) "redis" 3) "tech" # 集合運(yùn)算 127.0.0.1:6379> SADD user:alice:follows "user:ben" "user:charlie" "user:diana" (integer) 3 127.0.0.1:6379> SADD user:bob:follows "user:alice" "user:diana" "user:evan" (integer) 3 127.0.0.1:6379> SINTER user:alice:follows user:bob:follows # 交集:共同關(guān)注 1) "user:diana" 127.0.0.1:6379> SUNION user:alice:follows user:bob:follows # 并集:所有關(guān)注的人 1) "user:alice" 2) "user:ben" 3) "user:charlie" 4) "user:diana" 5) "user:evan" 127.0.0.1:6379> SISMEMBER user:alice:follows "user:ben" # 檢查ben是否在alice的關(guān)注列表中 (integer) 1 # 隨機(jī)元素(抽獎(jiǎng)) 127.0.0.1:6379> SADD lottery:users "user1" "user2" "user3" "user4" "user5" (integer) 5 127.0.0.1:6379> SRANDMEMBER lottery:users 2 # 隨機(jī)抽取2個(gè)用戶,不刪除 1) "user3" 2) "user1" 127.0.0.1:6379> SPOP lottery:users 1 # 隨機(jī)抽取1個(gè)用戶,并從集合中刪除(防止重復(fù)中獎(jiǎng)) 1) "user2"
典型場(chǎng)景
- 去重存儲(chǔ)(如用戶瀏覽歷史、點(diǎn)贊記錄)
- 好友關(guān)系(共同好友、好友推薦)
- 標(biāo)簽系統(tǒng)(文章標(biāo)簽、商品分類)
- 隨機(jī)推薦(抽獎(jiǎng))
5、ZSet (Sorted Set - 有序集合)
Sorted Set 類似 Set,但每個(gè)元素都關(guān)聯(lián)一個(gè)分?jǐn)?shù)(score),元素按分?jǐn)?shù)從小到大排序。
數(shù)據(jù)結(jié)構(gòu):
- hash:hash的作用就是關(guān)聯(lián)元素value和權(quán)重score,保障元素value的唯一性,可以通過(guò)元素value找到相應(yīng)的score值。
- 跳躍表:跳躍表的目的在于給元素value排序,根據(jù)score的范圍獲取元素列表。
# 添加成員和分?jǐn)?shù) 127.0.0.1:6379> ZADD leaderboard 100 "player1" 85 "player2" 120 "player3" (integer) 3 # 按分?jǐn)?shù)升序獲?。ǖ偷礁?,WITHSCORES選項(xiàng)會(huì)返回分?jǐn)?shù)) 127.0.0.1:6379> ZRANGE leaderboard 0 -1 WITHSCORES 1) "player2" 2) "85" 3) "player1" 4) "100" 5) "player3" 6) "120" # 按分?jǐn)?shù)降序獲?。ǜ叩降?,獲取Top 2) 127.0.0.1:6379> ZREVRANGE leaderboard 0 1 WITHSCORES 1) "player3" 2) "120" 3) "player1" 4) "100" # 按分?jǐn)?shù)范圍查詢 127.0.0.1:6379> ZRANGEBYSCORE leaderboard 90 110 WITHSCORES # 獲取90<=score<=110的成員 1) "player1" 2) "100" # 更新玩家分?jǐn)?shù)(原子操作) 127.0.0.1:6379> ZINCRBY leaderboard 15 "player2" # 給player2加15分 "100" 127.0.0.1:6379> ZREVRANK leaderboard "player2" # 查看player2的排名(降序排名,0是第一名) (integer) 1
典型場(chǎng)景
- 排行榜(用戶積分、商品銷量)
- 優(yōu)先級(jí)隊(duì)列(按分?jǐn)?shù)排序任務(wù))
- 范圍查詢(篩選分?jǐn)?shù)在特定區(qū)間的元素)
6、總結(jié)
Redis 的五種核心數(shù)據(jù)類型各有其優(yōu)勢(shì)和應(yīng)用場(chǎng)景:
- String:最簡(jiǎn)單靈活,適用于大多數(shù)簡(jiǎn)單場(chǎng)景
- Hash:適合存儲(chǔ)對(duì)象,可以部分更新字段
- List:提供順序存儲(chǔ),適合隊(duì)列和堆棧場(chǎng)景
- Set:提供唯一性和集合運(yùn)算,適合標(biāo)簽和社交關(guān)系
- Sorted Set:結(jié)合了Set和排序功能,適合排行榜和優(yōu)先級(jí)隊(duì)列
到此這篇關(guān)于Redis基本數(shù)據(jù)類型示例詳解的文章就介紹到這了,更多相關(guān)Redis數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC集成redis配置的多種實(shí)現(xiàn)方法
這篇文章主要介紹了SpringMVC集成redis配置的多種實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
關(guān)于redigo中PubSub的一點(diǎn)小坑分析
這篇文章主要給大家介紹了關(guān)于redigo中PubSub的一點(diǎn)小坑的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
?Redis 串行生成順序編碼的方法實(shí)現(xiàn)
本文主要介紹了?Redis 串行生成順序編碼的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Redis的五種基本類型和業(yè)務(wù)場(chǎng)景和使用方式
Redis是一種高性能的鍵值存儲(chǔ)數(shù)據(jù)庫(kù),支持多種數(shù)據(jù)結(jié)構(gòu)如字符串、列表、集合、哈希表和有序集合等,它提供豐富的API和持久化功能,適用于緩存、消息隊(duì)列、排行榜等多種場(chǎng)景,Redis能夠?qū)崿F(xiàn)高速讀寫操作,尤其適合需要快速響應(yīng)的應(yīng)用2024-10-10
Redis Sorted Set 跳表的實(shí)現(xiàn)示例
本文詳細(xì)解析了Redis中SortedSet跳表的實(shí)現(xiàn)原理,闡述了跳表的基本概念、結(jié)構(gòu)及其在SortedSet中的應(yīng)用,同時(shí)也指出了跳表在實(shí)際使用中的優(yōu)勢(shì)和局限,可以更好地運(yùn)用Redis的SortedSet,優(yōu)化高并發(fā)環(huán)境中的數(shù)據(jù)查詢與操作,感興趣的可以了解一下2024-10-10
Redis 對(duì)比 Memcached 并在 CentOS 下進(jìn)行安裝配置詳解
Redis 是一個(gè)開(kāi)源、支持網(wǎng)絡(luò)、基于內(nèi)存、鍵值對(duì)的 Key-Value 數(shù)據(jù)庫(kù),本篇文章主要介紹了Redis 對(duì)比 Memcached 并在 CentOS 下進(jìn)行安裝配置詳解,有興趣的可以了解一下。2016-11-11

