Redis是徹底開源免費的,遵照BSD協議,是一個高性能的key-value數據庫。python
Redis有如下特色:redis
-- Redis支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。數據庫
-- Redis支持五種數據類型。django
-- Redis支持數據庫備份。vim
Redis的優點:安全
-- Redis性能極高,讀的速度是110000次/s,寫的速度是81000次/s。app
-- Redis豐富的數據類型,String,Lists,Hashes,Sets以及Ordered Sets。編輯器
-- Redis的全部操做都是原子性的,意思就是要麼成功執行,要麼徹底失敗不執行,多個操做支持事物。即MULTI和EXEC指令包起來。ide
-- 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"
-- 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正是經過對分數的排序對集合進行有序存儲。
-- 下載 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 conn = redis.Redis(host="127.0.0.1", port=6379, decode_responses=True) # conn.set("n1", "v1") # conn.hset("n2", "k2", "v2") # 設置字典 redis = {n2: {k2: v2}} # ret1 = conn.get("n1") # ret2 = conn.hget("n2", "k2") # print(ret1) # print(ret2) conn.hmset("n3", {"k3": "v3", "k4": "v4"}) # 設置多個值 # ret3 = conn.hget("n3", "k3") # ret4 = conn.hget("n3", "k4") # ret5 = conn.hgetall("n3") # 獲取全部值 # ret6 = conn.get("xxxx") # print(ret6) # print(ret3) # print(ret4) # print(ret5)
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命令之String
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命令之Hash
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命令之List
使用connection pool來管理對一個redis server的全部鏈接,避免每次創建、釋放鏈接的開銷。
默認,每一個Redis實例都會維護一個本身的鏈接池。能夠直接創建一個鏈接池,
而後做爲參數傳給Redis實例,這樣就能夠實現多個Redis實例共享一個鏈接池。
import redis # 保持跟數據庫的連接,當超過數量時,就等着 # # 解碼,打印出來再也不是b'xx' 最大連接數 pool = redis.ConnectionPool(host="127.0.0.1", port=6379, decode_responses=True, max_connections=10) conn = redis.Redis(connection_pool=pool) ret = conn.get("n1") print(ret)
啓動監聽
import redis conn = redis.Redis(host="127.0.0.1", port=6379, decode_responses=True) # 第一步 生成一個訂閱者對象 pubsub = conn.pubsub() # 第二步 訂閱一個消息 pubsub.subscribe("lewen") # 建立一個接收 while True: print("working~~~") msg = pubsub.parse_response() print(msg) # 默認值是1 # 只要訂閱的內容發佈改變,就會更新全部
發佈內容
import redis conn = redis.Redis(host="127.0.0.1", port=6379, decode_responses=True) conn.publish("lewen", "cq")
Django Redis
pip install django-redis
參考django-redis 的文檔 以及源碼裏看封裝的一些方法