前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java连接Redis

Java连接Redis

作者头像
乐心湖
发布2021-01-18 14:56:45
1.8K0
发布2021-01-18 14:56:45
举报
文章被收录于专栏:MyTechnology

在java中我们一般使用Jedis连接Redis,以下操作全部基于该依赖。

最简单的字符串存储

相关依赖

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
    </dependency>
</dependencies>
代码语言:javascript
复制
package com.xn2001.jedis;

import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.Date;

public class Demo1 {
    @Test
    public void test(){
        //连接redis
        Jedis jedis = new Jedis("192.168.231.129");
        //操作redis,redis命令是什么,方法就是什么
        jedis.set("date1",new Date().toString());
        String date1 = jedis.get("date1");
        System.out.println(date1);
        //关闭redis连接
        jedis.close();
    }
}

存储对象

代码语言:javascript
复制
package com.xn2001.jedis;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student implements Serializable {
    private String name;
    private String age;
    private Date date;
}

引入fastjson

代码语言:javascript
复制
<dependency>
    <groupId>com.rover12421</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

测试

代码语言:javascript
复制
package com.xn2001.jedis;

import com.alibaba.fastjson.JSON;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.Date;

public class Demo1 {

    private Jedis jedis;

    @Before
    public void connection(){
        //连接redis
        jedis = new Jedis("192.168.231.129");
    }


    @Test
    public void test(){
        //操作redis,redis命令是什么,方法就是什么
        jedis.set("date1",new Date().toString());
        String date1 = jedis.get("date1");
        System.out.println(date1);

    }

    //存储对象,使用fastjson转化工具
    @Test
    public void test2(){
        Student student = new Student("钟小湖", "18", new Date());
        jedis.set("student1", JSON.toJSONString(student));
        String student1 = jedis.get("student1");
        System.out.println(student1);
        System.out.println(JSON.parseObject(student1,Student.class));
    }

    @After
    public void close(){
        //关闭redis连接
        jedis.close();
    }

}

Jedis连接池

jedis连接资源的创建与销毁是很消耗程序性能,所以jedis为我们提供了jedis的池化技术,jedisPool在创建时初始化一些连接资源存储到连接池中,使用jedis连接资源时不需要创建,而是从连接池中获取一个资源进行redis的操作,使用完毕后,不需要销毁该jedis连接资源,而是将该资源归还给连接池,供其他请求使用。

代码语言:javascript
复制
@Test
public void test() {
    //创建连接池
    JedisPool jedisPool = new JedisPool("192.168.231.129");
    //获取jedis对象
    Jedis jedis = jedisPool.getResource();
    String student1 = jedis.get("student1");
    System.out.println(student1);
    //释放资源
    jedis.close();
}

jedis连接池配置信息

代码语言:javascript
复制
@Test
public void test2(){
    // jedis连接池配置类
    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    poolConfig.setMaxTotal(100); // 连接池中最大的活跃对象
    poolConfig.setMaxIdle(10); // 最大空闲数
    poolConfig.setMinIdle(5); // 最小空闲数
    poolConfig.setMaxWaitMillis(3000); // 当连接池空了之后,多久没获取到Jedis对象就超时
    JedisPool jedisPool = new JedisPool(poolConfig, "192.168.231.129");
}

Redis的管道操作

因为在操作Redis的时候,执行一个命令需要先发送请求到Redis服务器,这个过程需要经历网络的延迟,Redis还需要给客户端一个响应。 如果需要一次性执行很多个命令,上述的方式效率非常非常低,于是我们可以通过Redis的管道,先将命令全部放到客户端的一个Pipeline中,之后一次性执行,同时Redis服务端也给将结果一次性全部返回给客户端。

我们先来看一下不使用管道操作的话,增加100000消耗了多少时间。

代码语言:javascript
复制
    @Test
    public void test1() {
        String s1 = formatter.format(LocalDateTime.now());
        System.out.println("开始时间:" + s1);
        JedisPool jedisPool = new JedisPool("192.168.231.129");
        Jedis jedis = jedisPool.getResource();
        for (int i = 0; i < 100000; i++) {
            jedis.incr("number1");
        }
        jedis.close();
        String s2 = formatter.format(LocalDateTime.now());
        System.out.println("不使用管道操作,完成时间:" + s2);
    }

开始时间:2020-10-08 15:59:07 不使用管道操作,完成时间:2020-10-08 15:59:57

接下来我们用管道操作去测试。

代码语言:javascript
复制
    @Test
    public void test2(){
        String s1 = formatter.format(LocalDateTime.now());
        System.out.println("开始时间:" + s1);
        JedisPool jedisPool = new JedisPool("192.168.231.129");
        Jedis jedis = jedisPool.getResource();
        //创建管道
        Pipeline pipelined = jedis.pipelined();
        //将命令放入管道
        for (int i = 0; i < 100000; i++) {
            pipelined.incr("number2");
        }
        //执行命令
        pipelined.syncAndReturnAll();
        jedis.close();
        String s2 = formatter.format(LocalDateTime.now());
        System.out.println("不使用管道操作,完成时间:" + s2);
    }

开始时间:2020-10-08 16:05:07 不使用管道操作,完成时间:2020-10-08 16:05:07

可以看到操作几乎是一瞬间就完成的。哪怕再加一个0,也仅仅用不到2秒的时间。

连接集群

不需要关注close以及连接池等问题。

代码语言:javascript
复制
@Test
public void test1(){
    HashSet<HostAndPort> nodes = new HashSet<>();
    nodes.add(new HostAndPort("192.168.231.129",7001));
    nodes.add(new HostAndPort("192.168.231.129",7002));
    nodes.add(new HostAndPort("192.168.231.129",7003));
    nodes.add(new HostAndPort("192.168.231.129",7004));
    nodes.add(new HostAndPort("192.168.231.129",7005));
    nodes.add(new HostAndPort("192.168.231.129",7006));
    JedisCluster jedisCluster = new JedisCluster(nodes);
    String a = jedisCluster.get("a");
    String b = jedisCluster.get("b");
    String c = jedisCluster.get("c");
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
}

版权属于:乐心湖's Blog

本文链接:https://cloud.tencent.com/developer/article/1774945

声明:博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 最简单的字符串存储
  • 存储对象
  • Jedis连接池
  • Redis的管道操作
  • 连接集群
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档