Redis和Redisson接入

Redis的接入和使用

Redis

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置服务器

spring:
  data:
    redis:
      host: r-xxxx.redis.rds.aliyuncs.com #Redis的Host
      port: 6379 # Redis服务器连接端口
      password: xxxx # Redis服务器连接密码(默认为空)

代码解析

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {NfTurboApplication.class})
public class RedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testRedisConnect() {

        redisTemplate.opsForValue().set("test", "test");
        Assert.assertTrue(redisTemplate.opsForValue().get("test").equals("test"));

        if (redisTemplate.opsForValue().get("test").equals("test")) {
            System.out.println("redis connect success");
        }
    }
}

使用@Autowired引入RedisTemplate来使用Redis,RedisTemplate 是 Spring Data Redis 提供的一个用于操作 Redis 数据库的核心类,它封装了 Redis 客户端的操作细节,为开发者提供了一套简单、统一且面向对象的 API,方便在 Spring 应用中使用 Redis。

操作字符串(String)

@Service
public class RedisStringService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void setValue(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    public Object getValue(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

操作哈希值

@Service
public class RedisHashService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void setHashValue(String key, String hashKey, Object value) {
        redisTemplate.opsForHash().put(key, hashKey, value);
    }

    public Object getHashValue(String key, String hashKey) {
        return redisTemplate.opsForHash().get(key, hashKey);
    }

    public Map<Object, Object> getHashAll(String key) {
        return redisTemplate.opsForHash().entries(key);
    }
}

操作列表(List)

@Service
public class RedisListService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void leftPush(String key, Object value) {
        redisTemplate.opsForList().leftPush(key, value);
    }

    public List<Object> range(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }
}

Redis数据的序列化问题

序列化问题

RedisTemplate 默认使用 JDK 序列化器,这会导致存储在 Redis 中的数据以二进制形式存在,不易阅读和调试。因此,通常会根据实际需求选择合适的序列化器。

String 序列化

将对象转换为字符串进行存储,通常用于存储简单的字符串数据。在 Spring Data Redis 中,可以使用 StringRedisSerializer

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, String> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        // 设置键和值的序列化器为 String 序列化器
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setValueSerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.setHashValueSerializer(stringRedisSerializer);

        template.afterPropertiesSet();
        return template;
    }
}
  • 优点:简单高效,序列化和反序列化的性能非常高;存储的字符串数据易于阅读和调试。
  • 缺点:只能处理字符串类型的数据,对于复杂对象需要手动进行转换。

JDK 序列化

JDK 自带的序列化机制,通过实现 java.io.Serializable 接口,将对象转换为字节流。

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        // 设置键的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());

        // 设置值的序列化器为 JDK 序列化器
        JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
        template.setValueSerializer(jdkSerializationRedisSerializer);
        template.setHashValueSerializer(jdkSerializationRedisSerializer);

        template.afterPropertiesSet();
        return template;
    }
}
  • 优点:使用简单,无需额外依赖,只要对象实现 Serializable 接口即可。
  • 缺点:序列化后的字节数据较大,会占用较多的 Redis 内存空间;序列化和反序列化的性能相对较低;存储的字节数据不易阅读和调试。

JSON 序列化

将对象转换为 JSON 字符串,常用的 JSON 序列化库有 Jackson、Gson 等。在 Spring Data Redis 中,可以使用 GenericJackson2JsonRedisSerializer 进行 JSON 序列化。

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        // 设置键的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());

        // 设置值的序列化器为 JSON 序列化器
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);

        template.afterPropertiesSet();
        return template;
    }
}
  • 优点:序列化后的 JSON 数据可读性强,便于调试和查看;序列化和反序列化的性能较好;可以跨语言使用。
  • 缺点:JSON 格式会增加一些额外的字符,如引号、逗号等,导致数据量相对较大;对于复杂对象的序列化可能会存在一些问题,如丢失对象的类型信息。

序列化器的选择

  • 简单字符串数据:如果存储的数据只是简单的字符串,建议使用 StringRedisSerializer,性能高且易于处理。
  • 复杂对象数据:如果需要存储 Java 对象等复杂数据,建议使用 GenericJackson2JsonRedisSerializer,它可以将对象序列化为 JSON 格式,可读性好且性能不错。
  • 对性能要求极高且对象结构简单:如果对性能要求极高,且对象结构简单,可以考虑使用 JDK 序列化,但要注意其占用空间较大的问题。

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部