栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

redisTemplate批量新增hash

redisTemplate批量新增hash

需求:工作中使用kafka接收数据,需要批量对redis中的hash操作,而redisTemplate并没有提供相应的方法,里面对于批量插入操作,只有一个

public void putAll(K key, Map m) {
        if (!m.isEmpty()) {
            byte[] rawKey = this.rawKey(key);
            Map hashes = new linkedHashMap(m.size());
            Iterator var5 = m.entrySet().iterator();

            while(var5.hasNext()) {
                Entry entry = (Entry)var5.next();
                hashes.put(this.rawHashKey(entry.getKey()), this.rawHashValue(entry.getValue()));
            }

            this.execute((connection) -> {
                connection.hMSet(rawKey, hashes);
                return null;
            });
        }
    }

这显然不是我想要的,我想要的是批量对1000个hash操作,而这样我还是要for循环走1000次连接。在网上找了半天没有找到对应的办法后,我参考这个写法,写了一个自己的方法。代码如下:

@SpringBootTest
class SpringbootRedisApplicationTests {

    @Test
    void contextLoads() {
        RedisTemplate redisTemplate = (RedisTemplate) SpringContextUtil.getBean("redisTemplate");
        RedisSerializer keySerializer = redisTemplate.getKeySerializer();
        RedisSerializer hashKeySerializer = redisTemplate.getHashKeySerializer();
        RedisSerializer hashValueSerializer = redisTemplate.getHashValueSerializer();
        Map> map = new HashMap<>();
        Map aMap = new HashMap<>();
        aMap.put("st",1);
        aMap.put("time", "2021-12-1");
        for (int i = 0; i < 1000; i++) {
            map.put(i+"", aMap);
        }

        redisTemplate.executePipelined((RedisCallback) connection->{
            Iterator>> iterator = map.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry> next = iterator.next();

                byte[] rawKey = keySerializer.serialize(next.getKey());

                Map hashes = new linkedHashMap(next.getValue().size());
                Iterator var5 = next.getValue().entrySet().iterator();

                while(var5.hasNext()) {
                    Map.Entry entry = (Map.Entry)var5.next();
                    hashes.put(hashKeySerializer.serialize(entry.getKey()),
                            hashValueSerializer.serialize(entry.getValue()));
                }
                // 这里可以改成你想要的操作,比如删除或者根据条件对应操作之类的
                connection.hMSet(rawKey, hashes);
            }
            return null;
        });

    }

}

我这是在测试类里面写的,同行们可以粘到自己的工具类里面去,传参是一个Map>就行了,为了严谨,防止序列化出现问题,我又进行了取的测试

// 随便取出试用
Map map = (Map)redisTemplate.opsForHash().entries("100");
System.out.println(map);

发现没有问题,这样我们就可以只用一次连接批量对hash操作了。

有疑问可以在评论区交流,作者看见会回复。

如需转载,请一定声明原处。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/629312.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号