zoukankan      html  css  js  c++  java
  • 关于RedisTemplate的map存储踩坑记录

    现在需要在Redis中存储一个map,使用RedisTemplate 建立链接后,执行以下代码:

    //cacheKey  缓存key
    Map<String,String> map = new HashMap<String,String>();
    map.put("a","1");
    map.put("b","2");
    map.put("c","3");
    template.boundHashOps(cacheKey).putAll(map);

      发现Redis存储数据成功。

        现在想要修改map中的数据,当前需要批量修改 将 key = a/b 的数据value修改为3;

    还是使用上面的逻辑,执行成功,数据变更。

    现在想要把key=a的数据删除,写了如下代码:

    Map<String,String> map = new HashMap<String,String>();
    map.put("b","2");
    map.put("c","3");
    template.boundHashOps(cacheKey).putAll(map);
    

      发现Redis中当前cacheKey对应的数据还是3条记录,后面查看源码:

     public void putAll(K key, Map<? extends HK, ? extends HV> m) {
            if (!m.isEmpty()) {
                byte[] rawKey = this.rawKey(key);
                Map<byte[], byte[]> hashes = new LinkedHashMap(m.size());
                Iterator var5 = m.entrySet().iterator();
    
                while(var5.hasNext()) {
                    Entry<? extends HK, ? extends HV> entry = (Entry)var5.next();
                    hashes.put(this.rawHashKey(entry.getKey()), this.rawHashValue(entry.getValue()));
                }
    
                this.execute((connection) -> {
                    connection.hMSet(rawKey, hashes);
                    return null;
                }, true);
            }
        }

    putAll方法只对传入的map对应key做了处理,并不是对整个缓存的key做覆盖,只能做追加和修改。

    所以需要使用hdel删除对应key:

    template.boundHashOps(cacheKey).delete(needRemoveKeys.toArray());
    

      

  • 相关阅读:
    flask 文件上传(单文件上传、多文件上传)--
    flask 自定义验证器(行内验证器、全局验证器) --
    flask 使用宏渲染表单(包含错误信息) --
    flask 在模板中渲染错误消息 --
    flask 在视图函数中验证表单 --
    flask 处理表单数据 --
    flask 在模板中渲染表单 --
    flask 使用Flask-WTF处理表单 --
    flask 表单
    iPad适合写作吗
  • 原文地址:https://www.cnblogs.com/wangzun/p/13397739.html
Copyright © 2011-2022 走看看