Redis
Redis是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。
Redis有以下特點:
-- Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
-- Redis支持五種數據類型。
-- Redis支持數據庫備份。
Redis的優勢:
-- Redis性能極高,讀的速度是110000次/s,寫的速度是81000次/s。
-- Redis豐富的數據類型,String,Lists,Hashes,Sets以及Ordered Sets。
-- Redis的所有操作都是原子性的,意思就是要么成功執行,要么完全失敗不執行,多個操作支持事物。即MULTI和EXEC指令包起來。
-- Redis有豐富的特性,支持publish/subscribe,通知,key過期等等特性。
Redis 配置
-- 可以通過redis-cli 進入交互模式,使用config命令查看或設置配置項。也可以進入配置文件用vim編輯器進行修改。
# 獲取所有配置項 reids 127.0.0.1:6379> config get * # 獲取單個配置項 redis 127.0.0.1:6379> config get loglevel # 編輯配置 redis 127.0.0.1:6379> config set loglevel "notice"
Redis 數據類型
-- String 字符串
-- redis的string可以包含任何數據,包括圖片以及序列化的對象,一個鍵最大能存儲512MB。
-- Hash 哈希
-- redis的hash是一個String類型的key和value的映射表,hash特別適合存儲對象,類比python字典。
-- List 列表
-- redis的list是簡單的字符串列表,按照插入順序排序,可以從兩端進行添加,類似於雙向鏈表,列表還可以進行阻塞。
-- Set 集合
-- redis的set是字符串類型的無序且不重復集合。集合是通過哈希表實現的,所以添加,刪除,查找的時間復雜度都是O(1)。
-- Zset 有序集合
-- redis的zset和set一樣,不同的是每個元素都會關聯一個double類型的分數,redis正是通過對分數的排序對集合進行有序存儲。
Python 操作Redis
-- 下載 pip install redis
-- 連接
Redis提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令,
Redis是StrictRedis的子類,用於向后兼容舊版本的redis-py。
Redis連接實例是線程安全的,可以直接將redis連接實例設置為一個全局變量,直接使用。
如果需要另一個Redis實例(or Redis數據庫)時,就需要重新創建redis連接實例來獲取一個新的連接
連接redis,加上decode_responses=True,寫入的鍵值對中的value為str類型,不加這個參數寫入的則為字節類型。
import redis res = redis.Redis(host="localhost", port=6379, password="", decode_responses=True) res.set("gaoxin", 18) print(type(res.get("gaoxin"))) # <class 'str'>
Python Redis 連接池
使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。
默認,每個Redis實例都會維護一個自己的連接池。可以直接建立一個連接池,
然后作為參數傳給Redis實例,這樣就可以實現多個Redis實例共享一個連接池。
pool = redis.ConnectionPool(host="localhost", port=6379, password="", decode_responses=True) res = redis.Redis(connection_pool=pool) res.set("haha", 18) print(res.get("haha"))
Redis的基本命令
Redis的命令 String
set(name, value, ex=None, px=None, nx=False, xx=False) 在Redis中設置值,默認,不存在則創建,存在則修改 參數: ex,過期時間(秒)過期后值None px,過期時間(毫秒) nx,如果設置為True,則只有name不存在時,當前set操作才執行 xx,如果設置為True,則只有name存在時,當前set操作才執行 注:ex,px,nx,xx可以跟在命令后面 eg: setnx 表示只能創建 hash命令一樣適用 get(key) 獲取key的值 mset(*args, **kwargs) 批量設置值 mget(key, *args) .....請走入官方文檔.....
Redis的命令 hash
hset(name, key, value) 增加單個 不存在則創建 hget(name, key) 獲取單個 hmset(name, mapping) 批量增加 mapping為字典 hgetall(name) 獲取name對應hash的所有鍵值 hlen(name) 獲取name對應的hash中鍵值對的個數 hkeys(name) 獲取name對應的hash中所有的key的值 hvals(name) 獲取name對應的hash中所有的value的值 hexists(name, key) 檢查name對應的hash是否存在當前傳入的key hdel(name,*keys) 將name對應的hash中指定key的鍵值對刪除 hscan_iter(name, match=None, count=None) 利用yield封裝hscan創建生成器,實現分批去redis中獲取數據 參數: match,匹配指定key,默認None 表示所有的key count,每次分片最少獲取個數,默認None表示采用Redis的默認分片個數
Redis的命令 list
lpush(name,values) 在name對應的list中左邊添加元素 沒有就新建 llen(name) 獲取name對應的列表長度 lrang(name, index1, index2) 按照index切片取出name對應列表里值 lpushx(name, value) 只能添加不能新建 linsert(name, where, refvalue, value)) 在name對應的列表的某一個值前或后插入一個新值 參數: name,redis的name where,BEFORE或AFTER refvalue,標桿值,即:在它前后插入數據 value,要插入的數據 lset(name, index, value) 給指定索引修改值 lrem(name, value, num) 在name對應的list中刪除指定的值 參數: name,redis的name value,要刪除的值 num, num=0,刪除列表中所有的指定值; num=2,從前到后,刪除2個; num=1,從前到后,刪除左邊第1個 num=-2,從后向前,刪除2個 lindex(name, index) 在name對應的列表中根據索引獲取列表元素
剩下的集合以及有序集合的命令 請移步官方文檔~~~~
redis的發布訂閱者模式
redis的發布和訂閱者模式就像是廣播發消息是一樣的,我們來測試下發布以及訂閱者模式~
# by gaoxin import redis r = redis.Redis(host="127.0.0.1", password="", decode_responses=True) # 第一步 生成一個訂閱者對象 pubsub = r.pubsub() # 第二步 訂閱一個消息 實際上就是監聽這個鍵 pubsub.subscribe("gaoxin") # 第三步 死循環一直等待監聽結果 while True: print("working~~~") msg = pubsub.parse_response() print(msg)
# by gaoxin import redis r = redis.Redis(host="127.0.0.1", password="", decode_responses=True) r.publish("gaoxin", "hahaha")
Django Redis
pip install django-redis
參考django-redis 的文檔 以及源碼里看封裝的一些方法
