03. SDR RedisTemplate 简介

RedisTemplate 是SDR 提供的操作Redis 的模板类, 默认对key和value均使用jdk序列化方式, 但是笔者并不经常使用jdk 序列化方式也不推荐这种序列化方式,笔者更推荐使用json序列化方式或自定义序列化方式。除了使用SDR 默认提供的RedisTemplate 也可以自定义RedisTemplate.

1. RedisTemplate

1.1 SDR 默认注册RedisTemplate 实例

SDR 在应用启动时,会自动向spring 容器中注入一个RedisTemplate 实例和一个StringRedisTemplate 实例, 注册配置在配置类RedisAutoConfiguration 中定义的.

@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(name = {"redisTemplate"})
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

1.2 自定义RedisTemplate 实例

  • 新建一RedisConfig 配置类, 专门用于配置Redis 相关配置
  • 自定义注册一RedisTemplate,beanName 命名为 gzipRedisTemplate
  • 自定义RedisTemplate的序列化方式,笔者对key采用String序列化方式,对value采用自定义gzip压缩json串的序列化方式
  • 需要注意的是,hash类型的key和value需要单独设置序列化策略.
@Configuration
public class RedisConfig {

    @Bean("gzipRedisTemplate")
    public RedisTemplate<Object, Object> gzipRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException{
        RedisTemplate<Object,Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GzipJsonSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GzipJsonSerializer());
        return template;
    }
    
}

1.3 获取RedisTemplate 实例

获取RedisTemplate时需要注意获取方式, 笔者推荐使用beanName 来获取RedisTemplate实例

// 获取的是RedisTemplate对象
@Autowired
private RedisTemplate redisTemplate;

// 获取的是StringRedisTemplate 对象
@Autowired
private StringRedisTemplate stringRedisTemplate;

// 获取的是StringRedisTemplate 对象, 不推荐这种方式, 容易混淆.
@Autowired
private RedisTemplate<String, String> redisTemplate2;

2. RedisTemplate 存储测试

  • RedisTemplate 采用jdk序列化方式序列化key和value, 所以可以存储任意类型的key和value

2.1 测试用例

@RunWith(SpringRunner.class)
@SpringBootTest
public class Test_RedisTemplate {

    @Autowired
    private RedisTemplate redisTemplate;

    private String hostKey = "host";

    private String userKey = "user";

    @Test
    public void test_set(){
        // 删除key
        redisTemplate.delete(hostKey);
        redisTemplate.delete(userKey);

        // 设置key-value
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set(hostKey, "127.0.0.1");
        ops.set(userKey, new UserPO("zhangsan", "123456"));
    }

    @Test
    public void test_get(){
        ValueOperations ops = redisTemplate.opsForValue();

        String host = (String) ops.get(hostKey);
        System.out.println(host);

        UserPO userPO = (UserPO) ops.get(userKey);
        System.out.println(userPO);
    }

}

2.2 查看redis中存储格式

  • 通过redis-cli 命令查看使用jdk序列化方式, 在redis中的存储方式. 发现key 和value 都进行了jdk序列化.
  • redis中实际存储的时二进制, redis-cli 命令会将二进制转换为string 展现在终端, 但是也足以说明问题
# 获取所有的key
127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x04host"
2) "\xac\xed\x00\x05t\x00\x04user"

# 获取key对应的value
127.0.0.1:6379> get "\xac\xed\x00\x05t\x00\x04host"
"\xac\xed\x00\x05t\x00\t127.0.0.1"
127.0.0.1:6379> get "\xac\xed\x00\x05t\x00\x04user"
"\xac\xed\x00\x05sr\x00\x1eorg.zongf.learn.sdr.l01.UserPOj\xde\xd7\xfa\xd2\xf9\xcaw\x02\x00\x03L\x00\x03aget\x00\x13Ljava/lang/Integer;L\x00\bpasswordt\x00\x12Ljava/lang/String;L\x00\busernameq\x00~\x00\x02xppt\x00\x06123456t\x00\bzhangsan"

上一篇:本体技术视点 | 智能合约安全与漏洞分析(二)


下一篇:孤荷凌寒自学python第105天认识区块链019