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)
相关文章
相关标签/搜索