Redis、Memcached應用場景對比

環境

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)實現分布式,擴展性較弱?

二、典型應用場景對比

  1. ?Redis適用場景?

    • ?會話存儲(Session Cache)?:通過持久化能力保障會話數據安全,支持高可靠性業務?
    • ?實時排行榜/計數器?:利用有序集合(Sorted Set)實現動態排序,適用于電商、社交等場景?
    • ?消息隊列?:通過List、Pub/Sub等特性支持異步任務處理和事件驅動架構?
    • ?復雜業務邏輯?:結合Lua腳本和事務機制,滿足數據一致性要求高的場景(如秒殺庫存扣減)?
  2. ?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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75747.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75747.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75747.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

kettle插件-mysql8數據庫插件

場景&#xff1a;群里有小伙伴反饋kettle 7.x版本不能自動連接mysql8&#xff0c;安排&#xff01;&#xff01;&#xff01; 1、將mysql8的驅動包mysql-connector-java-8.0.20.jar丟到kettle的lib目錄下&#xff0c;重啟spoon。 2、配置數據庫連接&#xff0c;提示驅動類不對…

【軟件測試】:軟件測試實戰

1. ?動化實施步驟 1.1 編寫web測試?例 1.2 ?動化測試腳本開發 common public class AutotestUtils {public static EdgeDriver driver;// 創建驅動對象public static EdgeDriver createDriver(){// 驅動對象已經創建好了 / 沒有創建if( driver null){driver new EdgeDr…

深度學習入門1 基于Python的理論與實現

torch.unsqueeze()將一維數據變為二維數據&#xff0c;torch只能處理二維數據 tensor不能反向&#xff0c;variable可以反向。variable.data.numpy()轉換為numpy 第3章 神經網絡 實現softmax函數時的注意事項&#xff1a;為防止e的指數運算造成溢出 矩陣的第 0 維是列方向,第…

解決 Pentaho Kettle 插件集成中的 NoSuchMethodError: ContextFactory.enterContext() 錯誤

解決 Pentaho Kettle 插件集成中的 NoSuchMethodError: ContextFactory.enterContext() 錯誤 在使用 Pentaho Data Integration&#xff08;也稱為 Kettle&#xff09;進行數據集成和ETL開發時&#xff0c;開發者可能會遇到各種依賴沖突和技術挑戰。本文將詳細介紹一個常見的錯…

第 五 章:優化算法_《C++性能優化指南》_notes

優化算法 第五章重難點詳解與代碼實戰編譯與測試說明第五章核心知識點整理重難點梳理 第一部分&#xff1a;多選題&#xff08;10道&#xff09;第二部分&#xff1a;設計題&#xff08;5道&#xff09;答案與詳解多選題答案&#xff1a; 設計題參考實現&#xff08;以題目2為例…

多版本PHP開發環境配置教程:WAMPServer下MySQL/Apache/MariaDB版本安裝與切換

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、版本切換指南總結 前言 由于有幾個項目分別使用到PHP7.0 和7.4以及8.0版本&#xff0c;設置mysql也會根據PHP版本使用不同的版本&#xff0c;于是開始研究…

2024年數維杯數學建模C題天然氣水合物資源量評價解題全過程論文及程序

2024年數維杯數學建模 C題 天然氣水合物資源量評價 原題再現&#xff1a; 天然氣水合物&#xff08;Natural Gas Hydrate/Gas Hydrate&#xff09;即可燃冰&#xff0c;是天然氣與水在高壓低溫條件下形成的類冰狀結晶物質&#xff0c;因其外觀像冰&#xff0c;遇火即燃&#…

階段一:Java基礎語法

目標&#xff1a;掌握Java的基本語法&#xff0c;理解變量、數據類型、運算符、控制結構等。 1. Java開發環境搭建 安裝JDK配置環境變量編寫第一個Java程序 代碼示例&#xff1a; // HelloWorld.java public class HelloWorld { // 定義類名為 HelloWorldpublic static vo…

從0到1,解鎖Ant Design X的無限可能

Ant Design X 是什么&#xff1f; 在人工智能飛速發展的當下&#xff0c;AI 驅動的界面已成為軟件開發的重要趨勢。而 Ant Design X 正是順應這一趨勢&#xff0c;于 2024 年應運而生的一款遵循 Ant Design 設計體系的 React UI 庫&#xff0c;它旨在幫助開發者輕松打造 AI 驅…

Graphpad Prism for Mac醫學繪圖

Graphpad Prism for Mac醫學繪圖 文章目錄 Graphpad Prism for Mac醫學繪圖一、介紹二、效果三、下載 一、介紹 GraphPad Prism for Mac是一款功能強大、易于使用的科學和統計分析軟件&#xff0c;適用于各種類型的數據處理和可視化需求。無論您是進行基礎研究、臨床試驗還是學…

mysqloracledb2 (uuid函數)

項目場景&#xff1a; 創建一個32位的UUID 問題描述 原因分析&#xff1a; 解決方案&#xff1a; mysql內置UUID函數 SELECT UUID(); SELECT UUID_SHORT();oracle內置UUID函數 SELECT sys_guid() FROM dual;db2&#xff0c;模擬UUID函數 SELECT TEST || substr (CONCAT…

Android實踐開發制作小猴子摘桃小游戲

Android實踐制作小猴子摘桃小游戲 實踐素材項目源文件獲取&#xff1a;Android可能存在版本差異項目如果不能正確運行&#xff0c;可以使用里面的素材自己構建項目Android實踐制作小猴子摘桃小游戲Android實踐制作小猴子摘桃小游戲https://mp.weixin.qq.com/s/jNU_hVfj9xklsil…

Postman 下載文件指南:如何請求 Excel/PDF 文件?

在 Postman 中進行 Excel/PDF 文件的請求下載和導出&#xff0c;以下是簡明的步驟&#xff0c;幫助你輕松完成任務。首先&#xff0c;我們將從新建接口開始&#xff0c;逐步引導你完成整個過程。 Postman 請求下載/導出 excel/pdf 文件教程

重要重要!!fisher矩陣是怎么計算和更新的,以及計算過程中參數的物理含義

fisher矩陣是怎么計算和更新的,以及計算過程中參數的物理含義 Fisher信息矩陣(Fisher Information Matrix, FIM)用于衡量模型參數估計的不確定性,其計算和更新在統計學、機器學習和優化中具有重要作用。以下是其計算和更新的關鍵步驟: 一、Fisher矩陣的計算 定義 Fisher…

21.Excel自動化:如何使用 xlwings 進行編程

一 將Excel用作數據查看器 使用 xlwings 中的 view 函數。 1.導包 import datetime as dt import xlwings as xw import pandas as pd import numpy as np 2.view 函數 創建一個基于偽隨機數的DataFrame&#xff0c;它有足夠多的行&#xff0c;使得只有首尾幾行會被顯示。 df …

Elasticsearch客戶端工具初探--kibana

1 Kibana簡介 Kibana是Elastic Stack&#xff08;ELK&#xff09;中的可視化工具&#xff0c;用于對Elasticsearch中存儲的數據進行搜索、分析和可視化展示。它提供了直觀的Web界面&#xff0c;支持日志分析、業務監控、數據探索等功能&#xff0c;廣泛應用于運維監控、安全分析…

珍珠港海軍造船廠的“水魔法”:PcVue賦能造船心臟

導讀 項目背景 干船塢運作與控制需求 PcVue SCADA 系統的引入以及系統升級 項目成果 憑借更高的安全性&#xff0c;PcVue 對干船塢的充水和排水過程進行精準控制。 項目背景 珍珠港海軍基地與希卡姆空軍基地均依托這座歷史悠久的港口而發展&#xff0c;該港口在夏威夷原住…

3. 軸指令(omron 機器自動化控制器)——>MC_GearInPos

機器自動化控制器——第三章 軸指令 17 MC_GearInPos變量?輸入變量?輸出變量?輸入輸出變量 功能說明?時序圖?重啟運動指令?多重啟動運動指令?異常 示例程序?動作示例?梯形圖?結構文本(ST) MC_GearInPos 設定主軸和從軸間的齒輪比&#xff0c;進行電子齒輪動作。 指定…

vue 加載動態效果,自行封裝組件

背景&#xff1a; 在項目開發中&#xff0c;會請求接口&#xff0c;就會遇到加載中、加載成功、加載失敗、和加載成功但暫無數據等情況。就自行封裝了一個加載組件。采用vue3elementsetup組合式寫法。 實現效果&#xff1a; 封裝組件&#xff1a; //封裝組件 <template>…

八目導航 version:1.2

八目導航 version&#xff1a;1.2 網址&#xff1a;https://crbssseooebc.sealoshzh.site/ 日志&#xff1a; 1.美化了頁面 2.新增并替換了部分網址 3.不會出現危險網址提示(指的是進入八目導航時) 4.為網址圖標增加了動效 5.采用Vue3框架重新實現了該導航 注意&#xff1a;該…