Redis事务处理的使用操作方法

 更新时间:2021年10月19日 17:01:57   作者:希望不要秃头的0.0  
Redis保证一个事务中的所有命令要么都执行,要么都不执行(原子性),如果客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令,下面通过本文给大家介绍Redis事务处理的使用操作,感兴趣的朋友一起看看吧

一、简介

        Redis采用了乐观锁方式进行事务控制,它使用watch命令监视给定的key,当exec(提交事务)的时候,如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key。注意watch的key是对整个连接有效的,如果连接断开,监视和事务都会被自动清除。当然exec,discard,unwatch命令都会清除连接中的所有监视。

        Redis保证一个事务中的所有命令要么都执行,要么都不执行(原子性)。如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。而一旦客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。

常用指令:

  • multi 开启事务
  • exec 提交事务
  • discard 取消事务
  • watch 监控,如果监控的值发生变化,则提交事务时会失败
  • unwatch 去掉监控

二、模拟使用

模拟转账操作

 开启事务后所有操作都会进入到一个队列中,提交时一起执行

模拟取消事务

redis事务太简单,没有回滚,而只有取消。

当队列中有语句出现错误时,事务会自动取消

 乐观锁使用演示

        乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,期间该数据可以随便被其他人读取,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
        版本号机制是乐观锁最常用的方式,就是在表中增加一个版本号的字段,更新前先查一遍获取版本号,再作为更新语句的where条件进行更新,如果数据在获取版本号之后,在更新之前已经改变了,那就会更新失败,因为最后更新了0条数据,java后台拿到更新数如果为0,则说明更新失败,出现了并发问题,然后做具体的处理。

1.添加测试数据语句

开启监控,开启事务,执行语句

 

 2.另起一个redis对数据进行修改

 3.返回第一个数据库提交事务

这里我们可以看到执行事务失败。a变成了666

 三、乐观锁秒杀抢票练习

/*基于reids实现一个简单的多线程抢票操作
* 重点延时乐观锁的应用*/
public class SecondsKillDemo02 {
    //定义抢票逻辑
    public static void KillTicket() {
        //1.连接
        Jedis jedis = JedisDataSource.getConnection();
        //2.监控reids中指定的key
        String a = jedis.get("a");
        if (a == null || Integer.valueOf(a) == 0)
            throw new RuntimeException("没票了");
        jedis.watch("a", "b");
        //3.开启事务执行业务
        Transaction multi = jedis.multi();
        try {
            multi.decr("a");
            multi.incrBy("b", 100);
            //4.提交事务
             multi.discard();
            System.out.println("ok");
        } catch (Exception e) {
            multi.exec();
        } finally {
            //5.取消监控
            jedis.unwatch();
            //6.释放
            jedis.close();
        }
    }
 
    public static void main(String[] args) {
        //1.定义初始数据
        Jedis jedis = JedisDataSource.getConnection();
        jedis.set("a", "1");
        jedis.set("b", "0");
        //2.创建多个线程,在线程中执行抢票
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                KillTicket();
            }
        });
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                KillTicket();
            }
        });
        t1.start();
        t2.start();
 
    }
}

到此这篇关于Redis事务处理的文章就介绍到这了,更多相关Redis事务处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈redis的过期时间设置和过期删除机制

    浅谈redis的过期时间设置和过期删除机制

    本文主要介绍了redis的过期时间设置和过期删除机制,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • redis实现简单分布式锁

    redis实现简单分布式锁

    这篇文章主要介绍了redis实现简单分布式锁,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2013-09-09
  • websocket+redis动态订阅和动态取消订阅的实现示例

    websocket+redis动态订阅和动态取消订阅的实现示例

    本文主要介绍了websocket+redis动态订阅和动态取消订阅,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Redis高阶之容错切换的实现

    Redis高阶之容错切换的实现

    本文主要介绍了Redis高阶之容错切换的实现,当一台主节点宕机后,从节点会自动接管成为新的主节点,当原主节点恢复后,它不会自动成为主节点,需要通过手动操作将其重新设置为从节点,感兴趣的可以了解一下
    2025-02-02
  • 为什么断电后Redis数据不会丢失

    为什么断电后Redis数据不会丢失

    Redis 作为一款内存数据库,被广泛使用于缓存,分布式锁等场景,那么假如断电或者因其他因素导致 Reids 服务宕机,在重启之后数据会丢失吗?本文就来介绍与一下
    2021-08-08
  • Python利用redis限制用户重复刷新带来的数据问题

    Python利用redis限制用户重复刷新带来的数据问题

    在网站开发中,我们经常会遇到需要控制用户重复刷新页面的情况,本文就来介绍了Python利用redis限制用户重复刷新带来的数据问题,感兴趣的可以了解一下
    2024-03-03
  • Redisson如何解决redis分布式锁过期时间到了业务没执行完问题

    Redisson如何解决redis分布式锁过期时间到了业务没执行完问题

    这篇文章主要介绍了Redisson如何解决redis分布式锁过期时间到了业务没执行完问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • redis适合场景八点总结

    redis适合场景八点总结

    在本篇文章中我们给大家整理了关于redis适合什么场景的8点知识点内容,需要的朋友们参考下。
    2019-06-06
  • Redis过期监听机制,订单超时自动取消方式

    Redis过期监听机制,订单超时自动取消方式

    这篇文章主要介绍了Redis过期监听机制,订单超时自动取消方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Redis未授权访问配合SSH key文件利用详解

    Redis未授权访问配合SSH key文件利用详解

    这篇文章主要给大家介绍了关于Redis未授权访问配合SSH key文件利用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09

最新评论