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客户端建立内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中GC与四种引用的关系详解

    Java中GC与四种引用的关系详解

    这篇文章主要介绍了Java中GC与四种引用的关系详解,Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference这 4 种类型的引用与 GC 有着密切的关系, 让我们逐一来看它们的定义和使用场景,需要的朋友可以参考下
    2023-09-09
  • MyBatis-Plus实现优雅处理JSON字段映射

    MyBatis-Plus实现优雅处理JSON字段映射

    默认情况下,MyBatis-Plus 是不支持直接映射 JSON 类型的,这时候就需要借助其他的方法,下面小编就来和大家讲讲MyBatis-Plus如何优雅处理JSON字段映射吧
    2025-04-04
  • springboot增加注解缓存@Cacheable的实现

    springboot增加注解缓存@Cacheable的实现

    这篇文章主要介绍了springboot增加注解缓存@Cacheable的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中的ByteArrayInputStream详解

    Java中的ByteArrayInputStream详解

    Java中,ByteArrayInputStream类是实现内存级别的字节流读取的工具,可以从字节数组中读取数据,这个类位于java.io包中,继承自InputStream,ByteArrayInputStream的主要特点有:在内存中操作,不涉及磁盘IO,可以重用流读取数据
    2024-09-09
  • Spring事务失效场景实例详解

    Spring事务失效场景实例详解

    实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制,好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,下面这篇文章主要给大家介绍了关于Spring事务失效场景的相关资料,需要的朋友可以参考下
    2022-03-03
  • SpringCloud中的Eureka集群配置方法

    SpringCloud中的Eureka集群配置方法

    这篇文章主要介绍了SpringCloud中的Eureka集群配置,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • SpringCloud Gateway使用详解

    SpringCloud Gateway使用详解

    Spring Cloud Gateway是一个基于Spring Boot 2.x和Spring WebFlux的API网关,可以帮助我们构建微服务架构中的统一入口。感兴趣的同学可以参考一下
    2023-04-04
  • SpringBoot浅析缓存机制之Ehcache 2.x应用

    SpringBoot浅析缓存机制之Ehcache 2.x应用

    EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点。它是Hibernate中的默认缓存框架。Ehcache已经发布了3.1版本。但是本文的讲解基于2.x版本
    2022-08-08
  • 有关tomcat内存溢出的完美解决方法

    有关tomcat内存溢出的完美解决方法

    下面小编就为大家带来一篇有关tomcat内存溢出的完美解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • Maven打包之解决没有依赖jar包问题及分析

    Maven打包之解决没有依赖jar包问题及分析

    用户使用Maven打包FTPServer程序时,因未配置依赖打包导致jar体积过小且运行报错,解决方法是添加maven-assembly插件生成包含依赖的jar包,确保程序正常运行
    2025-09-09

最新评论