目 录CONTENT

文章目录

Redis的java客户端构建

zhouzz
2024-09-07 / 0 评论 / 0 点赞 / 11 阅读 / 15946 字
温馨提示:
本文最后更新于 2024-09-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1.SpringDataRedis介绍

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

官网地址: https://spring.io/projects/spring-data-redis

Spring-Data-Redis提供的特性:

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

SpringDataRedis 中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

API返回值类型说明
redisTemplate.opsForValue()ValueOperations操作string类型数据
redisTemplate.opsForHash()HashOperations操作Hash类型数据
redisTemplate.opsForList()ListOperations操作List类型数据
redisTemplate.opsForSet()SetOperations操作Set类型数据
redisTemplate.opsForZSet()ZSetOperations操作SortedSet类型数据
redisTemplate通用的命令

2.SpringDataRedis测试

2.1 项目依赖

项目中 springboot spring-boot-starter-parent 版本是 2.7.18

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- Redis连接池 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2.2 配置文件

application.yml

spring:
  redis:
    host: 192.168.198.150
    port: 6379
    # 如果需要密码
    password: 123456
    lettuce:
      pool:
        min-idle: 1 # 最小空闲连接
        max-idle: 8 # 最大空闲连接
        max-active: 8 # 最大连接
        max-wait: 1000 # 连接等待时间(单位ms)

2.3 配置类

RedisConfig.java

/**
 * 这里RedisConfig会自定义某些序列化
 * @author zhouzz
 */
@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Value("${spring.redis.password}")
    private String password;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        // 创建Redis的单机配置
        RedisStandaloneConfiguration config =
                new RedisStandaloneConfiguration(redisHost, redisPort);
        config.setPassword(RedisPassword.of(password));
        // 返回Lettuce连接工厂
        return new LettuceConnectionFactory(config);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        // 创建RedisTemplate实例
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置连接工厂
        template.setConnectionFactory(connectionFactory);
        // 设置键的序列化器为 StringRedisSerializer
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        // 设置默认的序列化器为 GenericJackson2JsonRedisSerializer,用于序列化键和值为JSON格式
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        template.setDefaultSerializer(jsonRedisSerializer);
        // 设置值的序列化器为 GenericJackson2JsonRedisSerializer
        template.setValueSerializer(jsonRedisSerializer);
        // 设置hash键的序列化器为 StringRedisSerializer
        template.setHashKeySerializer(stringRedisSerializer);
        // 设置值的序列化器为 GenericJackson2JsonRedisSerializer
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回配置好的RedisTemplate实例
        return template;
    }
}

2.4 启动类

@SpringBootApplication
public class RedisApplication {
    public static void main(String[] args) {
        SpringApplication.run(RedisApplication.class, args);
    }
}

2.5测试类

UserEntity.java

public class UserEntity {
    private String username;
    private Integer age;
    //getXXX,setXXX,toString方法
}

RedisTemplateTest.java

@SpringBootTest(classes = RedisApplication.class)
public class RedisTemplateTest {
    ObjectMapper objectMapper = new ObjectMapper();
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
  
    @Test
    public void test1() {
        String key = "aa";
        redisTemplate.opsForValue().set(key, "bb");

        Object value = redisTemplate.opsForValue().get(key);
        System.out.println(value);
    }
  
    @Test
    public void test2() {
        String key = "user:1001";

        UserEntity user = new UserEntity();
        user.setUsername("张三");
        user.setAge(22);

        redisTemplate.opsForValue().set(key, user, 3, TimeUnit.MINUTES);

        UserEntity userEntity = (UserEntity) redisTemplate.opsForValue().get(key);
        System.out.println(userEntity);
    }

    @Test
    public void test3() throws JsonProcessingException {
        String key = "user:1002";
        UserEntity user = new UserEntity();
        user.setUsername("李四");
        user.setAge(25);
        //手动需要序列化
        String userJsonStr = objectMapper.writeValueAsString(user);
        stringRedisTemplate.opsForValue().set(key, userJsonStr, 3, TimeUnit.MINUTES);
        userJsonStr = stringRedisTemplate.opsForValue().get(key);
        //手动反序列化
        UserEntity userEntity = objectMapper.readValue(userJsonStr, UserEntity.class);
        System.out.println(userEntity);
    }
}

测试结果如下:

用 RedisTemplate 在Redis生成的 value为:

{
    "@class": "com.zhouzz.redis.entity.UserEntity",
    "username": "张三",
    "age": 22
}

而使用StringRedisTemplate在Redis生成的 value为:

{
    "username": "李四",
    "age": 25
}

两者对比而已,前者所存储value值的内存开销更大。

推荐使用 StringRedisTemplate。

0

评论区