Redis单机
一: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中的使用:
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:一致性,不支持。
事务在代码中如何实现?
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)
还没有评论,来说两句吧...