Redis

出自Local Chinese Wikipedia
跳至導覽 跳至搜尋

Template:Expand language Template:NoteTA Template:Bettertranslation Template:Infobox Software

Redis(Remote Dictionary Server)是一個使用ANSI C編寫的支持網絡、基於內存分布式、可選持久性鍵值對存儲資料庫。根據月度排行網站DB-Engines.com的數據,Redis是最流行的鍵值對存儲資料庫。[1]

歷史[編輯]

Redis始於2009年,最初的開發者是Salvatore Sanfilippo。

Sanfilippo於2010年3月被VMware聘用。[2]

2013年5月,Redis由VMware子公司畢威拓贊助。[3]

2015年6月至,Redis的開發在腳本錯誤:沒有「ilh」這個模塊。贊助下由Sanfilippo團隊維護。[4]

2019年11月,RedisLabs發布了全新的可視化圖形用戶界面Redis工具RedisInsight。

2020年6月,Sanfilippo辭去Redis維護者職務,退居二線擔任「謀士」。Redis轉為社區自治模式。[5]

2024年3月,Redis更改主程式碼授權條款,從開源BSD許可證轉為 Redis Source Available License 或 腳本錯誤:沒有「ilh」這個模塊。雙重授權,不再屬於開源軟體。

支持語言[編輯]

許多語言都包含Redis支持,包括:[6]

頁面Template:Col-begin/styles.css沒有內容。

File:Salvatore Sanfilippo.png
Salvatore Sanfilippo在Redis開發者大會(拍攝於2015年)

Python簡單範例[編輯]

# coding:utf-8
import redis

# lredis-server保持開啓狀態,如果在客戶端設定了密碼 添加password=密碼即可
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0)
r = redis.StrictRedis(connection_pool=pool)
# 字符串
r.set('test', 'aaa')
print r.get('test')
# 列表
# 注意python、lrange兩個range的範圍
x = 0
for x in range(0, 11):
    r.lpush('list', x)
    x = x + 1
print r.lrange('list', '0', '10')

# 雜湊
dict_hash = {'name': 'tang', 'password': 'tang_passwd'}
r.hmset('hash_test', dict_hash)
print r.hgetall('hash_test')

# 集合
r.sadd('set_test', 'aaa', 'bbb')
r.sadd('set_test', 'ccc')
r.sadd('set_test', 'ddd')
print r.smembers('set_test')

# 有序集
r.zadd('zset_test', {'aaa': 1, 'bbb': 1})
r.zadd('zset_test', {'ccc': 1})
r.zadd('zset_test', {'ddd': 1})
print r.zrange('zset_test', 0, 10)

數據模型[編輯]

Redis的外圍由一個鍵、值映射的字典構成。與其他非關係型資料庫主要不同在於:Redis中值的類型不僅限於字符串,還支持如下抽象數據類型:

值的類型決定了值本身支持的操作。Redis支持不同無序、有序的列表,無序、有序的集合間的交集、併集等高級伺服器端原子操作。

持久化[編輯]

Redis通常將全部的數據存儲在內存中。2.4版本後可配置為使用虛擬內存[8]一部分數據集存儲在硬碟上,但這個特性廢棄了。

目前通過兩種方式實現持久化

  • 使用快照,一種半持久耐用模式。不時的將數據集以異步方式從內存以RDB格式寫入硬碟。
  • 1.1版本開始使用更安全的AOF格式替代,一種只能追加的日誌類型。將數據集修改操作記錄起來。Redis能夠在後台對只可追加的記錄進行修改,從而避免日誌的無限增長。

同步[編輯]

Redis支持主從同步。數據可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複製。從盤可以有意無意的對數據進行寫操作。由於完全實現了發布/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道並接收主伺服器完整的消息發布記錄。同步對讀取操作的可擴展性和數據冗餘很有幫助。[9]

性能[編輯]

當數據依賴不再需要,Redis這種基於內存的性質,與在執行一個事務時將每個變化都寫入硬碟的資料庫系統相比就顯得執行效率非常高。[10]寫與讀操作速度沒有明顯差別。

安全性[編輯]

Redis 7.0.0到7.2.6版本及7.4.0到7.4.1版本存在拒絕服務攻擊漏洞(Template:CVE),當擁有權限的認證用戶創建一個畸形的訪問控制列表(ACL)選擇器後,訪問這個畸形選擇器會造成伺服器崩潰,並進入拒絕服務狀態,通過升級到7.2.7或7.4.2版本可修復這個問題[11]

2024年發現所有開啟Lua腳本功能的Redis版本,如果認證過的攻擊者編寫惡意的Lua腳本來操縱垃圾收集器,可能在伺服器上執行任意代碼(Template:CVE[12],需要升級到7.2.7或7.4.2以後的版本並限制Lua腳本以修復這個漏洞[11]。2025年發現Redis8.2.1之前的版本(Template:CVE),攻擊者可通過構造惡意Lua腳本並提交執行碼,觸發遠程代碼執行[13]

參見[編輯]

腳本錯誤:沒有「Portal」這個模塊。

參考資料[編輯]

外部連結[編輯]

Template:NoSQL 腳本錯誤:沒有「Authority control」這個模塊。腳本錯誤:沒有「Check for unknown parameters」這個模塊。