起因:随着项目的进一步推广,数据量的增大,直接访问mysql数据库获取数据所使用的时间越来越长,为解决当前主要矛盾,决定引入redis非关系型数据库作为缓存层,使得数据并不能直接命中数据库,减少访问数据库带来的压力,从而加快运行速度。
1. Redis事务&乐观锁
1.1. Redis事务
场景描述:
就是我们的数据操作是一个原子性的
# 看一下redis的场景
# client A client B
set name icoding(1) set name icodingedu(2)
get name(3) get name
# 这个时候数据就串了
事务需要边界
multi # 开启事务
set name icoding
get name
exec # 执行事务
discard # 回滚事务
事务执行过程中错误回退机制
- 如果命令错误则自动回滚
- 如果命令正确但语法错误,正确的语句都会被执行
1.2. Redis的乐观锁
业务场景距离
库存:store 1000-->100 / + 1000(三个业务人员incrby)
数据的状态:如果在你修改前已经被修改了,就不能再修改成功了?
# watch key1 key2 命令
# 只要在事务外watch了一个key或多个key,在事务还没有执行完毕的时候,watch其中的key被修改后,整个事务回滚
set store 10
watch store
multi
incrby store 100
get store
exec
- watch在事务执行完毕后就释放了
- watch的key如果在事务执行过程中失效了,事务也不受watch影响
- watch只能在事务外执行
- 客户端如果断开,watch也就失效了
事务执行过程中错误回退机制
- 如果命令错误则自动回退
- 如果命令正确但语法错误,正确的语句会被执行
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!
网友评论