Redis單機

一:Redis經常使用命令:

1: String:

  • get:
  • set:
  • mget:
  • mset:
  • type:
  • incr:
  • decr:
  • incrby:
    在這裏插入圖片描述

2:鍵命令:

  • del
  • exists
  • expire
  • ttl
  • keys
  • flushdb : 刪除全部的鍵
  • clear: 清屏

ttl 若是時間過時,新版的將-1,改爲-2了。python

在這裏插入圖片描述

3:hash:存儲對象

  • hset
  • hget
  • hmset
  • hmget
  • hdel

在這裏插入圖片描述

4:list

  • lpush:
  • lrange:
  • rpush:
  • lset:
  • lpop:
  • rpop:

在這裏插入圖片描述

5:zset:有序集合

  • zadd
  • zrange
  • zrevrange
  • zrangebyscore
  • zscore
  • zrem
  • zincrby
    在這裏插入圖片描述

6: set:集合去重:

  • sadd 添加元素
    -smembers : 遍歷元素
  • sismember : 判斷是否包含
  • srem : 刪除元素
    在這裏插入圖片描述

二:Redis在flask中的使用:

在這裏插入圖片描述

from flask import Flask
from redis import StrictRedis
app = Flask(__name__)


# 1: 建立redis客戶端鏈接對象
redis_cli = StrictRedis(host="192.168.44.128", port=6381, decode_responses=True)

# 2:數據增刪改查
redis_cli.set("name:7", "curry", 3600)
print(redis_cli.get("name:7"))

# 3: Hash類型---存儲對象
user_dict = {"name": "kobe", "age": 42, "info": "lakers"}
redis_cli.hmset("user:8", user_dict)
print(redis_cli.hmget("user:8", ["name", "age", "info"]))


if __name__ == '__main__':

    app.run(host='0.0.0.0', debug=True, port=8000)

三:redis事務:

  • 1: MULTI命令:開啓事務,後續命令將加入事務中,這些命令不執行,而是加入隊列中,即便有錯誤也不會回滾。
  • 2: EXEC命令: 執行EXEC命令後,事務中的命令會執行。
  • 3:DISCARD命令:取消事務,事務隊列會清空,客戶端退出事務狀態。
  • 4: 不支持原子性,不會回滾,而是繼續執行。
  • 5:支持隔離性,事務命令按順序執行,不會被客戶端打斷,
  • 6:持久性,支持,可是會丟失數據,
  • 7:一致性,不支持。

在這裏插入圖片描述
事務在代碼中如何實現?redis

from redis import StrictRedis

# 1: 建立redis,客戶端對象
redis_cli = StrictRedis(decode_responses=True)
# 2: 建立redis管道對象
pipeline = redis_cli.pipeline()
# 3: 經過管道對象操做數據庫
a = pipeline.set("name1", "張三")
b = pipeline.get("name1")
# 4: 執行管道的命令
c = pipeline.execute()
print(a, b, c)

四:Redis樂觀鎖:

  • 1: watch
  • 2:事務開啓以前,設置堆數據的監聽,當EXEC時,若是發生數據發生改變,事務會自定取消DISCARD。
  • 3:事務EXEC後,不管成敗,監聽都會被移除。

案例:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
代碼實現:數據庫

from redis import StrictRedis, WatchError
from flask import Flask
app = Flask(__name__)

# 1: 建立redis客戶端對象
redis_cli = StrictRedis(decode_responses=True)
# 2: 建立redis管道對象
pipeline = redis_cli.pipeline()
# 3: 使用watch函數觀察庫存
pipeline.set("count", 100)
pipeline.execute()
key = "count"
while True:
    pipeline.watch(key)
    # 4:一旦使用watch函數事務不會自動開啓,手動開啓事務
    # 5: 讀取庫存,判斷庫存值
    count = redis_cli.get(key)
    if int(count)> 0:
        # 6: 減庫存
        pipeline.multi()
        pipeline.decr(key)
        print("下單成功")
        # 7:提交
        pipeline.execute()
    else:
        print("庫存不足")
        break

    # 7: 移除觀察
    pipeline.reset()
if __name__ == '__main__':

    app.run(host='0.0.0.0', debug=True, port=8000)

五:Redis悲觀鎖:

  • SETNX:
  • 鍵,不存在,則設置成功。
  • 多個客戶端同時強,只有一個能夠設置成功(得到鎖,獲取操做數據的權限)
  • 值不是關鍵,值能夠隨便設置,鍵只能被一我的使用。
    在這裏插入圖片描述
    代碼實現:
from redis import StrictRedis

# 1: 建立redis客戶端對象
redis_cli = StrictRedis(decode_responses=True)
key = "order:Lock"

while True:
    # 2: 建立悲觀鎖
    lock = redis_cli.setnx(key, 1)
    # 3: 防止忘記刪除鎖資源,給鎖資源添加過時時長。---防止出現死鎖。
    redis_cli.expire(key, 5)
    # 4: 獲取庫存
    count = redis_cli.get("count")
    # 5: 爭奪到鎖資源的容許redis客戶端對象進行數據庫增刪改查
    if lock:
        if int(count) > 0:
            redis_cli.decr('count')
            print("下單成功")
        else:
            print("庫存不足")
            break

    # 6: 刪除鎖資源---防止死鎖
    redis_cli.delete(key)

六: 非事務型管道:

  • 1: redis中管道和事務是分離的,能夠只使用管道,不使用事務。
  • 2:管道能夠實現一次發送多條命令給redis服務器,提升傳輸的效率。
  • 3:就一個字段,建立客戶端對象的時候,StrictRedis(decode_responses=True)。
from redis import StrictRedis

# 1: 建立redis,客戶端對象
redis_cli = StrictRedis(decode_responses=True)

# 2:建立redis管道對象---非事務型管道
pipline = redis_cli.pipeline(transaction=False)

# 3:經過管道對象操做數據庫
a = pipline.set("name", "王高")
b = pipline.get("name")

c = pipline.execute()
print(a, b, c)
相關文章
相關標籤/搜索