16Redis的Java客户端Jedis+事务

本文详细介绍了如何使用Java客户端Jedis操作Redis数据库,包括连接、基本数据类型操作、事务处理等核心功能,提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jedis常用操作

通过Java调用Redis的API事实上不算难,总的流程可以分为:导包和使用即可。特此记录。

前提:

​ Jedis所需要的ja包:commons-pool-1.6.jar + jedis-2.1.0.jar

测试连通性:


public class Demo01 {
  public static void main(String[] args) {
    //连接本地的 Redis 服务
    Jedis jedis = new Jedis("127.0.0.1",6379);
    //查看服务是否运行,打出pong表示OK
    System.out.println("connection is OK==========>: "+jedis.ping());
  }
}

值得一提的是,我是在本地连接云服务器的Redis,那么首先连接的ip则改为与服务器的ip。然后需要注意云服务器需要运行redis进程,并且修改redis.conf使得任何人都可以连接,并且需要打开云服务器的安全组端口6379,这样本地或者其他的计算机才能成功连接到云服务器上的Redis,并且进行操控。

修改redis配置文件如下:

在这里插入图片描述

通过上面的代码,运行成功连接的话将会返回pong。

既然连接成功,只需要熟悉调用各种API方法进行操作Redis存取数据即可:


package com.atguigu.redis.test;

import redis.clients.jedis.Jedis;

import java.util.*;

public class TestAPI {
    public static void main(String[] args){

        Jedis jedis = new Jedis("127.0.0.1",6379);
        System.out.println(jedis.ping());

        //key
        Set<String> keys = jedis.keys("*");
        for(String temp : keys){
            System.out.println(temp);
        }
        System.out.println("jedis.exists k2 ====> "+ jedis.exists("k2"));
        System.out.println("jedis.value k2 ====> "+ jedis.get("k2"));
        System.out.println("jedis.ttl k2 =====> "+ jedis.ttl("k2"));

        //String
        //jedis.append("k1","myredis"); append的意思是在k1的当前值后面增加 myredis
        System.out.println("k1:"+jedis.get("k1"));
        jedis.set("k4","k4_redis");
        System.out.println("-----------------------------");
        System.out.println("jedis.mset:"+jedis.mset("str1","v1","str2","v2","str3","v3"));
        System.out.println(jedis.mget("str1","str2","str3"));


        //list
        System.out.println("-----------------------------");
        //jedis.lpush("mylist","v1","v2","v3","v4","v5");
        List<String> list = jedis.lrange("mylist",0,-1);
        for(String element : list){
            System.out.println(element);
        }

        //Set
        System.out.println("-----------------------------");
        /*jedis.sadd("orders","jd001");
        jedis.sadd("orders","jd002");
        jedis.sadd("orders","jd003");*/
        Set<String> set1 = jedis.smembers("orders");
        for(Iterator iterator = set1.iterator();iterator.hasNext();){
            String string = (String) iterator.next();
            System.out.println(string);
        }
        jedis.srem("orders","jd002");
        System.out.println(jedis.smembers("orders").size());

        //hash
        System.out.println("-----------------------------");
        jedis.hset("hash1","userName","lisi");
        System.out.println(jedis.hget("hash1","userName"));
        Map<String,String> map = new HashMap<String,String>();
        map.put("telphone","13811814763");
        map.put("address","atguigu");
        map.put("email","abc@163.com");
        jedis.hmset("hash2",map);
        List<String> result = jedis.hmget("hash2","telphone","email");
        for(String element : result){
            System.out.println(element);
        }

        //zset
        System.out.println("-----------------------------");
        jedis.zadd("zset01",60d,"v1");
        jedis.zadd("zset01",70d,"v2");
        jedis.zadd("zset01",80d,"v3");
        jedis.zadd("zset01",90d,"v4");
        Set<String> s1 = jedis.zrangeByScore("zset01",80,90);
        for(Iterator iterator = s1.iterator();iterator.hasNext();){
            String string = (String) iterator.next();
            System.out.println(string);
        }
    }
}


 

运行结果:

在这里插入图片描述

Jedis常用操作事务提交

日常Transaction

package com.atguigu.redis.test;


import redis.clients.jedis.Jedis;
import redis.clients.jedis.Response;
import redis.clients.jedis.Transaction;


public class Test03 
{
  public static void main(String[] args) 
  {
     Jedis jedis = new Jedis("127.0.0.1",6379);
     
     //监控key,如果该动了事务就被放弃
     /*3
     jedis.watch("serialNum");
     jedis.set("serialNum","s#####################");
     jedis.unwatch();*/
     
     Transaction transaction = jedis.multi();//被当作一个命令进行执行
     Response<String> response = transaction.get("serialNum");
     transaction.set("serialNum","s002");
     response = transaction.get("serialNum");
     transaction.lpush("list3","a");
     transaction.lpush("list3","b");
     transaction.lpush("list3","c");
     
     transaction.exec();
     //2 transaction.discard();
     System.out.println("serialNum***********"+response.get());
          
  }
}
 
 

加锁watch

public class TestTransaction {


  public boolean transMethod() {
     Jedis jedis = new Jedis("127.0.0.1", 6379);
     int balance;// 可用余额
     int debt;// 欠额
     int amtToSubtract = 10;// 实刷额度


     jedis.watch("balance");
     //jedis.set("balance","5");//此句不该出现,讲课方便。模拟其他程序已经修改了该条目
     balance = Integer.parseInt(jedis.get("balance"));
     if (balance < amtToSubtract) {
       jedis.unwatch();
       System.out.println("modify");
       return false;
     } else {
       System.out.println("***********transaction");
       Transaction transaction = jedis.multi();
       transaction.decrBy("balance", amtToSubtract);
       transaction.incrBy("debt", amtToSubtract);
       transaction.exec();
       balance = Integer.parseInt(jedis.get("balance"));
       debt = Integer.parseInt(jedis.get("debt"));


       System.out.println("*******" + balance);
       System.out.println("*******" + debt);
       return true;
     }
  }


  /**
   * 通俗点讲,watch命令就是标记一个键,如果标记了一个键, 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中
   * 重新再尝试一次。
   * 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减; 足够的话,就启动事务进行更新操作,
   * 如果在此期间键balance被其它人修改, 那在提交事务(执行exec)时就会报错, 程序中通常可以捕获这类错误再重新执行一次,直到成功。
   */
  public static void main(String[] args) {
     TestTransaction test = new TestTransaction();
     boolean retValue = test.transMethod();
     System.out.println("main retValue-------: " + retValue);
  }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值