Java中Jedis基本使用

在前面我们已经学习了Redis命令行客户端redis-cli的使用,接下来我们了解一下Redis基于Java编程语言的客户端。

在Java语言体系下,有三个常用的Redis客户端JedisRedissonLettuce。三者各有特点,各有适用的场景。

  • Jedis:Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
  • Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,也就能熟练的使用Jedis。
  • Redisson:实现了分布式和可扩展的Java数据结构,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列。和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
  • Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了一个或多个Redis方法调用。
  • Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。是SpringBoot2.x版本默认的客户端。

好了,我们开始学习Jedis的使用吧。

1、Jedis的基本使用

创建Maven工程,在项目中添加Jedis依赖。

   <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.2</version>
        </dependency>

Jedis的使用方法非常简单,只要三行代码就可以实现基本的set/get功能:

        //1.生成一个Jedis对象,这个对象负责和指定Redis实例进行通信
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        // 2.jedis执行set操作
        jedis.set("hello", "world");
        //3.jedis执行get操作,value="world"
        String value = jedis.get("hello");

初始化Jedis需要两个参数:Redis实例的IP和端口,除了这两个参数外,还有一个包含了四个参数的构造函数是比较常用的:

Jedis(final String host, final int port, final int connectionTimeout, final int soTimeout)

参数说明:

  • host:Redis实例的所在机器的IP
  • port:Redis实例的端口
  • connectionTimeout:客户端连接超时
  • soTimeout:客户端读写超时

可以打印输出一下上面程序的结果:

和JDBC类似,一般涉及到这种网络I/O的操作,最好使用try catch finally的形式,稍微修改一下上面的例子:

        Jedis jedis = null;
        try {
            jedis = new Jedis("127.0.0.1", 6379);
            jedis.get("hello");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }

接下来我们看一下Jedis对各种基本数据类型的操作:

字符串

        jedis.set("hello", "world");
        //结果 world
        System.out.println(jedis.get("hello"));
       //结果 1
        System.out.println(jedis.incr("counter"));

hash

        jedis.hset("myhash", "f1", "v1");
        jedis.hset("myhash", "f2", "v2");
        //运行结果 {f2=v2, f1=v1}
        System.out.println(jedis.hgetAll("myhash"));

list

        jedis.rpush("mylist", "1");
        jedis.rpush("mylist", "2");
        jedis.rpush("mylist", "3");
        //运行结果 [1, 2, 3]
        System.out.println(jedis.lrange("mylist",0,-1));

set

        jedis.sadd("myset", "a");
        jedis.sadd("myset", "b");
        jedis.sadd("myset", "a");
        //运行结果 [b, a]
        System.out.println(jedis.smembers("myset"));

zset

        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.zadd("thezset", 99, "tom");
        jedis.zadd("thezset", 66, "peter");
        jedis.zadd("thezset", 33, "james");
        //运行结果 james 33.0 peter 66.0 tom 99.0
        jedis.zrangeWithScores("thezset",0,-1).stream().forEach(s->{
            System.out.print(s.getElement()+" "+s.getScore()+" ");
        });

2、序列化

在Java中,存储对象一般会进行序列化和反序列化,Jedis本身并不支持序列化。可以引入游戏额第三方的序列化工具,例如XML、Json、谷歌的Protobuf、Facebook的Thrift等等。

我们以protostuff(Protobuf的Java客户端)为例来进行学习:

引入protostuff依赖

   <properties>
        <protostuff.version>1.0.11</protostuff.version>
    </properties>

        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
            <version>${protostuff.version}</version>
        </dependency>
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
            <version>${protostuff.version}</version>
        </dependency>

定义实体类

public class Club implements Serializable {
    private int id; // id
    private String name; // 名称
    private String info; // 描述
    private Date createDate; // 创建日期
    private int rank; // 排名
    //省略getter/setter等
}

测试序列化和反序列化

        // 1.生成序列化工具类
        ProtostuffSerializer protostuffSerializer = new ProtostuffSerializer();
        // 2.生成Jedis对象
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        // 3.序列化
        String key = "club:1";
        // 定义实体对象
        Club club = new Club(1, "AC", "米兰", new Date(), 1);
        // 序列化
        byte[] clubBtyes = protostuffSerializer.serialize(club);
        jedis.set(key.getBytes(), clubBtyes);
        // 4.反序列化
        byte[] resultBtyes = jedis.get(key.getBytes());
        Club resultClub = protostuffSerializer.deserialize(resultBtyes);
        //结果 Club{id=1, name='AC', info='米兰', createDate=Sat May 15 22:21:42 CST 2021, rank=1}
        System.out.println(resultClub.toString());

3、Jedis连接池

在上面我们使用的是Jedis的直连方式,每次都会新建TCP 连接,使用后再断开连接。

这种频繁的连接/断开连接的过程显然是对资源的一种浪费。

和数据库连接池一样,同样可以引入池化技术,将Jedis连接存在池子(JedisPool)里,每次去池子里取,而不用重新创建。

连接池的方式是可以预先初始化好Jedis连接,所以每次只需要从 Jedis连接池借用即可,而借用和归还操作是在本地进行的,只有少量的并发同步开销,远远小于新建TCP连接的开销。

Jedis提供了JedisPool这个类作为对Jedis的连接池,同时使用了Apache的通用对象池工具common-pool作为资源的管理工具。

使用JedisPool操 作Redis示例如下:

1)Jedis连接池(通常JedisPool是单例的):

        // common-pool连接池配置,这里使用默认配置
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        // 初始化Jedis连接池
        JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);

2)获取Jedis对象不再是直接生成一个Jedis对象进行直连,而是从连接池直接获取:

        Jedis jedis = null;
        try {
            // 1. 从连接池获取jedis对象
            jedis = jedisPool.getResource();
            // 2. 执行操作
            jedis.get("hello");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                // 如果使用JedisPool,close操作不是关闭连接,代表归还连接池
                jedis.close();
            }
        }

面GenericObjectPoolConfig使用的是默认配置,实际它提供有很多参数,例如池子中最大连接数、最大空闲连接数、最小空闲连接数、连接活性检测,等等。

参考:

【1】:《Redis开发与运维》

【2】:redis几种java客户端比较

到此这篇关于Java中Jedis基本使用的文章就介绍到这了,更多相关Java Jedis使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中使用Jedis操作Redis的实现代码

    一.   redis的安装 1.下载源码,解压缩后编译源码. [root@cwt123 ~]# tar xzf redis-2.8.3.tar.gz [root@cwt123 ~]# cd redis-2.8.3 [root@cwt123 ~]# make 2.启动Redis服务.(src在redis-2.8.3下) [root@cwt123 ~]# cd src [root@cwt123 ~] ./redis-server 3.连接redis客户端 [root@cwt123 ~]# ./red

  • java基于jedisLock—redis分布式锁实现示例代码

    分布式锁是啥? 单机锁的概念:我们正常跑的单机项目(也就是在tomcat下跑一个项目不配置集群)想要在高并发的时候加锁很容易就可以搞定,java提供了很多的机制例如:synchronized.volatile.ReentrantLock等锁的机制. 为啥需要分布式锁:当我们的项目比较庞大的时候,单机版的项目已经不能满足吞吐量的需求了,需要对项目做负载均衡,有可能还需要对项目进行解耦拆分成不同的服务,那么肯定是做成分布式的项目,分布式的项目因为是不同的程序控制,所以使用java提供的锁并不能完全保

  • Java使用Jedis操作Redis服务器的实例代码

    这几天Java项目中需要用到Redis,于是学习了一下使用Jedis来操作Redis服务器的相关知识,下面为具体的配置和代码. 1.Maven中配置Jedis 在maven项目的pom.xml中添加依赖 <dependencies> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</

  • Java中使用Jedis操作Redis的示例代码

    使用Java操作Redis需要jedis-2.1.0.jar,下载地址:jedis-2.1.0.jar 如果需要使用Redis连接池的话,还需commons-pool-1.5.4.jar,下载地址:commons-pool-1.5.4.jar package com.test; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.j

  • JAVA中 redisTemplate 和 jedis的配合使用操作

    首先项目A,也就是SpringBOOT项目中使用redisTemplate 来做REDIS的缓存时,你会发现存到REDIS里边的KEY和VALUE,redisTemplat使用jdkSerializeable存储二进制字节编码 项目B中使用jedis时,存储起来的是字符串,导致项目A要调用项目缓存的键值对时,获取不到 解决方案: 修改项目A的redisTemplate的序列方式 @Configuration @EnableCaching public class RedisConfig exte

  • Java客户端利用Jedis操作redis缓存示例代码

    前言 Redis是一个开源的Key-Value数据缓存,和Memcached类似.Redis多种类型的value,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型). Jedis 是 Redis 官方首选的 Java 客户端开发包.下面就来给大家详细关于Java客户端利用Jedis操作redis缓存的相关内容,话不多说,直接来看示例代码吧. 示例代码: //连接redis ,redis的默认端口是6379 Jedis

  • Java中Jedis基本使用

    在前面我们已经学习了Redis命令行客户端redis-cli的使用,接下来我们了解一下Redis基于Java编程语言的客户端. 在Java语言体系下,有三个常用的Redis客户端Jedis.Redisson.Lettuce.三者各有特点,各有适用的场景. Jedis:Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持: Jedis中的方法调用是比较底层的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,了解Redis的API,

  • redis在java中的使用(实例讲解)

    1.首先下载jar包放到你的工程中 2.练习 package com.jianyuan.redisTest; import java.util.Iterator; import java.util.List; import java.util.Set; import redis.clients.jedis.Jedis; public class RedisTest { public static void main(String[] args) { //连接本地的Redis服务 Jedis je

  • 如何在 Java 中实现一个 redis 缓存服务

    缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度.将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度.一个 web 应用的简单结构如下图. web 应用典型架构 在这个结构中,用户的请求通过用户层来到业务层,业务层在从数据层获取数据,返回给用户层.在用户量小,数据量不太大的情况下,这个系统运行得很顺畅.但是随着用户量越来越大,数据库中的数据越来越多,系统的用户响应速度就越来越慢.系统的瓶颈一般都在数据库访问上.这个时候可能会将上面的架构改成下面的来缓解数

  • Java中的使用及连接Redis数据库(附源码)

    引言: 本文主要分享了Redis如何在IDEA中部署,运行:模拟加入Redis的操作: 目录结构 1. 在IDEA中搭建Redis 1.1 创建项目 新建含有web的SpringBoot项目: 搭建项目参考:SpringBoot超详细笔记:https://blog.csdn.net/weixin_42601136/article/details/108396511 1.2 添加依赖(不够手动添加) <dependencies> <!-- 1. Jedis--> <depend

  • Java中实现分布式定时任务的方法

    定时器Scheduler在平时使用比较频繁,在springboot中,配置好@Scheduled和@EnableScheduling之后,定时器就能正常执行,实现定时任务的功能. 但是在这样的情况下:如果开发的服务需要水平部署实现负载均衡,那么定时任务就会同时在多个服务实例上运行,那么一方面,可能由于定时任务的逻辑处理需要访问公共资源从而造成并发问题:另一方面,就算没有并发问题,那么一个同样的任务多个服务实例同时执行,也会造成资源的浪费.因此需要一种机制来保证多个服务实例之间的定时任务正常.合理

  • Java中操作Redis的详细方法

    目录 1.准备操作 1.1 新建工程 1.2 sca-jedis工程依赖 1.3 sca-tempalte工程依赖 1.4 测试是否可以连接Redis 1.5 修改redis.conf文件 2. 基于Jedis实现对redis中字符串的操作 3. 模式总结 4. 连接池JedisPool应用 5. 单例模式创建连接池 拓展:volatile关键字 6. 项目工程实践 6.1 分布式id 6.2 单点登陆 6.3 投票系统 7. StringRedisTemplate 应用 7.1 修改yml文件

  • Redis五种数据结构在JAVA中如何封装使用

    目录 数据结构 string字符串 string字符串简介 string字符串在Java中的封装 list列表 list列表简介 队列 栈 list列表在Java中的封装 hash(字典) hash字典简介 hash字典在Java中的封装 set(集合) set集合简介 set集合在Java中的封装 zset(有序列表) zset有序列表 zset有序列表在Java中的封装 数据结构 Redis有五种基础数据结构,分别为: 1.string(字符串) 2.list(列表) 3.hash(字典)

  • 一文搞懂Java中对象池的实现

    目录 1. 什么是对象池 2. 为什么需要对象池 3. 对象池的实现 4. 开源的对象池工具 5. JedisPool 对象池实现分析 6. 对象池总结 最近在分析一个应用中的某个接口的耗时情况时,发现一个看起来极其普通的对象创建操作,竟然每次需要消耗 8ms 左右时间,分析后发现这个对象可以通过对象池模式进行优化,优化后此步耗时仅有 0.01ms,这篇文章介绍对象池相关知识. 1. 什么是对象池 池化并不是什么新鲜的技术,它更像一种软件设计模式,主要功能是缓存一组已经初始化的对象,以供随时可以

  • 详解Java中@Override的作用

    详解Java中@Override的作用 @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1.可以当注释用,方便阅读: 2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法. 举例:在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性. @Overr

随机推荐