【數據庫】Redis詳解:內存數據庫與緩存之王

什么是Redis?

Redis(Remote Dictionary Server)是一個開源的、基于內存的數據結構存儲系統,可以用作數據庫、緩存和消息代理。它支持多種數據結構,如字符串、哈希、列表、集合、有序集合等,具有極高的性能和豐富的功能。

核心特性

1. 內存存儲

  • 數據主要存儲在內存中,讀寫速度極快
  • 支持持久化到磁盤,保證數據安全
  • 支持數據過期自動刪除

2. 豐富的數據結構

  • String:字符串
  • Hash:哈希表
  • List:列表
  • Set:集合
  • Sorted Set:有序集合
  • Bitmap:位圖
  • HyperLogLog:基數統計
  • Stream:流數據

3. 高性能

  • 單線程模型,避免上下文切換
  • 基于內存操作,讀寫性能極高
  • 支持管道(pipeline)批量操作

4. 高可用

  • 主從復制
  • Redis Sentinel(哨兵)
  • Redis Cluster(集群)

數據結構與操作

1. 字符串(String)

# 設置值
SET key "value"# 獲取值
GET key# 設置帶過期時間
SETEX key 60 "value"# 數值操作
INCR counter
DECR counter
INCRBY counter 10

2. 哈希(Hash)

# 設置哈希字段
HSET user:1000 name "John"
HSET user:1000 email "john@example.com"
HMSET user:1000 name "John" email "john@example.com" age 30# 獲取哈希字段
HGET user:1000 name
HGETALL user:1000
HMGET user:1000 name email# 哈希操作
HINCRBY user:1000 age 1
HLEN user:1000

3. 列表(List)

# 從左側插入
LPUSH mylist "a"
LPUSH mylist "b"# 從右側插入
RPUSH mylist "c"# 獲取列表
LRANGE mylist 0 -1# 彈出元素
LPOP mylist
RPOP mylist# 列表長度
LLEN mylist

4. 集合(Set)

# 添加元素
SADD myset "a" "b" "c"# 獲取所有元素
SMEMBERS myset# 檢查元素是否存在
SISMEMBER myset "a"# 獲取集合大小
SCARD myset# 隨機彈出元素
SPOP myset

5. 有序集合(Sorted Set)

# 添加元素
ZADD leaderboard 100 "Alice" 200 "Bob" 150 "Charlie"# 獲取排名
ZRANGE leaderboard 0 -1
ZREVRANGE leaderboard 0 -1# 獲取分數
ZSCORE leaderboard "Alice"# 按分數范圍獲取
ZRANGEBYSCORE leaderboard 100 200# 獲取排名
ZRANK leaderboard "Alice"

高級數據結構

1. 位圖(Bitmap)

# 設置位
SETBIT mybitmap 0 1
SETBIT mybitmap 1 0# 獲取位
GETBIT mybitmap 0# 統計位數
BITCOUNT mybitmap

2. HyperLogLog

# 添加元素
PFADD visitors "user1" "user2" "user3"# 獲取基數
PFCOUNT visitors# 合并
PFMERGE all_visitors visitors1 visitors2

3. 地理空間(Geo)

# 添加地理位置
GEOADD locations 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"# 計算距離
GEODIST locations "Palermo" "Catania"# 獲取位置
GEOPOS locations "Palermo"# 半徑查詢
GEORADIUS locations 15 37 100 km

事務

基本事務

# 開始事務
MULTI# 命令入隊
SET key1 "value1"
SET key2 "value2"
INCR counter# 執行事務
EXEC# 取消事務
DISCARD

樂觀鎖(WATCH)

# 監視鍵
WATCH mykey# 檢查并執行
MULTI
SET mykey "newvalue"
EXEC

發布訂閱

發布者

# 發布消息
PUBLISH news "Hello subscribers!"

訂閱者

# 訂閱頻道
SUBSCRIBE news# 訂閱多個頻道
SUBSCRIBE news sports# 模式訂閱
PSUBSCRIBE news.*

持久化

1. RDB(快照)

# 配置文件
save 900 1      # 900秒內至少1個鍵被修改
save 300 10     # 300秒內至少10個鍵被修改
save 60 10000   # 60秒內至少10000個鍵被修改# 手動保存
SAVE      # 同步保存
BGSAVE    # 異步保存

2. AOF(追加文件)

# 配置AOF
appendonly yes
appendfsync everysec    # 每秒同步一次

主從復制

配置主服務器

# 主服務器配置
port 6379

配置從服務器

# 從服務器配置
port 6380
slaveof 127.0.0.1 6379

查看復制狀態

# 在主服務器上
INFO replication# 在從服務器上
INFO replication

Redis Sentinel(哨兵)

配置哨兵

# sentinel.conf
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000

啟動哨兵

redis-sentinel sentinel.conf

Redis Cluster(集群)

集群配置

# 創建集群
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1

集群操作

# 查看集群信息
CLUSTER INFO# 查看節點信息
CLUSTER NODES# 添加節點
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

性能優化

1. 內存優化

# 設置最大內存
maxmemory 2gb# 內存淘汰策略
maxmemory-policy allkeys-lru

2. 連接優化

# 最大連接數
maxclients 10000# TCP backlog
tcp-backlog 511

3. 慢查詢日志

# 啟用慢查詢
slowlog-log-slower-than 10000
slowlog-max-len 128

緩存應用

1. 緩存穿透

# 使用布隆過濾器
import redis
r = redis.Redis()def get_user(user_id):# 先檢查布隆過濾器if not r.exists(f"user:{user_id}"):return None# 從緩存獲取user = r.get(f"user:{user_id}")if user:return json.loads(user)# 從數據庫獲取user = db.get_user(user_id)if user:r.setex(f"user:{user_id}", 3600, json.dumps(user))else:# 緩存空值,防止穿透r.setex(f"user:{user_id}", 300, "null")return user

2. 緩存雪崩

# 隨機過期時間
def set_cache(key, value, base_expire=3600):# 添加隨機偏移,避免同時過期expire = base_expire + random.randint(-600, 600)r.setex(key, expire, value)

3. 緩存擊穿

# 使用互斥鎖
def get_hot_data(key):value = r.get(key)if value:return value# 獲取鎖lock_key = f"lock:{key}"if r.set(lock_key, 1, nx=True, ex=5):try:# 從數據庫獲取數據value = db.get_data(key)r.setex(key, 3600, value)return valuefinally:r.delete(lock_key)else:# 等待并重試time.sleep(0.1)return r.get(key)

與Python集成

使用redis-py

import redis
import json# 連接Redis
r = redis.Redis(host='localhost', port=6379, db=0)# 字符串操作
r.set('name', 'Alice')
name = r.get('name')# 哈希操作
r.hset('user:1000', mapping={'name': 'John','email': 'john@example.com','age': 30
})
user = r.hgetall('user:1000')# 列表操作
r.lpush('tasks', 'task1', 'task2')
tasks = r.lrange('tasks', 0, -1)# 集合操作
r.sadd('tags', 'python', 'redis', 'database')
tags = r.smembers('tags')# 有序集合
r.zadd('scores', {'Alice': 100, 'Bob': 200})
top_scores = r.zrevrange('scores', 0, 10, withscores=True)

使用Redis作為緩存

import redis
from functools import wrapsr = redis.Redis()def cache_decorator(expire_time=3600):def decorator(func):@wraps(func)def wrapper(*args, **kwargs):cache_key = f"{func.__name__}:{str(args)}:{str(kwargs)}"cached = r.get(cache_key)if cached:return json.loads(cached)result = func(*args, **kwargs)r.setex(cache_key, expire_time, json.dumps(result))return resultreturn wrapperreturn decorator@cache_decorator(expire_time=1800)
def get_user_profile(user_id):# 模擬數據庫查詢return {"id": user_id, "name": "John", "email": "john@example.com"}

常見應用場景

1. 緩存系統

  • 頁面緩存
  • 數據緩存
  • 會話緩存

2. 計數器

  • 網站訪問量
  • 點贊數
  • 庫存管理

3. 消息隊列

  • 任務隊列
  • 發布訂閱
  • 實時消息

4. 排行榜

  • 游戲排行榜
  • 熱門文章
  • 用戶積分

5. 實時系統

  • 在線用戶
  • 實時統計
  • 地理位置

監控與管理

1. 查看統計信息

# 查看服務器信息
INFO server# 查看內存使用
INFO memory# 查看客戶端連接
INFO clients# 查看統計信息
INFO stats

2. 慢查詢分析

# 查看慢查詢
SLOWLOG GET 10# 清空慢查詢日志
SLOWLOG RESET

3. 內存分析

# 查看內存使用
MEMORY USAGE key# 查看鍵的編碼
OBJECT ENCODING key

優缺點分析

優點

  • 極高的性能
  • 豐富的數據結構
  • 支持持久化
  • 高可用性
  • 易于擴展

缺點

  • 內存消耗大
  • 單線程模型
  • 不支持復雜查詢
  • 數據一致性較弱

學習資源推薦

  • 官方文檔:https://redis.io/documentation
  • 在線教程:Redis Tutorial
  • 書籍:《Redis設計與實現》、《Redis實戰》
  • 實踐項目:緩存系統、實時排行榜、消息隊列

總結

Redis作為內存數據庫的王者,憑借其極高的性能和豐富的數據結構,在現代應用架構中扮演著重要角色。無論是作為緩存、消息隊列還是實時數據處理系統,Redis都能提供出色的性能表現。對于需要高性能、低延遲的應用場景,Redis是不可或缺的技術選擇。

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

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

相關文章

【iOS】 單例模式

1. 認識單例模式首先讓我們先看下關于單例模式的定義(來自于《設計模式》(Addison-Wesley,1994))一個類有且僅有一個實例,并且自行實例化向整個系統提供。如果說每一個人都是一個類,那么從他出生開始,他就是生活中的唯…

多目標輪廓匹配

前面我們使用模板匹配,得到的結果都是一個圖,那么如果我們圖片中有許多我們的目標,那么該如何找出來呢?如上我們圖片中有許多箭頭和我們的模板一致,只不過方向不對,那么該如何匹配呢?圖片和模板…

【C++】簡單介紹lambda表達式

各位大佬好,我是落羽!一個堅持不斷學習進步的學生。 如果您覺得我的文章還不錯,歡迎多多互三分享交流,一起學習進步! 也歡迎關注我的blog主頁: 落羽的落羽 文章目錄一、 什么是lambda表達式二、 表達式語法三、lambd…

磁共振成像原理(理論)4:自由進動和弛豫 (Free Precession and Relaxation)

當磁化自旋系統被射頻脈沖擾動而偏離其熱平衡態后,一旦移除外部激勵并給予足夠時間,系統將根據熱力學定律返回平衡態。這一過程包含三個特征現象: (a) 自由進動——宏觀磁化矢量 (M?\vec{M}M) 繞( B0?\vec {B_0}B0?? )場的進動&#xff1…

ubuntu 20.04 安裝spark

安裝openjdk21 下載 wget https://download.java.net/openjdk/jdk21/ri/openjdk-2135_linux-x64_bin.tar.gz解壓 tar -xvf openjdk-2135_linux-x64_bin.tar.gzsudo mv jdk-21/ /opt/jdk-21/設置環境變量 echo export JAVA_HOME/opt/jdk-21 | sudo tee /etc/profile.d/java2…

第三方區塊鏈應用測評:【多簽錢包合約安全評估_閾值簽名機制與私鑰存儲安全性測試】

閾值簽名機制安全測試密碼學審計 采用門限簽名方案(TSS)的多簽錢包需驗證其閾值BLS簽名或ECDSA簽名算法的正確性。測試重點包括:分布式密鑰生成(DKG)過程的保密性(無密鑰信息泄露)、簽名碎片驗證…

大模型處理長文檔的挑戰和解決方案?

當前,AI 應用正處于極速發展階段,大語言模型(LLM)與檢索增強生成(RAG)系統已成為構建智能問答、知識管理等高階 AI 應用的核心引擎,被廣泛應用于金融分析、學術研究、企業合規等多個領域。然而&…

JavaWeb--day1--HTMLCSS

(以下內容全部來自上述課程及課件) web開發介紹 1. 什么是web? Web:全球廣域網,也稱為萬維網,能夠通過瀏覽器訪問的網站。 2. Web網站的工作流程 3. Web標準 Web標準也稱為網頁標準,由一系列的標準組成&#xf…

OpenEuler安裝gitlab,部署gitlab-runner

目錄 一、安裝gitlab 二、安裝部署docker設置源 三、下載部署runner ?編輯 四、構建CI/CD 一、安裝gitlab 1.查看OpenEuler版本 [rootlocalhost ~]# cat /etc/os-release NAME"openEuler" VERSION"24.03 (LTS-SP1)" ID"openEuler" VERSI…

實戰項目-----在圖片 hua.png 中,用紅色畫出花的外部輪廓,用綠色畫出其簡化輪廓(ε=周長×0.005),并在同一窗口顯示

實戰項目實現以下功能:對圖片 hua.png 進行輪廓提取,并在同一窗口中完成以下兩個繪制操作:用紅色畫出花的外部輪廓(即最外層輪廓)用綠色畫出該輪廓的近似多邊形,其中近似精度參數 ε 設置為輪廓周長的 0.00…

開源鴻蒙北向框架開發:系統服務理論詳解

系統服務的啟動 基本可以認為:OpenHarmony 的系統服務進程都是“由 init 直接或間接拉起”的。 直接方式: init 按 /system/etc/init/.cfg 啟動可執行(如 /system/bin/sa_main、/system/bin/samgr 等),這些進程的 PPid…

龍虎榜——20250909

上證指數今天縮量收陰線,跌破10日均線,目前日線總體處于高位寬幅震蕩中,小級別暫未明確方向,指數面臨方向選擇,需要注意高位股的風險。 深證指數今天縮量收陰線,跌破5日均線,接下來幾天方向的選…

基于dijkstra算法的WSN網絡MAC協議matlab仿真,分析網絡延遲與網絡開銷

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.部分程序 4.算法理論概述 5.完整程序 1.程序功能描述 無線傳感器網絡(WSN, Wireless Sensor Network)是由大量低成本、低功耗的傳感器節點組成,通過無線通信實現數據采集、傳輸與…

ES數據庫啟動時可以設置1G一下內存嗎

可以,但強烈不建議在生產環境中這樣做。ES 7.0 版本確實可以設置小于 1GB 的堆內存,但這會帶來嚴重的性能問題和穩定性風險。 快速回答 # 最小化配置示例 - 僅用于測試或開發環境 export ES_JAVA_OPTS"-Xms512m -Xmx512m" ./bin/elasticsearch…

TI-92 Plus計算器:單位換算功能介紹

1 TI-92 Plus計算器:單位換算功能介紹 TI-92 Plus 內置了全面的單位換算功能,支持長度、質量、時間、溫度、面積、體積、速度等數十種物理量的單位轉換,操作直觀,無需手動輸入換算系數。以下是具體使用方法、示例及功能特點&#…

雪球科技Java開發工程師筆試題

單選 1.下列哪些語句關于內存回收的說明是正確的?( C ) A.內存回收程序允許程序員直接釋放內存 B.程序員必須創建一個線程來釋放內存 C.內存回收程序負責釋放無用內存 D.內存回收程序可以在指定的時間釋放內存對象 2.以下哪項不是Java基礎類型(A) A.String B.int C.b…

NV3041A-01芯片屏幕

1. 核心概覽這是一款集成了電源管理、顯示內存(RAM)、時序控制等多種功能的單片顯示驅動芯片(通常稱為Driver IC)。它采用COG(Chip-On-Glass) 工藝,直接將芯片綁定在玻璃基板上,使得…

aiagent知識點

一、MCP (Model Context Protocol) 1. 核心概念是什么:MCP是一個開放協議,用于在應用(如IDE、Agent) 和工具/數據源(如服務器、數據庫) 之間建立標準化的通信。目標:解決AI工具生態的碎片化問題…

第2節-過濾表中的行-WHERE

摘要:在本教程中,您將學習如何使用 PostgreSQL 的 WHERE 子句來篩選表中的行。 PostgreSQL WHERE 子句 SELECT FROM 語句從表中所有行的一個或多個列中查詢數據。實際上,你經常需要選擇滿足某個條件的行。 要根據條件從表中篩選行&#xf…

IACheck賦能AI環評報告審核,推動環保設備制造行業發展

在“雙碳目標”和綠色制造的背景下,環保設備制造行業正在迎來快速發展。然而,環評報告作為項目合規的“通行證”,卻一直是企業最頭疼的環節之一:編寫復雜、審核周期長、錯誤率高。傳統的審核模式不僅耗時耗力,還容易出…