Redis单机

Love The Way You Lie 2022-12-21 06:08 229阅读 0赞

一:Redis常用命令:

1: String:

  • get:
  • set:
  • mget:
  • mset:
  • type:
  • incr:
  • decr:
  • incrby:
    在这里插入图片描述

2:键命令:

  • del
  • exists
  • expire
  • ttl
  • keys
  • flushdb : 删除所有的键
  • clear: 清屏

ttl 如果时间过期,新版的将-1,改成-2了。

在这里插入图片描述

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中的使用:

在这里插入图片描述

  1. from flask import Flask
  2. from redis import StrictRedis
  3. app = Flask(__name__)
  4. # 1: 创建redis客户端连接对象
  5. redis_cli = StrictRedis(host="192.168.44.128", port=6381, decode_responses=True)
  6. # 2:数据增删改查
  7. redis_cli.set("name:7", "curry", 3600)
  8. print(redis_cli.get("name:7"))
  9. # 3: Hash类型---存储对象
  10. user_dict = {
  11. "name": "kobe", "age": 42, "info": "lakers"}
  12. redis_cli.hmset("user:8", user_dict)
  13. print(redis_cli.hmget("user:8", ["name", "age", "info"]))
  14. if __name__ == '__main__':
  15. app.run(host='0.0.0.0', debug=True, port=8000)

三:redis事务:

  • 1: MULTI命令:开启事务,后续命令将加入事务中,这些命令不执行,而是加入队列中,即使有错误也不会回滚。
  • 2: EXEC命令: 执行EXEC命令后,事务中的命令会执行。
  • 3:DISCARD命令:取消事务,事务队列会清空,客户端退出事务状态。
  • 4: 不支持原子性,不会回滚,而是继续执行。
  • 5:支持隔离性,事务命令按顺序执行,不会被客户端打断,
  • 6:持久性,支持,但是会丢失数据,
  • 7:一致性,不支持。

在这里插入图片描述
事务在代码中如何实现?

  1. from redis import StrictRedis
  2. # 1: 创建redis,客户端对象
  3. redis_cli = StrictRedis(decode_responses=True)
  4. # 2: 创建redis管道对象
  5. pipeline = redis_cli.pipeline()
  6. # 3: 通过管道对象操作数据库
  7. a = pipeline.set("name1", "张三")
  8. b = pipeline.get("name1")
  9. # 4: 执行管道的命令
  10. c = pipeline.execute()
  11. print(a, b, c)

四:Redis乐观锁:

  • 1: watch
  • 2:事务开启之前,设置堆数据的监听,当EXEC时,如果发生数据发生改变,事务会自定取消DISCARD。
  • 3:事务EXEC后,无论成败,监听都会被移除。

案例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码实现:

  1. from redis import StrictRedis, WatchError
  2. from flask import Flask
  3. app = Flask(__name__)
  4. # 1: 创建redis客户端对象
  5. redis_cli = StrictRedis(decode_responses=True)
  6. # 2: 创建redis管道对象
  7. pipeline = redis_cli.pipeline()
  8. # 3: 使用watch函数观察库存
  9. pipeline.set("count", 100)
  10. pipeline.execute()
  11. key = "count"
  12. while True:
  13. pipeline.watch(key)
  14. # 4:一旦使用watch函数事务不会自动开启,手动开启事务
  15. # 5: 读取库存,判断库存值
  16. count = redis_cli.get(key)
  17. if int(count)> 0:
  18. # 6: 减库存
  19. pipeline.multi()
  20. pipeline.decr(key)
  21. print("下单成功")
  22. # 7:提交
  23. pipeline.execute()
  24. else:
  25. print("库存不足")
  26. break
  27. # 7: 移除观察
  28. pipeline.reset()
  29. if __name__ == '__main__':
  30. 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:

    1. # 2: 创建悲观锁
    2. lock = redis_cli.setnx(key, 1)
    3. # 3: 防止忘记删除锁资源,给锁资源添加过期时长。---防止出现死锁。
    4. redis_cli.expire(key, 5)
    5. # 4: 获取库存
    6. count = redis_cli.get("count")
    7. # 5: 争夺到锁资源的允许redis客户端对象进行数据库增删改查
    8. if lock:
    9. if int(count) > 0:
    10. redis_cli.decr('count')
    11. print("下单成功")
    12. else:
    13. print("库存不足")
    14. break
    15. # 6: 删除锁资源---防止死锁
    16. 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)

发表评论

表情:
评论列表 (有 0 条评论,229人围观)

还没有评论,来说两句吧...

相关阅读