• 欢迎访问 winrains 的个人网站!
  • 本网站主要从互联网整理和收集了与Java、网络安全、Linux等技术相关的文章,供学习和研究使用。如有侵权,请留言告知,谢谢!

Spring Boot 高级篇–Redis(5):Hash数据结构使用姿势

Redis winrains 来源:一灰灰Blog 12个月前 (11-08) 59次浏览

Redis的五大数据结构,前面讲述了String和List的使用姿势,而Hash数据结构,也是比较常用的,接下来看下hash数据结构的读取,删除,塞入的基本使用姿势

I. 基本使用

在开始之前,序列化的指定需要额外处理,上一篇已经提及,相关内容可以参考:

1. 查询元素

hash数据结构和我们理解jdk中的hash差不多,使用的姿势也没什么区别,需要注意的是需要,定位一个元素,需要由缓存的key + hash的key-field

/**
 * 获取hash中field对应的值
 *
 * @param key
 * @param field
 * @return
 */
public String hget(String key, String field) {
    Object val = redisTemplate.opsForHash().get(key, field);
    return val == null ? null : val.toString();
}

2. 添加元素

/**
 * 添加or更新hash的值
 *
 * @param key
 * @param field
 * @param value
 */
public void hset(String key, String field, String value) {
    redisTemplate.opsForHash().put(key, field, value);
}

3. 删除

hash最好的一个地方,我个人感觉就是在删除时特别方便,比如将同类的数据聚集在一个hash中,删除key就可以实现全部都删除,清理数据就比较方便了;除此之外,另外一种就是删除hash中的部分key

/**
 * 删除hash中field这一对kv
 *
 * @param key
 * @param field
 */
public void hdel(String key, String field) {
    redisTemplate.opsForHash().delete(key, field);
}

4. 批量查询

批量查询有两种,一个是全部捞出来,一个是捞出指定key的相关数据

public Map<String, String> hgetall(String key) {
    return redisTemplate.execute((RedisCallback<Map<String, String>>) con -> {
        Map<byte[], byte[]> result = con.hGetAll(key.getBytes());
        if (CollectionUtils.isEmpty(result)) {
            return new HashMap<>(0);
        }
        Map<String, String> ans = new HashMap<>(result.size());
        for (Map.Entry<byte[], byte[]> entry : result.entrySet()) {
            ans.put(new String(entry.getKey()), new String(entry.getValue()));
        }
        return ans;
    });
}
public Map<String, String> hmget(String key, List<String> fields) {
    List<String> result = redisTemplate.<String, String>opsForHash().multiGet(key, fields);
    Map<String, String> ans = new HashMap<>(fields.size());
    int index = 0;
    for (String field : fields) {
        if (result.get(index) == null) {
            continue;
        }
        ans.put(field, result.get(index));
    }
    return ans;
}

5. 自增

hash的value如果是数字,提供了一个自增的方式,和String中的incr/decr差不多的效果

// hash 结构的计数
public long hincr(String key, String field, long value) {
    return redisTemplate.opsForHash().increment(key, field, value);
}

6. hash + list

hash的value如果另外一种场景就是数组,目前没有找到特别友好的操作方式,只能在业务层进行兼容

/**
 * value为列表的场景
 *
 * @param key
 * @param field
 * @return
 */
public <T> List<T> hGetList(String key, String field, Class<T> obj) {
    Object value = redisTemplate.opsForHash().get(key, field);
    if (value != null) {
        return JSONObject.parseArray(value.toString(), obj);
    } else {
        return new ArrayList<>();
    }
}
public <T> void hSetList(String key, String field, List<T> values) {
    String v = JSONObject.toJSONString(values);
    redisTemplate.opsForHash().put(key, field, v);
}

作者:一灰灰Blog

来源:http://spring.hhui.top/spring-blog/2018/12/02/181202-SpringBoot%E9%AB%98%E7%BA%A7%E7%AF%87Redis%E4%B9%8BHash%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/


版权声明:文末如注明作者和来源,则表示本文系转载,版权为原作者所有 | 本文如有侵权,请及时联系,承诺在收到消息后第一时间删除 | 如转载本文,请注明原文链接。
喜欢 (1)