【Redis学习总结】7. Redis的Java客户端Jedis

Jedis+JedisPool+JedisPoolConfig:完美“掌控“Redis 目录一、背景介绍二、Redis相关2.1 Redis基本概念2.2 Redis下载安装2.3 启动Redis服务(Windows本地)2.4 启动Redis客户端(Windows本地)2.5 Redis基本命令三、Jedis相关3.1 Maven依赖3.2 Jedis基本使用四、Jedis连接池-JedisPool4.1 Jedis连接池4.2 JedisPoolConfig常用参数4.3 Jed... 阅读详情

1. Jedis连接测试

 

(1)创建web项目

         

 

(2)把jar包 commons-pool-1.6.jar jedis-2.1.0.jar 放到lib目录下

         

(3)虚拟机下启动redis服务

         

(4)创建测试类

         

         

(5)测试成功

         

 

2. Jedis常用操作

package com.atguigu.redis.test;


import java.util.*;


import redis.clients.jedis.Jedis;


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

     //连接redis服务器
     Jedis jedis = new Jedis("127.0.0.1",6379);

     //key 查看所有的key并迭代打印
     Set<String> keys = jedis.keys("*");
     for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
       String key = (String) iterator.next();
       System.out.println(key);
     }
     System.out.println("jedis.exists====>"+jedis.exists("k2"));
     System.out.println(jedis.ttl("k1"));

    
     //String
     //jedis.append("k1","myreids");
     System.out.println(jedis.get("k1"));
     jedis.set("k4","k4_redis");
     System.out.println("----------------------------------------");
     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
     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
     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
     jedis.zadd("zset01",60d,"v1");
     jedis.zadd("zset01",70d,"v2");
     jedis.zadd("zset01",80d,"v3");
     jedis.zadd("zset01",90d,"v4");
     
     Set<String> s1 = jedis.zrange("zset01",0,-1);
     for (Iterator iterator = s1.iterator(); iterator.hasNext();) {
       String string = (String) iterator.next();
       System.out.println(string);
     }


          
  }
}

可以详细看这篇文章  https://blog.youkuaiyun.com/FullStackDeveloper0/article/details/88379940

 

3. 事务提交

简单的案例

(1)简单的事务的执行

        

        

(2)放弃事务的执行

        

        

(3) 信用卡余额、欠额

          

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);
  }
}

watch监控的原理类似乐观锁!在watch监控的过程中如果key对应的值发生变化就会放弃事务的执行!

 

4. 主从复制

      



5. JedisPool

连接池

package com.atguigu.redis.test;


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


public class JedisPoolUtil {
  
 private static volatile JedisPool jedisPool = null;//被volatile修饰的变量不会被本地线程缓存,对该变量的读写都是直接操作共享内存。
  
  private JedisPoolUtil() {}
  
  public static JedisPool getJedisPoolInstance()
 {
     if(null == jedisPool)
    {
       synchronized (JedisPoolUtil.class)
      {
          if(null == jedisPool)
         {
           JedisPoolConfig poolConfig = new JedisPoolConfig();
           poolConfig.setMaxActive(1000);
           poolConfig.setMaxIdle(32);
           poolConfig.setMaxWait(100*1000);
           poolConfig.setTestOnBorrow(true);
            
            jedisPool = new JedisPool(poolConfig,"127.0.0.1");
         }
      }
    }
     return jedisPool;
 }
  
  public static void release(JedisPool jedisPool,Jedis jedis)
 {
     if(null != jedis)
    {
      jedisPool.returnResourceObject(jedis);
    }
 }
}
 

使用

package com.atguigu.redis.test;


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;


public class Test01 {
  public static void main(String[] args) {
     JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
     Jedis jedis = null;
     
     try 
     {
       jedis = jedisPool.getResource();
       jedis.set("k18","v183");
       
     } catch (Exception e) {
       e.printStackTrace();
     }finally{
       JedisPoolUtil.release(jedisPool, jedis);
     }
  }
}
 

 

配置文件



JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。


maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。
maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。
 WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException;
 WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;
 WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;
maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;
testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;


testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping());


testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;


timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;


numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;


minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;


softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;


lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;


==================================================================================================================
其中JedisPoolConfig对一些参数的默认设置如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1

 

【征服redis3】一文征服redis的jedis客户端 Jedis 是一个流行的 Java 编写的 Redis 客户端库,它提供了连接和操作 Redis 服务器的功能。简单易用:Jedis 提供了简洁的 API,方便开发人员使用,减少了连接和操作 Redis 的复杂性。高性能:Jedis 是通过直接与 Redis 服务器进行通信来实现操作的,因此具有较高的性能。支持多种数据类型:Jedis 支持操作 Redis 的各种数据类型,包括字符串、哈希、列表、集合、有序集合等。 阅读详情

相关推荐

SpringBoot集成redis之Jedis

记录学习redis的一些理解,以及实操过程的雷雷清点。

2202_75317512的博客 1472

JedisPoolConfig参数配置,调优技能

1、提高响应的速度2、降低资源的消耗3、方便管理和维护。

Isonion的博客 3980

【Redis】Redis 的常见客户端汇总

1. 自定义序列化器super();@Override@Override2. 配置序列化器@Bean// 使用StringRedisSerializer来序列化和反序列化redis的key值// Hash的key也采用StringRedisSerializer的序列化方式。

大家好,我是敖云岚,一个沉迷代码的 “技术玩家”。擅长 Java、C++ 开发,对 MySQL、Redis、RabbitMQ 等技术也颇有研究。博客里既有硬核技术干货,也有诙谐幽默的编程日常分享。愿和你一起,笑着学技术,快乐敲代码! 3149

从源码角度看JedisPoolConfig参数配置

做一个积极的人 编码、改bug、提升自己 我有一个乐园,面向编程,春暖花开! 你好,JedisPoolConfig Java中使用Jedis作为连接Redis的工具。在使用Jedis的也可以配置JedisPool连接池,JedisPool配置参数大部分是由JedisPoolConfig的对应项来赋值的。本文简单总结几个常用的配置,然后通过源码(版本jedis-3.1.0)的角度让你理解配置这些...

阿飞云漫步 2029

Jedis连接池:JedisPool及连接池工具类搭建

JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的,所以首先我们要设置JedisPoolConfig参数。设置完配置之后我们就可以去创建jedis的连接池了,使用的是JedisPoo构造函数。在resources创建jedis.properties配置文件。之后我们就可以通过getJedis获取连接池了。

流楚丶格念的博客 3557

Jedis 2.7.2:高效Redis客户端库实战指南

本文还有配套的精品资源,点击获取 简介:Jedis是Java中的Redis客户端库,2.7.2版本提供了增强功能,适用于大规模数据存储和高性能分布式环境。新版本包含性能优化和修复,支持字符串、哈希、列表、集合、有序集合等操作,并拥有事务、发布/订阅、脚本执行等高级特性。开发者可以利用连接池管理来提高性能,同时通过丰富的异常处理机制确保与Redis的稳定交互。本文档详细介绍了...

weixin_42596246的博客 1278

Redis第2讲——Java三种客户端(Jedis、Lettuce和Redisson)

上篇文章介绍了Redis的9种数据类型和常命令、7种数据结构和9种编码方式。但是如果想要把它应用到项目中,我们还需要一个redis的客户端。redis的Java客户端种类还是很多的,其中使用最广泛的有三种——Jedis、lettuce和redisson,下面我们一起来学习下。基于redis开放的通信协议,大神们纷纷开发出了各种语言的redis客户端,包括C、C++、C#、D、java、Python、Ruby等50多种,这些客户端都是基于redis命令做了一层封装,并打包成工具,以便更方便地操作redis。

让~学习~成为一种习惯(橡 皮 人の技术博客) 6550

各种版本的redis+Jedis驱动包

Redis Windows32位+64位安装包,Linux压缩包, Redis图形操作管理软件,Jedis

Redis5:Redis的Java客户端——Jedis与SpringDataRedis详解

我们看set方法我们发现他接受的并不是字符串,它可以接收任何类型的对象,然后转换成redis可以处理的字节(JDK的序列化工具ObjectOutputStream)再写入redis。为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,,其中封装了各种对Redis的操作。

2301_78566776的博客 1233

【Python实战解析】从数据爬取到房价预测:一个完整的数据科学项目流程拆解

本文详细拆解了一个完整的Python数据科学项目流程,从爬取长沙二手房数据到房价预测模型构建。通过实战案例,介绍了数据爬取、清洗、可视化及模型优化的关键技巧,帮助开发者掌握Python在数据分析中的应用,提升程序开发能力。

weixin_30379531的博客 412

《生成式AI引发的“认知污染”:社交媒体虚假信息的治理困局》

认知污染与生成式AI“认知污染”指信息环境被大量虚假、误导性内容所充斥,干扰公众对事实的认知判断。在社交媒体时代,虚假信息的生产和传播门槛大幅降低,呈现出工业化、规模化的趋势。近年兴起的生成式人工智能(Generative AI)技术,如大型语言模型(LLM)和深度伪造(deepfake),更是加剧了这一问题。AI可以自动生成看似真实的文本、图像、音视频,将虚假信息批量生产并快速散播到社交平台上。

那谁的博客 5913

【Redis入门篇】| Redis的Java客户端

【Redis入门篇】| Redis的Java客户端

m0_61933976的博客 5363

TS808效果器制作教程

TS808效果器制作教程 可以在立创商城购买到大部分的电阻电容和IC,音频接口,踩钉,电位器和电源接口可以去某宝看看都买得到的。链接https//pan.baidu.com/s/1QId1eIE3fJ2u5NLBSISvGA。安装过程过于繁琐,把所有元器件按照图纸焊接完成就可以调试了,祝你们成功!这是TS808经典效果器制作过程的记录。IC是JRC4558。...

qq_18948149的博客 3429

Redis的Java客户端

我们可以发现当我们存对象的时候帮我们序列化为Json字符串,取数据的时候帮我们反序列化为Java对象,但是这样Json序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。为了节省内存空间,我们实际并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value,当需要存储Java对象时,手动完成。当我们再去进行close()时,并不是真正的关闭,而是将资源归还给Redis连接池。

buhuisuanfa的博客 1998

从零搭建风电场:手把手教你用WAsP+WindPRO完成风资源评估全流程

本文详细介绍了从零开始搭建风电场的全流程,重点讲解如何使用WAsP和WindPRO进行风资源评估和风场布局优化。内容包括软件配置、数据采集规范、风图谱建模实战、机组选型策略以及常见问题解决方案,帮助工程师掌握风电开发的核心技术,提升项目成功率。

year5的博客 372

Oracle OCP 19c 认证1Z0-083考试大纲(Oracle官方版)

Oracle Database: Managing Multitenant Architecture Ed 1 course

#真题在线# 1591

Redis 的 Java 客户端的详细介绍(Jedis,SpringDataRedis,RedisTemplated,StringRedisTemplated)

Java Redis客户端对比与使用指南 本文介绍了Java中三种主流Redis客户端的特点和使用方法: Jedis:轻量级同步客户端,API与Redis原生命令一致,但线程不安全,需配合连接池使用 SpringDataRedis:Spring生态的集成框架,提供统一RedisTemplate API,简化操作但默认序列化方式存在不足 Lettuce:基于Netty的异步线程安全客户端(文中简要提及) 重点分析了Jedis的连接池配置和SpringDataRedis的序列化优化方案,并提供了具体代码示例。针

qq_75103498的博客 787

Labview邪修01:贪吃蛇小游戏

摘要:博主使用LabVIEW 2020(32位)复刻了经典贪吃蛇游戏。程序具备随机生成蛇(初始长度3)和食物、三档速度调节、键盘方向控制等功能,碰撞边界或自身即游戏结束。实现过程包括:1)界面设计,使用二维颜色盒数组构建游戏区,添加速度枚举控件和功能按钮;2)程序架构,采用模块化设计包含Main.vi、Start.vi等6个核心VI,分别处理初始化、位置计算、碰撞检测等逻辑;3)事件驱动机制,通过开始/结束事件、按键响应和超时循环实现游戏流程控制。运行时可实时显示分数,完整还原了贪吃蛇的核心玩法。

weixin_38637405的博客 972

基于Jedis客户端的Java应用中Redis集成与性能优化实战—Jedis连接池的使用详解

Jedis基本使用步骤:1.引入依赖2.创建 Jedis 对象, 建立连接3.使用 Jedis, 方法名与 Red is 命令一致4.释放资源这篇文章详细介绍了如何在Java中使用Redis,主要通过Jedis客户端与Redis进行交互,并展示了常见的操作及配置方式。Jedis基本使用:通过引入Jedis依赖,演示了如何连接Redis并进行基本的操作,如存储和获取字符串数据、操作哈希表。提供了JUnit单元测试的示例,展示了如何验证这些操作。Jedis连接池。

一键难忘的博客 3537

EtherCAT主站SOEM -- 1 -- SOEM之ethercattype.h文件分析

“ethercattype.h” 文件用于支持 EtherCAT 网络通信,提供了各种类型定义和宏,以便开发者更轻松地开发 EtherCAT 相关应用程序。这些定义包括数据类型、命令类型、状态类型和错误类型,以支持 EtherCAT 通信。根据具体应用需求,还可以调整一些超时和帧长度设置。这些定义用于处理函数调用的结果,如 EC_NOFRAME(没有帧返回)、EC_ERROR(一般错误)、EC_TIMEOUT(请求超时)等。这些定义用于处理 EtherCAT 命令,例如 EC_CMD_APRD(自动递增读取

常驻客栈的博客--嵌入式EtherCAT 2716

2024年电气工程师最新面试题及答案

1. **基本电气工程原理**:包括电流、电压、电阻、功率等基本概念。2. **欧姆定律**:V = IR,描述电压、电流和电阻之间的关系。42. **风力发电系统组成**:包括风力涡轮机、发电机、控制系统等。44. **智能电网技术**:包括自动化控制、通信技术、数据分析等。10. **减少EMI**:使用屏蔽、滤波、合理布线等方法。40. **光伏系统组成**:包括光伏板、逆变器、控制器等。48. **能量存储技术**:包括电池、超级电容器、飞轮等。

guo162308的博客 6565

Redis Java 客户端 之 Jedis

Jedis是Redis的Java客户端,本文提供了Jedis的快速入门案例以及Jedis连接池的配置方法。文末附录了SLF4J的日志实现以解决StaticLoggerBinder警告问题。

专注于优雅与性能的未来架构师 879

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

redis的学习(三):Java客户端jedis的例子和SpringDataRedis的简介

Java客户端jedis的例子和SpringDataRedis的简介

weixin_45037073的博客 2328

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Redis缓存】- Java客户端Jedis

一、概述====Java 客户端 Jedis 是一款 java 操作 Redis 数据库的工具,类似于 JDBC,也就是通过 Java 代码来操作数据库。使用步骤如下:导入 jar 包:commons-pool2-2.3.jar、jedis-2.7.0.jar获取jar包链接:https://pan.baidu.com/s/1ONkaNFEy6uocm7Aghe80rg 提取码:plgt使用:获取连接操作数据关闭连接接下来就以 Redis 的五种数据结构来说明 Jedis 的基本使用。

2401_84046577的博客 1093

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Redis】Java客户端使用Redis

Java客户端使用Jedis工具 使用Redis

yj20040627的博客 2191
上一篇: 【Redis学习总结】6. Redis的复制(Master/Slave)
下一篇: 【Centos7下Mysql5.6的安装与卸载】
Rita楠神
博客等级 码龄9年 27粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值