Redis事务、以及通过Jedis操作Redis(内含保姆级教程)

一、事务
Redis的单条命令是保证原子性的,要么同时成功,要么同时失败。
但是事务不保证原子性
Redis事务本质:一组命令的集合,一个事务中所有命令都会被序列化,在事务执行过程中,会按照顺序执行、一次性,排他性(不允许被打扰)
--------队列 set set set 执行-------
Redis事务没有隔离级别的概念
所有的命令在事务中,并没有被直接执行。只有发起执行命令的时候才会执行!Exec
Redis的事物包括以下三个过程
  • 开启事务(multi)
  • 命令入队(写命令)
  • 执行事务(exec)
Redis可以实现乐观锁
正常执行事务操作如下:
开启事务:multi

执行事务:exec

exec后出现事务的结果
还可以放弃事务
DISCARD:放弃事务,事务中的命令都不会被执行

编译型异常(Redis命令有错),事务中的所有命令都不会被执行

此时所有的命令都不会被执行。
运行时异常(比如1/0),事务中的其他命令正常执行,错误的命令会抛出异常

解释:incr k1 是错误的命令,运行时会报异常,但是不影响整个事务的命令
二、监控
悲观锁:无论做什么都会加锁
乐观锁:认为什么时候都不会出问题,所以都不会上锁,更新数据的时候去判断一下,在此期间是否有人修改过这个数据;
获取version;
更新的时候比较version
Redis测监视测试(正常执行成功,监视money对象)

测试多线程修改值,使用watch可以当做redis的乐观锁操作, 注意watch指令在一次事务执行完毕后,即结束其生命周期
解释:watch money :监视money
exec :执行之前,右边的一个新的线程修改了我们的值,这个时候就会导致事务失败 
watch值发生变化则执行失败,执行失败还有办法挽救吗?

解决方法:
UNWATCH :解锁
如果执行失败,则先解锁,再重新监控最新版本
三、Jedis(以下所有操作开始前请打开你的redis-server.exe)
Jedis是Redis官方推荐的java连接开发工具
如何用Jedis连接Redis
1.新建项目project,选择Maven
找到Maven下的pom.xml

2. 导入maven依赖,这里给出下载依赖包的地址
将最下面方框的<dependency></dependency>代码复制到 pom.xml中,如下图所示:
需要建立“jedis”和“fastjson”依赖,注意上下两个<dependencies> </dependencies>
这里出现错误(注意建立新项目的时候版本要统一)
查询原因, 本地运行用的是JDK11,测试Java的Stream操作
报错应该是项目编译配置使用的Java版本不对,需要检查一下项目及环境使用的Java编译版本配置。

找到IDEA右上角的按钮,设置“project”和“Modules”的版本,我这里是11,你们设置成你们默认的就好
打开Settings”-->“Bulid, Execution,Deployment”-->“Java Compiler”,Target bytecode version设为本地Java版本。
测试连接(新建class)
package com.kuang;
import java.util.Set;
import redis.clients.jedis.Jedis;

public class TestPing {
    public static void main(String[] args){
        // new 一个Jedis对象
      Jedis jedis = new Jedis("127.0.0.1",6379);
      // Jedis所有的命令就是之前学习的所有指令(变成了方法)
        System.out.println(jedis.ping());
}
}
连接成功
测试:
package com.kuang;
import java.util.Set;
import redis.clients.jedis.Jedis;

public class TestPing {
    public static void main(String[] args){
        // new 一个Jedis对象
      Jedis jedis = new Jedis("127.0.0.1",6379);
      // Jedis所有的命令就是之前学习的所有指令(变成了方法)
        System.out.println(jedis.ping());
        System.out.println("清空数据库:"+jedis.flushDB());
        System.out.println("判断某个键是否存在:"+jedis.exists("k1"));
        System.out.println("新增键值对"+jedis.set("k1","v1"));
        System.out.println("新增k2,v2键值对:"+jedis.get("k1"));
        System.out.println("系统中所有的键如下:");
        Set Stringkeys = jedis.keys("*");
        System.out.println(Stringkeys);
        System.out.println("删除键k2:"+jedis.del("k2"));
        System.out.println("判断键k2是否存在:"+jedis.exists("k2"));
        System.out.println("查看键 k1 所存储的数据类型:"+jedis.type("k1"));
        System.out.println("随机返回 key 空间的一个:"+jedis.randomKey());
        System.out.println("重命名 key :"+jedis.rename("k1","newk1"));
        System.out.println("取出改后的 newk1 :"+jedis.get("newk1"));
        System.out.println("按索引查询:"+jedis.select(0));
        System.out.println("删除当前选择数据库中的所有键:"+jedis.flushDB());
        System.out.println("返回当前数据库中 key 的数量:"+jedis.dbSize());
        System.out.println("删除所有数据库中的所有 key :"+jedis.flushAll());
    }
}

结果如下:

四、通过Jedis理解事务
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class TestTX {
    public static void main(String[] args){
        Jedis jedis = new Jedis("127.0.0.1",6379);
        System.out.println(jedis.ping());
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("hello","world");
        jsonObject.put("name","vv");

        // 开启事务
        Transaction multi =  jedis.multi();
        String result = jsonObject.toJSONString();
        try{
            multi.set("user1",result);
            multi.set("user2",result);
            multi.exec();  // 执行事务
            //int i = 1/0;
        }catch (Exception e){
            multi.discard(); // 放弃事务
            e.printStackTrace();

        }finally{
            System.out.println(jedis.get("user1"));
            System.out.println(jedis.get("user2"));
            jedis.close();// 关闭连接
        }
    }

}

结果如下:添加成功

有的会出现错误:

这个时候在pom里面加入依赖

       <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.2</version>
        </dependency>

 OK

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值