Redis(二)对事务进行操作及Jedis

系列文章目录

Redis入门笔记(一):Redis在Linux下安装和八大数据类型



前言

Redis事务本质:一组命令的集合
Redis中事务的特性:

 Redis的单条命令式保存原子性的,但是事务不保证原子性,
 redis事务在执行过程中如果有一条命令执行失败,那么其后的命令仍然可以执行,不会回滚。
 事务没有隔离级别的概念。
 一个事务中所有的命令都会被序列化,在事务执行过程中,会按照顺序执行,
 所有的命令在事务中并没有直接被执行,发起执行时才会执行

Redis对事务进行操作

开启事务:multi

在这里插入图片描述
命令式是按照入队的顺序执行的

执行事务:exec

在这里插入图片描述
事务在执行一次后,就清空了

放弃事务:discard

在这里插入图片描述

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

在这里插入图片描述

运行时异常(其他命令依然正常运行)

incr key 如果key不存在,会默认初始化为0,然后incr加一
在这里插入图片描述
虽然第一条命令报错了,但其他命令依然正常执行成功

悲观锁与乐观锁

悲观锁:悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),
       所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。
       也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。
乐观锁:乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,
  • 悲观锁通常多用于写比较多的情况下(多写场景,竞争激烈),这样可以避免频繁失败和重试影响性能,悲观锁的开销是固定的。
  • 乐观锁通常多于写比较少的情况下(多读场景,竞争较少),这样可以避免频繁加锁影响性能。不过,乐观锁主要针对的对象是单个共享变量

redis的watch自带悲观锁

这个是正常执行的输出
在这里插入图片描述
在事务未执行前,更改数据
在这里插入图片描述
redis 中watch指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端更改,则使用EXEC执行事务时,事务队列将不会被执行,同时返回Nullmulti-bulk应答以通知调用者事务执行失败。
unwatch解除监控,重新获值
在这里插入图片描述

使用Java来操作Redis

Jedis是Redis官方推荐使用的Java连接redis的客户端。

导依赖:

 <!--导入jredis的包-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.70</version>
        </dependency>

测试是否能ping 通

import redis.clients.jedis.Jedis;
public class RedisTest {
    
    
    public static void main(String[] args) {
    
    
        Jedis jedis = new Jedis("192.168.200.200",6379);
        String ping = jedis.ping();
        System.out.println(ping);
    }
}

解决Jedis连接失败问题

1、关闭防火墙:
systemctl status firewalld 查看防火墙的状态
systemctl stop firewalld 关闭防火墙
2、确认linux和windows能够ping通
在这里插入图片描述在这里插入图片描述

如果还报错
在这里插入图片描述3、修改redis.conf
默认条件下bind 127.0.0.1只接受本机访问
在这里插入图片描述
protected-mode在开启的情况下,如果没有设定bind和密码,只接受本机的访问。

在这里插入图片描述通了!

在这里插入图片描述

Jedis操作事务

import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
public class RedisTest {
    
    
    public static void main(String[] args) {
    
    
        Jedis jedis = new Jedis("192.168.31.238",6379);
        jedis.flushDB();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("hello", "world");
        jsonObject.put("name", "liu heng");
       // 开启事务
        Transaction multi = jedis.multi();
        String result = jsonObject.toJSONString();
       // jedis.watch(result)
        try {
    
    
        multi.set("user1", result);
        multi.set("user2", result);
        // 执行事务
        multi.exec();
          }catch (Exception e){
    
    
        // 放弃事务
             multi.discard();
          } finally {
    
    
        // 关闭连接
           System.out.println(jedis.get("user1"));
           System.out.println(jedis.get("user2"));
           jedis.close();
     }
   }

 }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45637894/article/details/130771737