Redis详解(一)
redis简介
-
-
包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)
-
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,且这些操作都是原子性的
-
redis事务
-
-
redis事务是可以一次执行多个命令,本质是一组命令的集合。
-
一个事务中的所有命令都会序列化,按顺序串行的执行而不会被其他命令插入
作用:一个队列中,一次性、顺序性、排他性的执行一系列命令
-
-
multi 指令基本使用
-
下面指令演示了一个完整的事物过程,所有指令在exec前不执行,而是缓存在服务器的一个事物队列中
-
服务器一旦收到exec指令才开始执行事物队列,执行完毕后一次性返回所有结果
-
因为redis是单线程的,所以不必担心自己在执行队列是被打断,可以保证这样的“原子性”
-
1 # Multi 命令用于标记一个事务块的开始事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性( atomic )地执行 2 > multi(开始一个redis事物) 3 incr books 4 incr books 5 > exec (执行事物) 6 > discard (丢弃事物)
注:myl的rollback与redis的discard的区别
-
mysql回滚为sql全部成功才执行,一条sql失败则全部失败,执行rollback后所有语句造成的影响消失
-
redis的discard只是结束本次事务,正确命令造成的影响仍然还在.
实质:WATCH 只会在数据被其他客户端抢先修改了的情况下通知执行命令的这个客户端(通过 WatchError 异常)但不会阻止其他客户端对数据的修改
-
watch其实就是redis提供的一种乐观锁,可以解决并发修改问题
-
watch会在事物开始前盯住一个或多个关键变量,当服务器收到exec指令要顺序执行缓存中的事物队列时,redis会检查关键变量自watch后是否被修改
-
WATCH 只会在数据被其他客户端抢先修改了的情况下通知执行命令的这个客户端(通过 WatchError 异常)但不会阻止其他客户端对数据的修改
分布式锁
-
-
占坑一般使用 setnx(set if not exists)指令,只允许一个客户端占坑
-
1 setnx lock:codehole true 2 .... do something critical .... 3 > del lock:codehole
1 > setnx lock:codehole true 2 > expire lock:codehole 5 3 .... do something critical .... 4 > del lock:codehole
1 > set lock:codehole true ex 5 nx 2 ''' do something ''' 3 > del lock:codehole
redis操作
1 import redis 2 3 # r = redis.Redis(host='1.1.1.3', port=6379) # 操作模式 4 5 pool = redis.ConnectionPool(host='1.1.1.3', port=6379) 6 r = redis.Redis(connection_pool=pool) # 连接池 7 8 r.set('foo', 'Bar') 9 print(r.get('foo'))