[Redis系列]-开篇之Redission#set成功get不到

Redis目前已经是行业内很成熟,很香的一款nosql。猿Why最早时候使用,要追溯到在上一家单位的时候了。当时只是做一个服务调用者,从未了解过Redis的知识。
但是最近项目中多次遇到一个奇怪的问题:“应用程序调用Redis服务(Redission作为客户端),set成功之后,get获取数据为null”。为了一探究竟,方便排查问题,决定认真学习一番Redis。学习分为三个步骤:基础命令学习、客户端工具学习、Redis服务学习(集群),以此文章为开篇。
为了将问题最简化:

在本地启用一个单节点Redis服务(过程是在太简单,不做赘述)

在这里插入图片描述
一个客户端连接操作:
在这里插入图片描述
另一个客户端可以作为Monitor对服务端进行监控(简化到日志都不想去看)
在这里插入图片描述

Spring集成Redission

redis.properties

spring.redis.address=127.0.0.1
spring.redis.port=6379
spring.redis.timeout=3000
spring.redis.password=
spring.redis.database=0
@PropertySource(name = "META-INF/redis.properties", value = "classpath:META-INF/redis.properties", ignoreResourceNotFound = false, encoding = "GBK")
@Configuration
public class RedissonConfig {
    @Bean(destroyMethod = "shutdown")
    public RedissonClient singleRedis(@Value("${spring.redis.address}") String address,
                                      @Value("${spring.redis.port}") String port,
                                      @Value("${spring.redis.timeout}") int timeout,
                                      @Value("${spring.redis.password}") String password,
                                      @Value("${spring.redis.database}") int database
    ) {
        Config config = new Config();
        SingleServerConfig singleServerConfig = config.useSingleServer();
        singleServerConfig.setAddress("redis://" + address + ":" + port);
        singleServerConfig.setTimeout(timeout);
        singleServerConfig.setDatabase(database);
        if (!StringUtils.isEmpty(password)) {
            singleServerConfig.setPassword(password);
        }
        return Redisson.create(config);
    }
}

Demo Test

public class RedissionClientTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(RedissonConfig.class);
        context.register(RedissionClientTest.class);
        context.refresh();
        RedissonClient redissonClient = context.getBean(RedissonClient.class);
        RMap<String, String> rMap = redissonClient.getMap("demo");
        System.out.printf("Map容量:%d\n", rMap.size());
        System.out.printf("test:%s\n", rMap.get("test"));
        redissonClient.shutdown();
        context.close();
    }
}

然而,结果是这样的:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201120224519140.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3MzA3MzE=,size_16,color_FFFFFF,t_70#pic_center

好嘛!细心一点可以发现,redis-cli 通过命令方式去操作的时候,是可以获取到值的,here we go,看看服务端监控:发现了什么?field多了一层双引号

在这里插入图片描述

问题出在哪里?

直接上结果:Redission依赖JsonJackson,导致RMap反序列化异常
在这里插入图片描述

Unable to evaluate the expression Method threw 'org.redisson.client.RedisException' exception.

在这里插入图片描述

那么规避办法呢?

RedissonConfig中补充一行代码

config.setCodec(new org.redisson.client.codec.StringCodec());

至于其中原理,后边的章节一探究竟。

另外:出现这种类似问题还有可能因为:
主从复制模式下,在master set之后,尚未同步到slave,就从slave读取,自然不会get到(后边一边学习,一边记录吧)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值