最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python讀寫Redis緩存數(shù)據(jù)庫的入門指南

 更新時間:2026年05月18日 08:38:45   作者:yuanpan  
很多學習 Python 的小伙伴,在學完文件讀寫、SQLite、MySQL 之后,都會接觸到一個新的數(shù)據(jù)庫:Redis,這篇文章會先簡單介紹 Redis 是什么,然后通過 Python 代碼演示如何連接 Redis,并完成常見的讀寫操作,需要的朋友可以參考下

引言

很多學習 Python 的小伙伴,在學完文件讀寫、SQLite、MySQL 之后,都會接觸到一個新的數(shù)據(jù)庫:Redis。

Redis 和傳統(tǒng)關(guān)系型數(shù)據(jù)庫不太一樣。MySQL、SQLite 更擅長長期保存結(jié)構(gòu)化數(shù)據(jù),而 Redis 更常用于緩存、計數(shù)器、排行榜、驗證碼、分布式鎖、消息隊列等高性能場景。

這篇文章會先簡單介紹 Redis 是什么,然后通過 Python 代碼演示如何連接 Redis,并完成常見的讀寫操作。

一、Redis 是什么

Redis 全稱是 Remote Dictionary Server,可以理解為一個高性能的內(nèi)存型 Key-Value 數(shù)據(jù)庫。

它的核心特點是:

  1. 數(shù)據(jù)主要存放在內(nèi)存中,讀寫速度非???/li>
  2. 使用 Key-Value 形式保存數(shù)據(jù)
  3. 支持豐富的數(shù)據(jù)結(jié)構(gòu),不只是簡單字符串
  4. 支持設(shè)置過期時間,適合做緩存
  5. 支持持久化,可以把內(nèi)存數(shù)據(jù)保存到磁盤
  6. 常用于緩存、計數(shù)、排行榜、會話、限流等場景

我們可以把 Redis 想象成一個超快的字典:

cache = {
    "user:1:name": "Alice",
    "article:100:view_count": 358,
    "login:code:13800138000": "829316"
}

只不過這個字典不是保存在 Python 程序里,而是保存在 Redis 服務中。多個程序、多個接口、多個服務器都可以一起訪問它。

二、Redis 和 MySQL、SQLite 有什么區(qū)別

簡單對比一下:

對比項RedisMySQL / SQLite
存儲方式主要在內(nèi)存中主要在磁盤中
數(shù)據(jù)模型Key-Value 和多種數(shù)據(jù)結(jié)構(gòu)表、行、列
讀寫速度非???/td>相對較慢
常見用途緩存、計數(shù)、排行榜、驗證碼業(yè)務數(shù)據(jù)持久化
查詢方式通過 key 訪問SQL 查詢
是否適合復雜查詢不適合適合

所以 Redis 通常不是用來完全替代 MySQL 或 SQLite 的,而是和它們配合使用。

例如:

  1. 用戶資料保存在 MySQL 中
  2. 熱門用戶資料緩存到 Redis 中
  3. 下次查詢時先查 Redis
  4. Redis 沒有命中,再查 MySQL
  5. 查到后再寫回 Redis

這個模式通常叫緩存旁路,也叫 Cache Aside。

三、準備 Redis 環(huán)境

如果你本機已經(jīng)安裝 Redis,可以直接啟動 Redis 服務。

如果沒有安裝,也可以使用 Docker 快速啟動:

docker run --name redis-demo -p 6379:6379 -d redis

測試 Redis 是否可用:

redis-cli ping

如果返回:

PONG

說明 Redis 服務已經(jīng)啟動成功。

四、安裝 Python Redis 客戶端

Python 操作 Redis 常用的庫是 redis。

安裝命令:

pip install redis

安裝完成后,可以在 Python 中導入:

import redis

五、連接 Redis

新建一個文件 redis_demo.py

import redis


r = redis.Redis(
    host="localhost",
    port=6379,
    db=0,
    decode_responses=True
)

print(r.ping())

運行:

python redis_demo.py

如果輸出:

True

說明 Python 已經(jīng)成功連接到 Redis。

這里的幾個參數(shù)含義如下:

參數(shù)說明
hostRedis 服務器地址
portRedis 端口,默認 6379
dbRedis 數(shù)據(jù)庫編號,默認 0
decode_responses是否把返回值自動解碼成字符串

如果不設(shè)置 decode_responses=True,Redis 返回的字符串可能是字節(jié)類型:

b'Alice'

對初學者來說,建議先加上 decode_responses=True,這樣輸出更直觀。

六、字符串 String:最基礎(chǔ)的緩存讀寫

Redis 最簡單的數(shù)據(jù)類型是 String。

可以用它保存用戶名、驗證碼、Token、簡單配置、緩存結(jié)果等。

import redis


r = redis.Redis(host="localhost", port=6379, db=0, decode_responses=True)

# 寫入字符串
r.set("user:1:name", "Alice")

# 讀取字符串
name = r.get("user:1:name")
print(name)

輸出:

Alice

設(shè)置過期時間

緩存通常不應該永久存在,所以 Redis 支持給 key 設(shè)置過期時間。

例如保存短信驗證碼,60 秒后自動刪除:

r.set("login:code:13800138000", "829316", ex=60)

code = r.get("login:code:13800138000")
print(code)

其中 ex=60 表示 60 秒后過期。

也可以先寫入,再單獨設(shè)置過期時間:

r.set("temp:data", "hello")
r.expire("temp:data", 30)

查看剩余過期時間:

ttl = r.ttl("temp:data")
print(ttl)

七、數(shù)字自增:計數(shù)器案例

Redis 很適合做計數(shù)器,例如文章閱讀量、點贊數(shù)、接口訪問次數(shù)。

article_key = "article:100:view_count"

r.set(article_key, 0)

r.incr(article_key)
r.incr(article_key)
r.incr(article_key)

count = r.get(article_key)
print(count)

輸出:

3

也可以一次增加指定數(shù)量:

r.incrby(article_key, 10)
print(r.get(article_key))

對應減少:

r.decr(article_key)
r.decrby(article_key, 5)

計數(shù)器是 Redis 非常常見的使用場景,因為這類操作簡單、高頻,而且對速度要求高。

八、Hash:保存對象信息

如果要保存一個用戶對象,用多個 String 也可以:

user:1:name
user:1:age
user:1:city

但更推薦使用 Hash:

r.hset("user:1", mapping={
    "name": "Alice",
    "age": 20,
    "city": "Shanghai"
})

name = r.hget("user:1", "name")
print(name)

user = r.hgetall("user:1")
print(user)

輸出:

Alice
{'name': 'Alice', 'age': '20', 'city': 'Shanghai'}

修改 Hash 中的某個字段:

r.hset("user:1", "city", "Beijing")

刪除某個字段:

r.hdel("user:1", "age")

判斷字段是否存在:

exists = r.hexists("user:1", "name")
print(exists)

Hash 非常適合保存用戶資料、商品摘要、文章基礎(chǔ)信息等對象型數(shù)據(jù)。

九、List:保存列表數(shù)據(jù)

Redis 的 List 可以理解為一個有序列表。

常見用途:

  1. 最新消息列表
  2. 簡單隊列
  3. 最近瀏覽記錄
  4. 日志緩沖

示例:

key = "user:1:recent_articles"

r.delete(key)

r.lpush(key, "article:100")
r.lpush(key, "article:101")
r.lpush(key, "article:102")

articles = r.lrange(key, 0, -1)
print(articles)

輸出:

['article:102', 'article:101', 'article:100']

lpush 是從左側(cè)插入,所以最后插入的元素排在最前面。

如果想從右側(cè)插入,可以使用:

r.rpush(key, "article:103")

從列表中彈出一個元素:

item = r.lpop(key)
print(item)

限制列表長度,只保留最近 3 條:

r.ltrim(key, 0, 2)

這個操作很適合做“最近瀏覽記錄”。

十、Set:保存不重復集合

Set 是無序且不重復的集合。

常見用途:

  1. 用戶標簽
  2. 點贊用戶集合
  3. 已簽到用戶集合
  4. 去重統(tǒng)計

示例:記錄給文章點贊的用戶。

key = "article:100:liked_users"

r.delete(key)

r.sadd(key, "user:1")
r.sadd(key, "user:2")
r.sadd(key, "user:1")

users = r.smembers(key)
print(users)

is_liked = r.sismember(key, "user:1")
print(is_liked)

輸出:

{'user:1', 'user:2'}
True

雖然添加了兩次 user:1,但 Set 會自動去重。

統(tǒng)計集合元素數(shù)量:

count = r.scard(key)
print(count)

取消點贊:

r.srem(key, "user:1")

十一、Sorted Set:排行榜案例

Sorted Set 是有序集合,每個元素都有一個分數(shù)。

它非常適合做排行榜。

例如游戲積分排行榜:

key = "game:rank"

r.delete(key)

r.zadd(key, {
    "Alice": 1500,
    "Bob": 1800,
    "Cindy": 1700,
    "David": 1200
})

top3 = r.zrevrange(key, 0, 2, withscores=True)
print(top3)

輸出:

[('Bob', 1800.0), ('Cindy', 1700.0), ('Alice', 1500.0)]

給用戶增加積分:

r.zincrby(key, 200, "Alice")

查詢 Alice 的排名:

rank = r.zrevrank(key, "Alice")
print(rank)

注意:Redis 的排名從 0 開始。如果返回 0,表示第一名。

十二、保存 JSON 數(shù)據(jù)

有時我們希望把一個 Python 字典直接緩存起來。

可以使用 json.dumps() 轉(zhuǎn)成字符串保存,讀取時再用 json.loads() 轉(zhuǎn)回來。

import json
import redis


r = redis.Redis(host="localhost", port=6379, db=0, decode_responses=True)

user = {
    "id": 1,
    "name": "Alice",
    "age": 20,
    "roles": ["admin", "editor"]
}

r.set("cache:user:1", json.dumps(user, ensure_ascii=False), ex=300)

cached_text = r.get("cache:user:1")
cached_user = json.loads(cached_text)

print(cached_user["name"])
print(cached_user["roles"])

這種方式很適合緩存接口返回結(jié)果。

不過要注意:Redis 本身保存的是字符串。如果你要頻繁修改對象中的某個字段,Hash 可能比 JSON 字符串更方便。

十三、完整案例:使用 Redis 緩存用戶資料

下面做一個更貼近實際項目的案例。

假設(shè)我們有一個“慢查詢函數(shù)”,它模擬從數(shù)據(jù)庫查詢用戶資料。為了提高速度,我們先查 Redis;如果 Redis 中沒有,再查數(shù)據(jù)庫,并把結(jié)果寫入 Redis。

import json
import time
import redis


r = redis.Redis(host="localhost", port=6379, db=0, decode_responses=True)


def query_user_from_database(user_id):
    """模擬數(shù)據(jù)庫查詢。"""
    print("正在查詢數(shù)據(jù)庫...")
    time.sleep(2)

    fake_database = {
        1: {"id": 1, "name": "Alice", "age": 20},
        2: {"id": 2, "name": "Bob", "age": 22},
        3: {"id": 3, "name": "Cindy", "age": 19},
    }
    return fake_database.get(user_id)


def get_user(user_id):
    """優(yōu)先從 Redis 緩存讀取用戶資料。"""
    cache_key = f"cache:user:{user_id}"

    cached_user = r.get(cache_key)
    if cached_user:
        print("命中 Redis 緩存")
        return json.loads(cached_user)

    user = query_user_from_database(user_id)
    if user is None:
        return None

    r.set(cache_key, json.dumps(user, ensure_ascii=False), ex=60)
    print("已寫入 Redis 緩存")
    return user


if __name__ == "__main__":
    print(get_user(1))
    print(get_user(1))

第一次運行時,輸出類似:

正在查詢數(shù)據(jù)庫...
已寫入 Redis 緩存
{'id': 1, 'name': 'Alice', 'age': 20}
命中 Redis 緩存
{'id': 1, 'name': 'Alice', 'age': 20}

第一次查詢 Redis 沒有數(shù)據(jù),所以會訪問“數(shù)據(jù)庫”,并等待 2 秒。

第二次查詢時,Redis 中已經(jīng)有緩存,所以直接返回,速度明顯更快。

這就是 Redis 最典型的緩存使用方式。

十四、封裝一個簡單的 Redis 工具類

在項目中,我們通常不會把 Redis 操作散落在各個地方??梢韵确庋b一個簡單工具類:

import json
import redis


class RedisCache:
    def __init__(self, host="localhost", port=6379, db=0):
        self.client = redis.Redis(
            host=host,
            port=port,
            db=db,
            decode_responses=True
        )

    def set_json(self, key, value, expire_seconds=300):
        text = json.dumps(value, ensure_ascii=False)
        self.client.set(key, text, ex=expire_seconds)

    def get_json(self, key):
        text = self.client.get(key)
        if text is None:
            return None
        return json.loads(text)

    def delete(self, key):
        return self.client.delete(key)

    def exists(self, key):
        return self.client.exists(key) == 1


cache = RedisCache()

cache.set_json("user:1", {"id": 1, "name": "Alice"}, expire_seconds=60)

user = cache.get_json("user:1")
print(user)

print(cache.exists("user:1"))

cache.delete("user:1")

這樣后續(xù)業(yè)務代碼會更清晰。

十五、連接池:更適合項目使用

在 Web 項目中,不建議每次請求都重新創(chuàng)建 Redis 連接。

可以使用連接池:

import redis


pool = redis.ConnectionPool(
    host="localhost",
    port=6379,
    db=0,
    decode_responses=True,
    max_connections=20
)

r = redis.Redis(connection_pool=pool)

r.set("site:name", "Python Redis Demo")
print(r.get("site:name"))

連接池可以復用連接,減少頻繁創(chuàng)建連接帶來的開銷。

如果你以后使用 Flask、FastAPI、Django,也可以在應用啟動時創(chuàng)建 Redis 客戶端,然后在接口中復用它。

十六、刪除 key 和清理數(shù)據(jù)庫

刪除一個 key:

r.delete("user:1")

判斷 key 是否存在:

exists = r.exists("user:1")
print(exists)

查看匹配的 key:

keys = r.keys("user:*")
print(keys)

清空當前數(shù)據(jù)庫:

r.flushdb()

清空所有數(shù)據(jù)庫:

r.flushall()

注意:flushdb()flushall() 都是危險操作,真實項目中不要隨便執(zhí)行。

十七、初學者常見問題

1. 連接失敗

常見錯誤:

redis.exceptions.ConnectionError

可能原因:

  1. Redis 服務沒有啟動
  2. host 或 port 寫錯了
  3. Docker 容器沒有映射 6379 端口
  4. Redis 設(shè)置了密碼,但代碼中沒有配置

如果 Redis 設(shè)置了密碼,需要這樣連接:

r = redis.Redis(
    host="localhost",
    port=6379,
    password="your_password",
    decode_responses=True
)

2. 讀取結(jié)果是字節(jié)類型

如果看到:

b'Alice'

可以在連接時加上:

decode_responses=True

3. JSON 讀取報錯

如果執(zhí)行:

json.loads(text)

報錯,通常說明 Redis 中保存的內(nèi)容不是合法 JSON 字符串。

建議保存和讀取都封裝成統(tǒng)一方法,避免同一個 key 有時存普通字符串,有時存 JSON。

4. 緩存數(shù)據(jù)不是最新的

緩存會帶來一個新問題:數(shù)據(jù)庫更新了,但 Redis 里還是舊數(shù)據(jù)。

常見處理方式:

  1. 更新數(shù)據(jù)庫后刪除緩存
  2. 設(shè)置較短的過期時間
  3. 對一致性要求很高的數(shù)據(jù),不要隨便緩存

例如:

def update_user_name(user_id, new_name):
    update_database_user_name(user_id, new_name)
    r.delete(f"cache:user:{user_id}")

這樣下次查詢時會重新從數(shù)據(jù)庫讀取最新數(shù)據(jù),再寫入 Redis。

十八、Redis key 命名建議

Redis 的 key 最好有清晰的命名規(guī)則。

推薦格式:

業(yè)務名:對象名:對象ID:字段名

例如:

user:1:profile
user:1:recent_articles
article:100:view_count
article:100:liked_users
login:code:13800138000
game:rank

好的 key 命名可以讓排查問題更容易。

不推薦隨意命名:

a
test
data1
abc

項目變大后,這類 key 很難維護。

十九、什么時候適合使用 Redis

適合使用 Redis 的場景:

  1. 高頻讀取的數(shù)據(jù)
  2. 可以設(shè)置過期時間的數(shù)據(jù)
  3. 允許短時間不一致的數(shù)據(jù)
  4. 計數(shù)器、排行榜、點贊集合
  5. 驗證碼、Token、Session
  6. 接口限流、簡單隊列

不適合使用 Redis 的場景:

  1. 復雜 SQL 查詢
  2. 強事務業(yè)務
  3. 長期保存的核心數(shù)據(jù)
  4. 需要大量關(guān)聯(lián)查詢的數(shù)據(jù)

一句話總結(jié):核心業(yè)務數(shù)據(jù)放 MySQL、PostgreSQL、SQLite 等數(shù)據(jù)庫中,Redis 更適合放熱點數(shù)據(jù)和臨時數(shù)據(jù)。

二十、完整練習代碼

最后給出一個可以直接運行的綜合練習:

import json
import redis


def main():
    r = redis.Redis(host="localhost", port=6379, db=0, decode_responses=True)

    print("連接狀態(tài):", r.ping())

    print("\n=== String 示例 ===")
    r.set("app:name", "Redis Python Demo", ex=300)
    print(r.get("app:name"))

    print("\n=== Counter 示例 ===")
    r.delete("article:1:view_count")
    for _ in range(5):
        r.incr("article:1:view_count")
    print(r.get("article:1:view_count"))

    print("\n=== Hash 示例 ===")
    r.hset("user:1", mapping={"name": "Alice", "age": 20, "city": "Shanghai"})
    print(r.hgetall("user:1"))

    print("\n=== List 示例 ===")
    r.delete("user:1:recent")
    r.lpush("user:1:recent", "article:100", "article:101", "article:102")
    print(r.lrange("user:1:recent", 0, -1))

    print("\n=== Set 示例 ===")
    r.delete("article:1:likes")
    r.sadd("article:1:likes", "user:1", "user:2", "user:1")
    print(r.smembers("article:1:likes"))

    print("\n=== Sorted Set 示例 ===")
    r.delete("rank:score")
    r.zadd("rank:score", {"Alice": 98, "Bob": 86, "Cindy": 95})
    print(r.zrevrange("rank:score", 0, -1, withscores=True))

    print("\n=== JSON 緩存示例 ===")
    user = {"id": 1, "name": "Alice", "skills": ["Python", "Redis"]}
    r.set("cache:user:1", json.dumps(user, ensure_ascii=False), ex=60)
    cached_user = json.loads(r.get("cache:user:1"))
    print(cached_user)


if __name__ == "__main__":
    main()

運行前確保:

  1. Redis 服務已經(jīng)啟動
  2. 已安裝 Python 依賴:pip install redis
  3. 代碼中的 host、port、password 配置正確

總結(jié)

Python 操作 Redis 的核心流程并不復雜:

安裝 redis 庫 -> 連接 Redis -> 選擇數(shù)據(jù)結(jié)構(gòu) -> 寫入數(shù)據(jù) -> 讀取數(shù)據(jù) -> 設(shè)置過期時間

常用方法可以簡單記?。?/p>

方法作用
set() / get()讀寫字符串
incr() / decr()計數(shù)器
hset() / hgetall()操作 Hash
lpush() / lrange()操作 List
sadd() / smembers()操作 Set
zadd() / zrevrange()操作排行榜
expire() / ttl()設(shè)置和查看過期時間
delete()刪除 key

對 Python 初學者來說,學習 Redis 的重點不是一開始就背所有命令,而是先理解它適合解決什么問題。

如果你能掌握緩存用戶資料、驗證碼、計數(shù)器、排行榜這幾個案例,就已經(jīng)可以在很多真實項目中使用 Redis 了。

以上就是Python讀寫Redis緩存數(shù)據(jù)庫的入門指南的詳細內(nèi)容,更多關(guān)于Python讀寫Redis緩存數(shù)據(jù)庫的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文詳解python多繼承的3C算法

    一文詳解python多繼承的3C算法

    有很多地方都說python多繼承的繼承順序,是按照深度遍歷的方式,其實python多繼承順序的算法,不是嚴格意義上的深度遍歷,而是基于深度遍歷基礎(chǔ)上優(yōu)化出一種叫3C算法,本文將給大家詳細的介紹一下python多繼承的3C算法,需要的朋友可以參考下
    2024-07-07
  • pytorch實現(xiàn)線性擬合方式

    pytorch實現(xiàn)線性擬合方式

    今天小編就為大家分享一篇pytorch實現(xiàn)線性擬合方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python數(shù)據(jù)結(jié)構(gòu)與算法之字典樹實現(xiàn)方法示例

    Python數(shù)據(jù)結(jié)構(gòu)與算法之字典樹實現(xiàn)方法示例

    這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之字典樹實現(xiàn)方法,可實現(xiàn)針對單詞出現(xiàn)次數(shù)的統(tǒng)計功能,涉及Python樹結(jié)構(gòu)的定義、遍歷及統(tǒng)計等相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • 在Python的Django框架下使用django-tagging的教程

    在Python的Django框架下使用django-tagging的教程

    這篇文章主要介紹了在Python的Django框架下使用django-tagging的教程,針對網(wǎng)絡(luò)編程中的tag部分功能提供幫助,需要的朋友可以參考下
    2015-05-05
  • python輸出第n個默尼森數(shù)的實現(xiàn)示例

    python輸出第n個默尼森數(shù)的實現(xiàn)示例

    這篇文章主要介紹了python輸出第n個默尼森數(shù)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • 使用python處理一萬份word表格簡歷操作

    使用python處理一萬份word表格簡歷操作

    這篇文章主要介紹了使用python處理一萬份word表格簡歷操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python郵件中附加文字、html、圖片、附件實現(xiàn)方法

    python郵件中附加文字、html、圖片、附件實現(xiàn)方法

    在本篇文章里小編給大家整理了一篇關(guān)于python郵件中附加文字、html、圖片、附件實現(xiàn)方法,有興趣的朋友們跟著學習下。
    2021-01-01
  • 使用python批量化音樂文件格式轉(zhuǎn)換的實例

    使用python批量化音樂文件格式轉(zhuǎn)換的實例

    今天小編就為大家分享一篇使用python批量化音樂文件格式轉(zhuǎn)換的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python 字典中文key處理,讀取,比較方法

    python 字典中文key處理,讀取,比較方法

    今天小編就為大家分享一篇python 字典中文key處理,讀取,比較方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python學習之.iloc與.loc的區(qū)別、聯(lián)系和用法

    Python學習之.iloc與.loc的區(qū)別、聯(lián)系和用法

    loc和iloc都是pandas工具中定位某一行的函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python學習之.iloc與.loc的區(qū)別、聯(lián)系和用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05

最新評論

宜川县| 吴桥县| 湾仔区| 巴彦县| 永济市| 红桥区| 长春市| 来宾市| 彭泽县| 凤山县| 镇宁| 黎城县| 上饶县| 金堂县| 东平县| 霍城县| 临沂市| 乐陵市| 岳阳市| 黄梅县| 普宁市| 宁乡县| 确山县| 济阳县| 潜山县| 呼和浩特市| 同德县| 类乌齐县| 措美县| 晋宁县| 固始县| 新昌县| 杭锦后旗| 西城区| 通海县| 上高县| 克什克腾旗| 涞水县| 富民县| 开原市| 盐源县|