環境
Redis官方網站:?Redis - The Real-time Data Platform
Redis社區版本下載地址:Install Redis | Docs
Memcached官方網站:memcached - a distributed memory object caching system?
Memcached下載地址:memcached - a distributed memory object caching system?
?
Redis與Memcached應用場景對比
一、核心特性對比
?對比維度? | ?Redis? | ?Memcached? |
---|---|---|
?數據結構支持? | 支持字符串、哈希、列表、集合、有序集合等復雜數據結構,適合多樣化數據操作? | 僅支持簡單鍵值對存儲,適用于單一數據模型場景? |
?持久化能力? | 支持RDB快照和AOF日志持久化,數據可恢復? | 無持久化機制,宕機后數據丟失? |
?內存管理? | 通過VM機制突破物理內存限制,支持大容量數據存儲? | 使用固定內存分配(slab機制),適合中小規模數據緩存? |
?性能表現? | 單核處理,小數據(<100KB)性能更優;支持復雜操作但高并發寫入效率略低? | 多線程架構,大數據(>100KB)處理性能更高,適合純緩存場景? |
?擴展性? | 支持主從復制、集群模式,適合高可用場景? | 依賴第三方工具(如magent)實現分布式,擴展性較弱? |
二、典型應用場景對比
-
?Redis適用場景?
- ?會話存儲(Session Cache)?:通過持久化能力保障會話數據安全,支持高可靠性業務?
- ?實時排行榜/計數器?:利用有序集合(Sorted Set)實現動態排序,適用于電商、社交等場景?
- ?消息隊列?:通過List、Pub/Sub等特性支持異步任務處理和事件驅動架構?
- ?復雜業務邏輯?:結合Lua腳本和事務機制,滿足數據一致性要求高的場景(如秒殺庫存扣減)?
-
?Memcached適用場景?
- ?高頻讀取緩存?:如靜態頁面緩存、數據庫查詢結果緩存,減輕數據庫壓力?
- ?臨時數據存儲?:用戶會話臨時信息、非關鍵性數據(如頁面片段緩存),無需持久化保障?
- ?大規模數據緩存?:單Value值≤1MB時,多線程架構可高效處理高并發請求?
三、選型建議
-
?選擇Redis的條件?:
- 需要復雜數據結構或持久化能力?
- 業務涉及實時數據處理或強一致性要求?
- 系統需支持高可用集群和橫向擴展?
-
?選擇Memcached的條件?:
- 僅需簡單鍵值緩存且數據量較小?
- 高并發大體積數據(>100KB)處理需求優先?
- 輕量級部署,無需額外運維復雜度?
?綜合建議?:若業務場景以高性能緩存為主且無復雜數據處理需求,優先選擇Memcached;若需支持多樣化數據操作、持久化及高可用,Redis是更優選擇?
附件一:Redis組件POM依賴
Redis
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>3.4.4</version>
</dependency>
或者
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version>
</dependency>
附件二:Memcache組件POM依賴
memcache
<dependency><groupId>net.spy</groupId><artifactId>spymemcached</artifactId><version>2.12.3</version>
</dependency>
附件三:Redis基本操作
基礎命令
1.ping(心跳檢查)
ping //輸入ping 命令,看到PONG響應,說明客戶端與Redis的連接正常。
2.get/set(讀寫鍵值)
set name xiaoHong //set key value 會將指定 key-value寫入到DB。
get name //get key 則會讀取指定key的value值。
3.select(切換數據庫)
select 1 //select db 索引來切換 DB。redis默認有 16 個數據庫。默認使用的是 0 號 DB。
4.dbsize(查看key數量)
dbsize //命令可以查看當前數據庫中 key 的數量。
5.flushdb(刪除當前庫中所有數據)
flushdb //刪除當前庫中所有數據,不影響其他DB。
6.flushall(刪除所有DB中的數據)
flushall //清除redis所有DB中的數據
二、Key 操作命令
1.keys(正則匹配鍵名)
keys * //匹配所有的key
keys a* //匹配以a開頭的key//KEYS pattern 查找所有符合正則 pattern 的 key
//KEYS 速度非常快,但在一個大的數據庫中使用它可能會阻塞當前服務器的服務。生產環境中一般不使用該命令,使用scan命令代替。
2.exists(檢查key是否存在)
exists key //若 key 存在,返回 1 ,否則返回 0 。
3.del(刪除指定一個或多個key)
del key1 key2 key3 //返回被刪除 key 的數量,不存在的 key 會被忽略。
4.rename(修改key名)
rename key newKey //將key改名為newkey。//當 key 和 newkey 相同,或 key 不存在時,會返回一個錯誤。
//當 newkey 已經存在時,RENAME 將覆蓋舊值。
5.move(移動key數據庫DB)
MOVE key db //將當前數據庫的 key 移動到指定數據庫 db 當中。//如果當前數據庫和目標數據庫有相同名字的 key,或者 key 不存在于當前數據庫,那么 MOVE 沒有任何效果。
//移動成功返回 1 ,失敗則返回 0 。
6.type(獲取key儲存的值類型)
type key //返回 key 所儲存的值的類型//有六種 none (key 不存在)、string (字符串)、list (列表)、set (集合)、zset (有序集)、hash (哈希表)
7.expire/pexpire(設置key有效期)
expire key seconds //為 key 設置過期時間。當 key 過期時(生存時間為 0),它會被自動刪除。//expire 的時間單位為秒,pexpire 的時間單位為毫秒。
//過期時間設置成功返回 1,key 不存在時返回 0 。rename 操作不會改變 key的過期時間。
8.ttl/pttl(獲取key剩余生存時間)
ttl key //time to live,返回給定 key 的剩余生存時間。// key 不存在時,返回 -2 。
// key 存在但沒有設置時間時,返回 -1 。
// 返回 key 剩余生存時間。ttl 返回的時間單位為秒,pttl 返回的時間單位為毫秒。
9.persist(去除key的生存時間)
persist key //當生存時間移除成功返回 1;若 key 不存在或 key 沒有設置生存時間,則返回 0。
10.randomkey(隨機返回一個 key)
randomkey //當數據庫不為空時,隨機返回一個 key(不刪除)。當數據庫為空時,返回 nil。
11.scan(遍歷數據庫鍵)
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] //SCAN 命令是一個基于游標 cursor 的迭代器//cursor:本次迭代開始的游標。
//pattern:本次迭代要匹配的 key 的模式。
//count:本次迭代要從數據集里返回多少元素,默認值為 10 。
//type:本次迭代要返回的value 的類型,默認為所有類型。//SCAN 命令被調用之后,會返回一個包含兩個元素的數組, 第一個元素是用于進行下一次迭代的新游標,第二個元素則是一個數組, 數組中包含了所有被迭代的元素。
//用戶在下次迭代時使用這個新游標作為 SCAN 命令的游標參數,以此來延續之前的迭代過程。
//當 SCAN 命令的游標參數被設置為 0 時,服務器將開始一次新的迭代。如果新游標返回 0表示迭代已結束。
//當數據量很大時,count 的數量的指定可能會不起作用,Redis 會自動調整每次的遍歷數目。
//由于 scan 命令每次執行都只會返回少量元素,所以該命令可以用于生產環境,而不會出現像 KEYS 命令帶來的服務器阻塞問題。hscan key cursor [MATCH pattern] [COUNT count] //遍歷當前 db 中指定 Hash 表的所有 field-value 對
sscan key cursor [MATCH pattern] [COUNT count] //遍歷當前 db 中指定 set 集合的所有元素
zscan key cursor [MATCH pattern] [COUNT count] //遍歷當前 db 中指定有序集合的所有元素(數值與元素值)
附件四:Memcache基本操作
存儲數據
Memcached提供了多種命令用于存儲數據項,包括 set、add 和 replace。以下是這些命令的詳細介紹:
set 命令
set 命令用于在緩存中存儲一個數據項。如果鍵已經存在,則覆蓋其現有值。
set <key> <flags> <exptime> <bytes> [noreply]\r\n
<value>\r\n
參數說明:
<key>:數據項的鍵。
<flags>:用戶自定義的標志位,通常為0。
<exptime>:過期時間,單位為秒。
<bytes>:數據項的字節數。
[noreply]:可選參數,表示不需要服務器返回響應。
示例代碼:
import memcache# 連接Memcached服務器
mc = memcache.Client(['127.0.0.1:11211'])# 存儲數據
mc.set('key1', 'value1', time=60)
print("Set key1 to value1")
add 命令
add 命令用于在緩存中添加一個新的數據項。如果鍵已經存在,則不做任何操作。
add <key> <flags> <exptime> <bytes> [noreply]\r\n
<value>\r\n
示例代碼:
# 添加數據
mc.add('key2', 'value2', time=60)
print("Added key2 with value2")
replace 命令
replace 命令用于替換緩存中已有的一個數據項。如果鍵不存在,則不做任何操作。
replace <key> <flags> <exptime> <bytes> [noreply]\r\n
<value>\r\n
示例代碼:
# 替換數據
mc.replace('key1', 'new_value1', time=60)
print("Replaced key1 with new_value1")
?
檢索數據
Memcached提供了 get 和 gets 命令用于檢索數據項。
get 命令
get 命令用于檢索一個或多個數據項的值。
get <key>*\r\n
示例代碼:
# 檢索數據
value = mc.get('key1')
print("Retrieved key1:", value)
3.2.2 gets 命令
gets 命令與 get 類似,但返回的數據項還包括一個唯一的標識符(cas token),用于數據更新時的樂觀鎖定。gets <key>*\r\n
示例代碼:# 檢索數據及其唯一標識符
result = mc.gets('key1')
print("Retrieved key1 with CAS token:", result)
更新數據
Memcached提供了 cas 命令用于數據項的條件更新,利用唯一標識符進行樂觀鎖定。
cas 命令
cas 命令用于更新一個數據項,但前提是數據項的唯一標識符未改變。
cas <key> <flags> <exptime> <bytes> <cas token> [noreply]\r\n
<value>\r\n
示例代碼:
# 條件更新數據
cas_token = result[1]
mc.cas('key1', 'updated_value1', cas_token, time=60)
print("Conditionally updated key1 with updated_value1")
刪除數據
Memcached提供了 delete 命令用于刪除數據項。
delete 命令
delete 命令用于刪除一個數據項。
delete <key> [noreply]\r\n
示例代碼:
# 刪除數據mc.delete('key1')
print("Deleted key1")
計數器操作
Memcached提供了 incr 和 decr 命令用于操作數據項的計數器值。
incr 命令
incr 命令用于增加數據項的計數器值。
incr <key> <value> [noreply]\r\n
示例代碼:
# 增加計數器
mc.set('counter', 10)
mc.incr('counter', 5)
counter_value = mc.get('counter')
print("Counter value after increment:", counter_value)
decr 命令
decr 命令用于減少數據項的計數器值。
decr <key> <value> [noreply]\r\n
示例代碼:
# 減少計數器
mc.decr('counter', 3)
counter_value = mc.get('counter')
print("Counter value after decrement:", counter_value)