DefaultHashOperations multiget的一个坑

 

DefaultHashOperations的multiget如果没有数据会返回java.util.Collections.EmptyList,这个List没有重写add方法。

 

List<Long> resultIds=redisTemplate.boundHashOps(“key”).multiGet(ids)

 

resultIds在add一个新元素时,报了一下的错:
java.lang.UnsupportedOperationException
        at java.util.AbstractList.add(AbstractList.java:148)
        at java.util.AbstractList.add(AbstractList.java:108)

 

原因:

org.springframework.data.redis.core.RedisTemplate#boundHashOps

    public List<HV> multiGet(Collection<HK> hashKeys) {
        return ops.multiGet(getKey(), hashKeys);
    }

org.springframework.data.redis.core.DefaultHashOperations#multiGet

    public List<HV> multiGet(K key, Collection<HK> fields) {
        if (fields.isEmpty()) {
            return Collections.emptyList();//这个list是java.util.Collections#emptyList中的java.util.Collections.EmptyList
        }

        final byte[] rawKey = rawKey(key);

        final byte[][] rawHashKeys = new byte[fields.size()][];

        int counter = 0;
        for (HK hashKey : fields) {
            rawHashKeys[counter++] = rawHashKey(hashKey);
        }

        List<byte[]> rawValues = execute(new RedisCallback<List<byte[]>>() {

            public List<byte[]> doInRedis(RedisConnection connection) {
                return connection.hMGet(rawKey, rawHashKeys);
            }
        }, true);

        return deserializeHashValues(rawValues);
    }

 

这个java.util.Collections.EmptyList没有重写add方法:

    private static class EmptyList<E>
        extends AbstractList<E>
        implements RandomAccess, Serializable {
        private static final long serialVersionUID = 8842843931221139166L;

        public Iterator<E> iterator() {
            return emptyIterator();
        }
        public ListIterator<E> listIterator() {
            return emptyListIterator();
        }

        public int size() {return 0;}
        public boolean isEmpty() {return true;}

        public boolean contains(Object obj) {return false;}
        public boolean containsAll(Collection<?> c) { return c.isEmpty(); }

        public Object[] toArray() { return new Object[0]; }

        public <T> T[] toArray(T[] a) {
            if (a.length > 0)
                a[0] = null;
            return a;
        }

        public E get(int index) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }

        public boolean equals(Object o) {
            return (o instanceof List) && ((List<?>)o).isEmpty();
        }

        public int hashCode() { return 1; }

        @Override
        public boolean removeIf(Predicate<? super E> filter) {
            Objects.requireNonNull(filter);
            return false;
        }
        @Override
        public void replaceAll(UnaryOperator<E> operator) {
            Objects.requireNonNull(operator);
        }
        @Override
        public void sort(Comparator<? super E> c) {
        }

        // Override default methods in Collection
        @Override
        public void forEach(Consumer<? super E> action) {
            Objects.requireNonNull(action);
        }

        @Override
        public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); }

        // Preserves singleton property
        private Object readResolve() {
            return EMPTY_LIST;
        }
    }

 

时间: 2024-10-24 21:03:10

DefaultHashOperations multiget的一个坑的相关文章

MySQL JDBC的queryTimeout的一个坑

遇到一个MySQL JDBC执行execute方法时指定queryTimeout的坑,比较恶心,算是它的BUG,也可以不算,^_^,为啥这么说?看一下下面的解释: 现象: 用同一个Connection执行大批量SQL的时候,导致了OOM现象. 细节现象描述: 1.SQL是从某个存储设备上拿到的,不会直接占用大量的内存,每次只会取最多1千条数据过去,也会判定容量不超过多少M. 2.每一批SQL执行会单独创建Statement对象,执行一批SQL后,会将这个Statement关闭掉. 3.SQL语句

罗永浩:每一个情怀都是一个坑

摘要: 今天下午两点半,罗永浩在北京发布了可能是最后一期一个理想主义者的创业故事的主题演讲,反思了自己进入手机市场之后的的创业经历.在发布会上,罗永浩把锤子科技两年来遇到 今天下午两点半,罗永浩在北京发布了可能是最后一期"一个理想主义者的创业故事"的主题演讲,反思了自己进入手机市场之后的的创业经历.在发布会上,罗永浩把"锤子科技"两年来遇到的为题归因于两点:供应链生产和与媒体关系. 每一个情怀都是一个坑 罗永浩回顾过去半年锤子手机Smartisan T1生产中遇到的

Javascript之旅——第八站:说说instanceof踩了一个坑

原文:Javascript之旅--第八站:说说instanceof踩了一个坑 前些天写js遇到了一个instanceof的坑,我们的页面中有一个iframe,我在index页面中计算得到了一个array,然后需要传递到Flight页面 这个嵌套的iframe中的一个函数(SearchFlight)中,作为防御性编程,我需要在SearchFlight函数中进行参数检测,也就是判断过来的参数一 定是Array类型.   一:抛出问题 举个例子,下面有两个页面. Index.html页面 1 <!DO

罗永浩疑似最后一场主题演讲:每一个情怀都是一个坑

罗永浩把"锤子科技"两年来遇到的问题归因于两点:供应链生产和与媒体关系.目前锤子手机的销量累计为 122063 部. 近日罗永浩在北京发布了可能是最后一场"一个理想主义者的创业故事"的主题演讲,反思了自己进入手机市场之后的的创业经历.在发布会上,罗永浩把"锤子科技"两年来遇到的问题归因于两点:供应链生产和与媒体关系. 每一个情怀都是一个坑 罗永浩回顾过去半年锤子手机 Smartisan T1 生产中遇到的问题,承认问题首先出在自己身上: 锤子手机

iOS 7 跳过的一个坑又掉里了 - 图片渲染模式

iOS 7 跳过的一个坑又掉里了 - 图片渲染模式 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 导航栏按钮以及标签栏按钮的图片,在 iOS 7 中均会默认以蓝色渲染高亮,以灰色渲染正常状态颜

对象题目的一个坑 理解Javascript对象_javascript技巧

这一篇的例子,主要是来引起对Javascript对象的理解及注意的.其实是一种面试时的一个坑,实际项目中也是很少用得到,但是为了提高警惕性,我们来看这个例子: 代码名称 var first = {}; var second = {k:"second"}; var third = {k:"third"}; first[second] = 100; first[third] = 200; console.log(first[second])//这里会输出什么内容呢? 如

老罗最后的演讲:每一个情怀都是一个坑

今天下午两点半,罗永浩在北京发布了可能是最后一期"一个理想主义者的创业故事"的主题演讲,反思了自己进入手机市场之后的的创业经历.在发布会上,罗永浩把"锤子科技"两年来遇到的为题归因于两点:供应链生产和与媒体关系. 每一个情怀都是一个坑 罗永浩回顾过去半年锤子手机 T1 生产中遇到的问题,承认问题首先出在自己身上: 锤子手机的很多细节,还有一些小的元器件制造,之前钱晨博士都警告过我要考虑可行性和风险.能制造出来和能量产是两个概念.但是我那时候不以为然. 罗永浩当时在微

最近用Timer踩了一个坑,分享一下避免别人继续踩

最近做一个小项目,项目中有一个定时服务,需要向对方定时发送数据,时间间隔是1.5s,然后就想到了用C#的Timer类,我们知道Timer 确实非常好用,因为里面有非常人性化的start和stop功能,在Timer里面还有一个Interval,就是用来设置时间间隔,然后时间间隔到了就会触 发Elapsed事件,我们只需要把callback函数注册到这个事件就可以了,如果Interval到了就会触发Elapsed,貌似一切看起来很顺其自然,但是 有一点一定要注意,callback函数本身执行也是需要

EDB分区表的又一个“坑”

下周有一个应用上线,其中涉及一个夜维删除逻辑的应用,大体功能是按照时间删除一张表的历史数据,这张表的主键是另外一张时间分区表的外键,使用的是EDB(9.2)数据库,这次测试就意外发现了一个说是隐藏,也不算隐藏,至少和Oracle分区表有很大不同的地方,或者可以称他为KENG,"坑". P.S. 这里不是贬低EDB,毕竟能做到和Oracle最相近并不容易.但就分区这个功能,已经不是第一次碰见"坑"了,可能对EDB来说不公平,也许这个功能就是这么设计的,但至少从Orac