Redis Java客户端建立的两种方式小结

 更新时间:2025年04月07日 09:34:43   作者:Calvad0s  
Redis具有快速读取数据的能力,将经常访问的数据缓存到Redis中,可以减轻数据库的压力,本文主要介绍了Redis Java客户端建立的两种方式小结,具有一定的参考价值,感兴趣的可以了解一下

第一种方式:Jedis方式

(1)引入依赖

<!--jedis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version>
</dependency>
<!--单元测试-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.7.0</version>
    <scope>test</scope>
</dependency>

(2)创建工厂类

public class JedisConnectionFactory {

    private static final JedisPool jedisPool;

    static {
        //配置连接池
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //最大连接数,也就是线程池最多可以创建8个连接
        poolConfig.setMaxTotal(8);
        //最大空闲连接
        poolConfig.setMaxIdle(8);
        //最小空闲连接,超过一段时间后,如果一直没有人访问,空闲连接就会被释放,直到为0为止
        poolConfig.setMinIdle(0);
        //最大等待时间,如果超过1000毫秒,则报错
        poolConfig.setMaxWaitMillis(1000);
        //创建连接池对象
        jedisPool = new JedisPool(poolConfig,
                "127.0.0.1",6379,1000,"123456");
    }

    public static Jedis getJedis(){
        return jedisPool.getResource();
    }

}

(3)创建Junit测试类

public class JedisTest {

    private Jedis jedis;

    @BeforeEach
    void setUp(){
        //建立连接
        jedis = JedisConnectionFactory.getJedis();
        //选择库
        jedis.select(0);
    }

    @Test
    void testString() {
        //存入数据
        String result = jedis.set("name", "Jack");
        System.out.println("result = " + result);
        // 获取数据
        String name = jedis.get("name");
        System.out.println("name = " + name);
    }

    @AfterEach
    void tearDown() {
        if (jedis != null) {
            jedis.close();
        }
    }

}

第二种方式:SpringDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK.JSON.字符串.Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

(1)创建SpringBoot项目,选择场景启动器

(2)引入依赖

<!--common-pool-->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-pool2</artifactId>
</dependency>
<!--Jackson依赖-->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
</dependency>

(3)配置application.yml

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456
    lettuce:
      pool:
        max-active: 8  #最大连接
        max-idle: 8   #最大空闲连接
        min-idle: 0   #最小空闲连接
        max-wait: 100ms #连接等待时间

(4)编写测试类

@SpringBootTest
class SpringdataredisDemoApplicationTests {

    @Resource
    private RedisTemplate redisTemplate;

    @Test
    void testString() {
        redisTemplate.opsForValue().set("name","Tom");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println(name); //Tom
    }

}

(5)序列化引起的问题

我们这时可能会发现一个问题,那就是我可以在Java代码中set和get,取值都没问题。但我如果在代码中set,在命令端get,就会出现一堆看不懂的二进制,如下:

原因:RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,key也会被序列化为字节形式,默认是采用JDK序列化。 

因为这种序列化方式一是我们读不懂,二是内存占用较大。

所以我们要修改序列化方式,采用自定义的方式。

(6)创建自定义序列化配置类

@Configuration
public class RedisConfig {

    @Bean
    @Resource
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
        // 创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置连接工厂
        template.setConnectionFactory(connectionFactory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer =
                new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }
}

(7)运行测试类

我们发现不管是key还是value,都已经被我们自定义序列化。

(8)测试一下对象存储

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private Integer age;
}
@Test
void testSaveUser(){
	redisTemplate.opsForValue().set("user:1",new User("Uzi",21));
	User user = (User) redisTemplate.opsForValue().get("user:1");
	System.out.println(user);
}

注意:尽管JSON序列化可以满足我们的需求,但仍然存在一些问题,如上图,除了我们set的数据以外,还有个@class,这是一笔不小的内存开销啊,那么有方法可以解决吗?

解决办法:使用StringRedisTemplate

为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。

(9)新建测试类,使用StringRedisTemplate

@SpringBootTest
public class RedisStringTests {

    @Resource
    private StringRedisTemplate stringRedisTemplate;
    
    //用来手动序列化和反序列化,需引入Jackson包
    private static final ObjectMapper mapper = new ObjectMapper();

    @Test
    void testString() {
        stringRedisTemplate.opsForValue().set("name","Tom");
        Object name = stringRedisTemplate.opsForValue().get("name");
        System.out.println(name);
    }

    @Test
    void testSaveUser() throws JsonProcessingException {
        User user = new User("Uzi",21);
        //手动序列化
        String json = mapper.writeValueAsString(user);
        stringRedisTemplate.opsForValue().set("user:1",json);
        String jsonUser = stringRedisTemplate.opsForValue().get("user:1");
        //手动反序列化
        User user1 = mapper.readValue(jsonUser, User.class);
        System.out.println(user1);
    }
}

到此这篇关于Redis Java客户端建立的两种方式小结的文章就介绍到这了,更多相关Redis Java客户端建立内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot项目POM文件的使用小结

    SpringBoot项目POM文件的使用小结

    本文主要详细介绍了Maven中SpringBoot项目的POM文件配置,包括项目的依赖和插件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • 纯Java代码实现流星划过天空

    纯Java代码实现流星划过天空

    本文给大家介绍纯java代码实现流星划过天空,包括流星个数,流星飞行的速度,色阶,流星大小相关变量设置。对java流星划过天空特效代码感兴趣的朋友可以参考下本文
    2015-10-10
  • Session过期后实现自动跳转登录页面

    Session过期后实现自动跳转登录页面

    这篇文章主要介绍了Session过期后实现自动跳转登录页面,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • 详解Java创建线程的五种常见方式

    详解Java创建线程的五种常见方式

    Java中如何进行多线程编程,如何使用多线程?不要担心,本文将为你详细介绍一下Java实现线程创建的五种常见方式,感兴趣的可以跟随小编学习一下
    2022-01-01
  • Java截取特定两个标记之间的字符串实例

    Java截取特定两个标记之间的字符串实例

    下面小编就为大家带来一篇Java截取特定两个标记之间的字符串实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java将GeoHash转化为对应的经纬度坐标实例代码

    Java将GeoHash转化为对应的经纬度坐标实例代码

    这篇文章主要介绍了Java实现将GeoHash转化为对应的经纬度坐标的相关资料,需要的朋友可以参考下
    2016-01-01
  • 用SpringMVC编写一个HelloWorld的详细过程

    用SpringMVC编写一个HelloWorld的详细过程

    SpringMVC是Spring的一个后续产品,是Spring的一个子项目<BR>SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案,本文我们将用SpringMVC编写一个HelloWorld,文中有详细的编写过程,需要的朋友可以参考下
    2023-08-08
  • Java图片裁剪和生成缩略图的实例方法

    Java图片裁剪和生成缩略图的实例方法

    这篇文章主要介绍了Java图片裁剪和生成缩略图的实例方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • 基于@LastModifiedDate不起作用的解决方案

    基于@LastModifiedDate不起作用的解决方案

    这篇文章主要介绍了基于@LastModifiedDate不起作用的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • springBoot集成flowable的流程解析

    springBoot集成flowable的流程解析

    这篇文章主要介绍了springBoot集成flowable的流程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02

最新评论