Redis之数据Set和Get类型不一致问题

开心一下

“大师,我本来就黑,一到夏天就晒的更黑了,别人都取笑我,我该怎么办?”
大师不言语,悠悠的把寺门打开,让阳光投射进来。
"我明白了大师,你是让我打开心扉,不要在乎别人的看法,对吗?"
"不是,老衲只是想看清楚,施主你到底在哪!”

提出问题

数据存入Redis和取出,数据类型发生莫名其妙的改变???

解决问题

1.假设你们公司已经集成Redis
2.假设你已经了解一点Redis
3.那么开始吧

public void test(){
    try {
        //new一个HashSet集合
        Set<String> set = new HashSet<>();
        //添加数据
        set.add("Ay");
        set.add("Al");
        set.add("Get");
        set.add("Together");
        //RedisUtils是公司自己封装的工具,最终还是调用
        //RedisTemplate将数据存到缓存中
        RedisUtils.set("TestSaveAndGet",set);


        System.out.println("休息下......");
        
        //取出数据时,在这里会出错
        Set<String> mySet = (Set)RedisUtils.get("TestSaveAndGet");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

结果如下:

这里写图片描述

发现Redis把原本为HashSet类型的数据,偷偷转变为ArrayList,造成该代码报错.

出现这样原因:
1.Redis后端代码将HashSet数据序列化到Redis缓存中,取得时候,再默认反序列化为ArrayList

get方法源码如下:ValueDeserializingRedisCallback会执行数据的反序列化。

public V get(final Object key) {

        return execute(new ValueDeserializingRedisCallback(key) {

            protected byte[] inRedis(byte[] rawKey, RedisConnection connection) {
                return connection.get(rawKey);
            }
        }, true);
    }

解决办法:

在不改变源码情况下,只能把返回来的数据转化为我们需要的数据。。

读书感悟

来自《北京遇上西雅图之不二情书》

  • 暗透了才看得见星光。要有向死而生的勇气。
  • 深爱太伤人,毫无保留的把心交出去,就害怕有一天,得自己一个人疗伤。
  • 人在哪儿,家在哪儿,人不在了,家在心里。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容