RedisTemplate 保存数据的键值通过rdm可视化工具查看乱码

最近封装一个redis工具类,Spring Boot 版本2.2.5;最初考虑仅封装一些API满足业务需求,想着一切从简,使用默认配置。最后发现key值在rdm工具上显示乱码

最初使用的rdm版本是0.8.3,当key值乱码的时候,无法直接通过工具删除缓存的数据;必须把key值改掉才可以。 后来升级了rdm到0.9.3,才能正常删除数据。 

虽然可以正常操作缓存数据,但可读性不高。

查看RedisTemplate源码,keySerializer 就是序列键值使用到的序列化器。

	@SuppressWarnings("rawtypes") private @Nullable RedisSerializer keySerializer = null;
	@SuppressWarnings("rawtypes") private @Nullable RedisSerializer valueSerializer = null;
	@SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashKeySerializer = null;
	@SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashValueSerializer = null;

继续查看源码:

@Override
	public void afterPropertiesSet() {

		super.afterPropertiesSet();

		boolean defaultUsed = false;

        // 如果默认的序列化器为空,就创建一个 
		if (defaultSerializer == null) {

			defaultSerializer = new JdkSerializationRedisSerializer(
					classLoader != null ? classLoader : this.getClass().getClassLoader());
		}

        // 是否启用默认序列化器 // 默认为 true
		if (enableDefaultSerializer) {

            // 如果序列化器为空,则使用默认序列化器
			if (keySerializer == null) {
				keySerializer = defaultSerializer;
				defaultUsed = true;
			}
			if (valueSerializer == null) {
				valueSerializer = defaultSerializer;
				defaultUsed = true;
			}
			if (hashKeySerializer == null) {
				hashKeySerializer = defaultSerializer;
				defaultUsed = true;
			}
			if (hashValueSerializer == null) {
				hashValueSerializer = defaultSerializer;
				defaultUsed = true;
			}
		}

		if (enableDefaultSerializer && defaultUsed) {
			Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized");
		}

		if (scriptExecutor == null) {
			this.scriptExecutor = new DefaultScriptExecutor<>(this);
		}

		initialized = true;
	}

通过这段代码,可以看到如果全部使用默认配置,最终key值序列化使用的是 JdkSerializationRedisSerializer

解决方案:

1、可以新建一个配置类,覆盖默认的配置。本人为了简便,暂时没有这样处理

2、在服务加载完成后设置

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @PostConstruct
    private void init() {
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setValueSerializer(RedisSerializer.json());
    }

建议:本文为了简化配置,处理相对简单。建议还是使用配置类覆盖默认的配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值