Redis五種核心數(shù)據(jù)類型與命令示例
一、Redis數(shù)據(jù)類型概述
Redis支持五種核心數(shù)據(jù)結(jié)構(gòu),每種結(jié)構(gòu)都針對特定場景優(yōu)化:
數(shù)據(jù)類型 | 存儲結(jié)構(gòu) | 主要應(yīng)用場景 | 時間復(fù)雜度 |
|---|---|---|---|
String? | 簡單動態(tài)字符串(SDS) | 緩存、計數(shù)器、分布式鎖 | O(1) |
Hash? | 鍵值對集合 | 對象存儲、購物車、用戶屬性 | O(1) |
List? | 雙向鏈表 | 消息隊列、最新列表、關(guān)注列表 | 頭尾操作O(1) |
Set? | 無序集合 | 標(biāo)簽、共同好友、隨機(jī)推薦 | O(1) |
Sorted Set? | 有序集合 | 排行榜、延遲隊列、范圍查詢 | O(logN) |
二、String(字符串類型)
核心特性
// Redis底層使用SDS(簡單動態(tài)字符串)
struct sdshdr {
unsigned int len; // 字符串長度
unsigned int free; // 未使用字節(jié)數(shù)
char buf[]; // 字節(jié)數(shù)組
};二進(jìn)制安全:可存儲任何二進(jìn)制數(shù)據(jù),包括圖片、序列化對象等。
常用命令
# 基本操作 SET key value # 設(shè)置鍵值 GET key # 獲取值 APPEND key value # 追加值 STRLEN key # 獲取長度 # 批量操作 MSET k1 v1 k2 v2 # 批量設(shè)置 MGET k1 k2 # 批量獲取 # 數(shù)值操作 INCR key # 自增1 INCRBY key 5 # 增加指定數(shù)值 DECR key # 自減1 SETNX key value # 不存在時設(shè)置(實現(xiàn)分布式鎖基礎(chǔ)) # 過期時間 SETEX key 10 value # 設(shè)置值并指定10秒過期 SET key value EX 10 # 同上 PSETEX key 1000 value # 毫秒級過期
Java示例
Jedis jedis = new Jedis("localhost");
// 基本操作
jedis.set("username", "minxr");
String name = jedis.get("username");
// 追加操作
jedis.append("username", "jintao");
// 設(shè)置過期
jedis.setex("session_token", 3600, "abc123");
// 批量操作
jedis.mset("user:1:name", "Alice", "user:1:age", "25");
List<String> values = jedis.mget("user:1:name", "user:1:age");三、Hash(哈希類型)
適用場景
存儲對象,如用戶信息、商品詳情。相比JSON字符串存儲,可獨立更新單個字段。
常用命令
# 字段操作 HSET user:1001 name "張三" age 25 # 設(shè)置字段 HGET user:1001 name # 獲取字段 HMSET user:1001 email "a@b.com" phone "13800138000" # 批量設(shè)置 HMGET user:1001 name age # 批量獲取 HGETALL user:1001 # 獲取所有字段 HDEL user:1001 email # 刪除字段 # 判斷與計數(shù) HEXISTS user:1001 name # 檢查字段是否存在 HLEN user:1001 # 字段數(shù)量 HSETNX user:1001 name "李四" # 字段不存在時設(shè)置 # 獲取鍵/值 HKEYS user:1001 # 所有字段名 HVALS user:1001 # 所有字段值 HINCRBY user:1001 score 10 # 數(shù)值字段增加
商品信息存儲示例
# 商品ID為1001的信息 HMSET items:1001 id 1001 name "iPhone" price 5999.00 stock 100 HGET items:1001 name # 獲取商品名 HINCRBY items:1001 stock -1 # 減少庫存 HGETALL items:1001 # 獲取完整信息
Java示例
// 存儲用戶信息
Map<String, String> user = new HashMap<>();
user.put("name", "Akshi");
user.put("age", "2");
user.put("sex", "Female");
jedis.hmset("user:1001", user);
// 獲取操作
String name = jedis.hget("user:1001", "name");
List<String> fields = jedis.hmget("user:1001", "name", "age");
Map<String, String> allFields = jedis.hgetAll("user:1001");
// 字段操作
jedis.hincrBy("user:1001", "age", 1); // 年齡+1
jedis.hdel("user:1001", "sex"); // 刪除字段四、List(列表類型)
數(shù)據(jù)結(jié)構(gòu)
基于雙向鏈表實現(xiàn),兩端操作O(1),中間操作O(n)。
常用命令
# 增加元素 LPUSH list:1 a b c # 左側(cè)插入 RPUSH list:1 d e f # 右側(cè)插入 LINSERT list:1 BEFORE b x # 指定位置插入 # 彈出元素 LPOP list:1 # 左側(cè)彈出 RPOP list:1 # 右側(cè)彈出 RPOPLPUSH list:1 list:2 # 原子移動 # 查詢操作 LRANGE list:1 0 2 # 獲取片段(包含兩端) LINDEX list:1 2 # 獲取指定索引元素 LLEN list:1 # 列表長度 # 刪除操作 LREM list:1 2 "a" # 刪除前2個"a" LTRIM list:1 0 3 # 只保留0-3索引元素 LSET list:1 0 "new" # 設(shè)置指定索引值
商品評論系統(tǒng)示例
# 商品1001的評論列表
LPUSH items:comment:1001 '{"id":1,"content":"商品不錯","time":1630295077289}'
LPUSH items:comment:1001 '{"id":2,"content":"物流很快","time":1630295077290}'
# 獲取最新10條評論
LRANGE items:comment:1001 0 9Java示例
// 消息隊列實現(xiàn)
jedis.lpush("messages", "Hello");
jedis.lpush("messages", "World");
jedis.rpush("messages", "!");
// 獲取所有消息
List<String> messages = jedis.lrange("messages", 0, -1);
// 阻塞式彈出(實現(xiàn)任務(wù)隊列)
String task = jedis.brpop(5, "task_queue"); // 最多等待5秒
// 最新動態(tài)列表
jedis.lpush("news:latest", "新聞1", "新聞2", "新聞3");
jedis.ltrim("news:latest", 0, 9); // 只保留最新10條五、Set(集合類型)
特性
無序、唯一元素,基于哈希表實現(xiàn),操作O(1)。
常用命令
# 基本操作 SADD tags java redis python # 添加元素 SMEMBERS tags # 獲取所有元素 SREM tags python # 刪除元素 SISMEMBER tags java # 判斷是否存在 # 集合運(yùn)算 SINTER set1 set2 # 交集 SUNION set1 set2 # 并集 SDIFF set1 set2 # 差集(set1有set2無) SCARD tags # 元素個數(shù) SPOP tags # 隨機(jī)彈出一個 SRANDMEMBER tags 2 # 隨機(jī)獲取2個(不刪除)
社交應(yīng)用示例
# 用戶標(biāo)簽 SADD user:1001:tags 音樂 電影 編程 SADD user:1002:tags 電影 游戲 攝影 # 共同興趣 SINTER user:1001:tags user:1002:tags # 返回: 電影 # 推薦標(biāo)簽(你有我無的) SDIFF user:1002:tags user:1001:tags # 返回: 游戲 攝影
六、Sorted Set(有序集合)
特性
元素唯一,每個元素關(guān)聯(lián)一個分?jǐn)?shù)(score),按分?jǐn)?shù)排序。
常用命令
# 添加元素 ZADD rank 95 "張三" 89 "李四" 78 "王五" ZADD rank 97 "李四" # 更新分?jǐn)?shù) # 查詢操作 ZRANGE rank 0 2 # 升序前3名 ZREVRANGE rank 0 2 # 降序前3名 ZRANGE rank 0 2 WITHSCORES # 帶分?jǐn)?shù) ZSCORE rank "張三" # 獲取分?jǐn)?shù) ZRANK rank "張三" # 升序排名 ZREVRANK rank "張三" # 降序排名 # 分?jǐn)?shù)范圍操作 ZRANGEBYSCORE rank 90 100 # 90-100分 ZCOUNT rank 80 90 # 80-90分人數(shù) ZINCRBY rank 5 "張三" # 增加5分 # 刪除操作 ZREM rank "王五" # 刪除元素 ZREMRANGEBYRANK rank 0 2 # 刪除排名0-2 ZREMRANGEBYSCORE rank 0 60 # 刪除0-60分 ZCARD rank # 元素總數(shù)
排行榜實現(xiàn)
# 游戲積分榜 ZADD game:rank 1500 "玩家A" 1200 "玩家B" 1800 "玩家C" # 獲取前十名 ZREVRANGE game:rank 0 9 WITHSCORES # 增加積分 ZINCRBY game:rank 100 "玩家B" # 查詢我的排名(從0開始) ZREVRANK game:rank "玩家A" # 查詢分?jǐn)?shù)段人數(shù) ZCOUNT game:rank 1000 2000
Java示例
// 黑客排名(按出生年份)
jedis.zadd("hackers", 1940, "Alan Kay");
jedis.zadd("hackers", 1953, "Richard Stallman");
// 按分?jǐn)?shù)升序獲取
Set<String> asc = jedis.zrange("hackers", 0, -1);
// 按分?jǐn)?shù)降序獲取
Set<String> desc = jedis.zrevrange("hackers", 0, -1);
// 分?jǐn)?shù)范圍查詢
Set<String> range = jedis.zrangeByScore("hackers", 1950, 1970);七、鍵管理命令
常用鍵操作
# 鍵查詢 KEYS user:* # 匹配user:開頭的鍵 EXISTS key # 鍵是否存在 TYPE key # 鍵的數(shù)據(jù)類型 DEL key1 key2 # 刪除鍵 UNLINK key # 非阻塞刪除(Redis 4.0+) # 重命名 RENAME old new # 重命名 RENAMENX old new # 新名不存在時才重命名 # 過期時間 EXPIRE key 60 # 60秒后過期 TTL key # 查看剩余時間(秒) PTTL key # 剩余毫秒數(shù) PERSIST key # 移除過期時間 EXPIREAT key 1630345600 # 指定時間戳過期
批量操作示例
# 批量設(shè)置帶過期 MSET k1 v1 k2 v2 EXPIRE k1 3600 EXPIRE k2 3600 # 掃描所有鍵(代替KEYS,不阻塞) SCAN 0 MATCH user:* COUNT 10
八、服務(wù)器管理命令
# 連接測試 PING # 返回PONG表示正常 ECHO "hello" # 回顯字符串 # 數(shù)據(jù)庫操作 SELECT 1 # 切換到1號庫(0-15) DBSIZE # 當(dāng)前庫鍵數(shù)量 FLUSHDB # 清空當(dāng)前庫 FLUSHALL # 清空所有庫 # 服務(wù)器信息 INFO # 詳細(xì)服務(wù)器信息 INFO memory # 內(nèi)存信息 INFO stats # 統(tǒng)計信息 CLIENT LIST # 客戶端列表 TIME # 服務(wù)器時間 # 持久化 SAVE # 同步保存(阻塞) BGSAVE # 后臺保存 LASTSAVE # 上次保存時間
到此這篇關(guān)于Redis五種核心數(shù)據(jù)類型與命令示例的文章就介紹到這了,更多相關(guān)Redis數(shù)據(jù)類型與命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Redis?SortedSet數(shù)據(jù)類型及其常用命令總結(jié)
- Redis中三種特殊數(shù)據(jù)類型命令詳解
- Redis數(shù)據(jù)類型之散列類型hash命令學(xué)習(xí)
- Redis不同數(shù)據(jù)類型的命令語句詳解
- Redis基本數(shù)據(jù)類型String常用操作命令
- Redis基本數(shù)據(jù)類型List常用操作命令
- Redis基本數(shù)據(jù)類型Set常用操作命令
- Redis基本數(shù)據(jù)類型哈希Hash常用操作命令
- Redis常用數(shù)據(jù)類型命令實例匯總
- Redis的5種數(shù)據(jù)類型與常用命令講解
相關(guān)文章
K8S部署Redis(單機(jī)、集群)的超詳細(xì)步驟
redis是一款基于BSD協(xié)議,開源的非關(guān)系型數(shù)據(jù)庫(nosql數(shù)據(jù)庫)這篇文章主要給大家介紹了關(guān)于K8S部署Redis(單機(jī)、集群)的超詳細(xì)步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
利用redis實現(xiàn)分布式鎖,快速解決高并發(fā)時的線程安全問題
這篇文章主要介紹了利用redis實現(xiàn)分布式鎖,快速解決高并發(fā)時的線程安全問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
使用Redis獲取數(shù)據(jù)轉(zhuǎn)json,解決動態(tài)泛型傳參的問題
這篇文章主要介紹了使用Redis獲取數(shù)據(jù)轉(zhuǎn)json,解決動態(tài)泛型傳參的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
利用Redis實現(xiàn)爬蟲URL去重與隊列管理的實戰(zhàn)指南
傳統(tǒng)爬蟲開發(fā)中,URL去重和任務(wù)隊列管理是兩大難題,本文將以實戰(zhàn)為導(dǎo)向,拆解Redis在爬蟲中的兩大核心應(yīng)用場景:URL去重與任務(wù)隊列管理,用代碼片段和場景化案例說明實現(xiàn)邏輯,最后附上常見問題解決方案,需要的朋友可以參考下2025-11-11

