redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)

简介: 这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。

Jedis的使用

Jedis使用的基本步骤:
① 引入依赖创建Jedis对象,
② 建立连接
③ 使用Jedis,方法名与Redis命令一致
④ 释放资源

  1. 引入依赖
<!--Jedis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.3.1</version>
</dependency>
  1. 建立连接
// 测试链接
void SetUp(){
   
    // 1.建立链接
    jedis = new Jedis("192.168.197.129",6379);
    // 2.密码认证
    jedis.auth("123321");
    // 3.选择库
    jedis.select(0);
}
  1. 插入string类型的数据
 void testString(){
   
    String res = jedis.set("name", "byf");
    System.out.println("res"+res);

    String name = jedis.get("name");
    System.out.println("name="+name);
}
  1. 释放连接
 // 释放资源
void tearDown(){
   
    if(jedis!=null){
   
        jedis.close();
    }
}
  1. 完整代码:
package com.robin.test;

import redis.clients.jedis.Jedis;

public class JedisDemo1 {
   

    private Jedis jedis;

    // 测试链接
    void SetUp(){
   
        // 1.建立链接
        jedis = new Jedis("192.168.197.129",6379);
        // 2.密码认证
        jedis.auth("123321");
        // 3.选择库
        jedis.select(0);
    }

    // 测试String
    void testString(){
   
        String res = jedis.set("name", "byf");
        System.out.println("res"+res);

        String name = jedis.get("name");
        System.out.println("name="+name);

    }

    // 释放资源
    void tearDown(){
   
        if(jedis!=null){
   
            jedis.close();
        }
    }

    public static void main(String[] args) {
   
        JedisDemo1 demo1 = new JedisDemo1();
        demo1.SetUp();
        demo1.testString();
        demo1.tearDown();
    }

}

Jedis连接池

PS:Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐使用Jedis连接池代替Jedis的直连方式。

package com.robin.test;

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


/**
 * 使用JedisPool连接池
 */
public class JedisDemo2 {
   

    private static final JedisPool jedisPool;

    static {
   
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 配置连接池参数
        jedisPoolConfig.setMaxTotal(8); // 最大链接数
        jedisPoolConfig.setMaxIdle(8); //最大空闲连接数
        jedisPoolConfig.setMinIdle(8); // 最小空闲连接数

        jedisPool = new JedisPool(jedisPoolConfig,"192.168.197.129",6379);
    }

    // 获取jedis对象
    public static Jedis getJedis(){
   
        return jedisPool.getResource();
    }
}

SpringBoot整合Jedis

快速入门

SpringDataRedis的使用步骤:
① 引入spring-boot-starter-data-redis依赖
② 在application.yml配置Redis信息
③ 注入RedisTemplate

  1. 引入依赖
<!-- redis-stater -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--common-pool redis连接池-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.11.1</version>
</dependency>
  1. 配置yaml相关redis配置信息
spring:
  data:
    redis:
      host: 192.168.197.129 # redis服务IP
      port: 6379 # 端口
      password: 123321 # redis auth 认证密码
      lettuce:
        pool:
          max-active: 8  # 最大连接数
          max-idle: 8  # 最大空闲连接数
          max-wait: 100ms  # 最长等待时间
  1. 注入RedisTemplate测试使用
@SpringBootTest
class RedisDemoApplicationTests {
   

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Test
    void testString() {
   
        redisTemplate.opsForValue().set("day","2023-11-28");
        String day = (String)redisTemplate.opsForValue().get("day");
        System.out.println(day);
    }

}

在这里插入图片描述

RedisTemplate的两种序列化实践方案

redisTemplate

  1. 默认情况
    RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式默认是采用JDK序列化。(字节形式可读性差,且占用内存较大
    在这里插入图片描述

  2. 自定义redisTemlate的序列化方式

@Configuration
public class RedisConfig {
   

    @Bean
    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);
        // 返回 RedisTemplate
        return  template;
    }
}

PS:key设为string的序列化,value设为json序列化

@Test
void testSaveUser(){
   
    redisTemplate.opsForValue().set("user:100",new User("zhangsan",21));
    User o = (User)redisTemplate.opsForValue().get("user:100");
    System.out.println(o);
}

在这里插入图片描述

为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。" @class:“com.robin.redisdemo.pojo.user” "

stringRedisTemplate

统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化
在这里插入图片描述
(Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。)

@SpringBootTest
class StringRedisTemplateTests {
   

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void testString() {
   
        stringRedisTemplate.opsForValue().set("day","2023-11-28");
        String day = (String)stringRedisTemplate.opsForValue().get("day");
        System.out.println(day);
    }


    private static final ObjectMapper mapper= new ObjectMapper();

    @Test
    void testSaveUser() throws JsonProcessingException {
   
        // 创建对象
        User user = new User("zhangsan2", 21);
        // 手动序列化
        String json = mapper.writeValueAsString(user);
        // 写入数据
        stringRedisTemplate.opsForValue().set("user:200",json);
        // 手动反序列化
        User user1 = mapper.readValue(json, User.class);
        String res = stringRedisTemplate.opsForValue().get("user:200");
        System.out.println(res);
    }

}

在这里插入图片描述


相关文章
|
6天前
|
NoSQL Java API
springboot项目Redis统计在线用户
通过本文的介绍,您可以在Spring Boot项目中使用Redis实现在线用户统计。通过合理配置Redis和实现用户登录、注销及统计逻辑,您可以高效地管理在线用户。希望本文的详细解释和代码示例能帮助您在实际项目中成功应用这一技术。
14 3
|
8天前
|
消息中间件 NoSQL Java
Spring Boot整合Redis
通过Spring Boot整合Redis,可以显著提升应用的性能和响应速度。在本文中,我们详细介绍了如何配置和使用Redis,包括基本的CRUD操作和具有过期时间的值设置方法。希望本文能帮助你在实际项目中高效地整合和使用Redis。
22 1
|
16天前
|
存储 安全 Java
🌟Java零基础-反序列化:从入门到精通
【10月更文挑战第21天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
53 5
|
1月前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
334 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
15天前
|
监控 前端开发 Java
Java SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优
|
17天前
|
存储 缓存 安全
🌟Java零基础:深入解析Java序列化机制
【10月更文挑战第20天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
21 3
|
20天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
17天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
21天前
|
NoSQL 网络协议 算法
Redis 客户端连接
10月更文挑战第21天
25 1
|
23天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
61 2