redis学习redis事务之乐观锁与redis事务特性(三)

目录

概述

watch key1 [key2]加锁

unwatch解锁

Redis事务三特性


概述

我们先看一下没有使用锁的时候会出现什么问题。

我们用两个客户端连接redis

我们现加入一个k1的值为100,然后再客户端1中开启事务对其加10

然后在客户端2也进行加10操作

 在客户端1中进行exec操作我们看到值变成了110

然后再在客户端2中执行exec值变成了120

这就出现了问题了,虽然两次加10最后的值是120没错。但是问题是,对于客户端2来说,人家看到的第一次的值就是100,为什么加10却变成了120?

下面我们使用乐观锁来测试一下,看看效果是什么样的。

watch key1 [key2]加锁

在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 

比如,我们设置一个k2 的值也为100

 

 在客户端1中执行值为110

 在客户端2中执行

 就是因为版本号不一样了导致不能执行。

unwatch解锁

取消 WATCH 命令对所有 key 的监视。

如果在执行 WATCH 命令之后,EXEC 命令或DISCARD 命令先被执行了的话,那么就不需要再执行UNWATCH 了。

Redis事务三特性

  • 单独的隔离操作 ----事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 没有隔离级别的概念 ---队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
  • 不保证原子性 ---事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。(这个跟我们之前说的mysql是不一样的,mysql中的事务比如有三个操作,只要有一个出现錯誤那么就都不会执行,而redis不是这样的,我们之前介绍了,执行的时候出错的那个不会执行其他正确的还是会正常执行的)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
抱歉,我不是一个可以浏览互联网的程序,也不会进行搜索。但是,我可以为您介绍一下ServiceStack.Redis的常用操作,包括事务和并发。 1. 事务 在ServiceStack.Redis中,您可以使用事务来确保多个命令的原子性。以下是一个使用事务的示例: ``` using (var redis = RedisManager.GetClient()) { var tx = redis.CreateTransaction(); tx.QueueCommand(r => r.Set("key1", "value1")); tx.QueueCommand(r => r.Set("key2", "value2")); tx.Commit(); } ``` 在这个例子中,我们使用`redis.CreateTransaction()`来创建一个事务,然后使用`tx.QueueCommand()`方法将多个命令添加到事务中,最后使用`tx.Commit()`方法来提交事务。如果有任何一个命令失败,整个事务将被回滚。 2. 并发 在多线程环境下,为了避免数据竞争和并发问题,我们需要使用并发来确保同一时间只有一个线程可以修改数据。在ServiceStack.Redis中,您可以使用`IRedisClient.AcquireLock()`方法来获取一个,使用`IRedisClient.ReleaseLock()`方法来释放。 以下是一个使用并发的示例: ``` using (var redis = RedisManager.GetClient()) { using (var lock = redis.AcquireLock("mylock")) { // do some work } } ``` 在这个例子中,我们使用`redis.AcquireLock()`方法来获取一个名为"mylock"的,并使用`using`语句来确保在使用完后被释放。如果另一个线程已经获取了这个,那么当前线程将被阻塞,直到被释放。 希望这些信息能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢编程的夏先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值