SpringBoot高级篇Redis之Hash数据结构使用姿势

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis的五大数据结构,前面讲述了String和List的使用姿势,而Hash数据结构,也是比较常用的,接下来看下hash数据结构的读取,删除,塞入的基本使用姿势

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


I. 基本使用



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


  • 181109-SpringBoot高级篇Redis之List数据结构使用姿势


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);
}



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
16天前
|
XML JSON NoSQL
Redis的常用数据结构之字符串类型
Redis的常用数据结构之字符串类型
19 0
|
23天前
|
存储 消息中间件 NoSQL
Redis数据类型详解:选择合适的数据结构优化你的应用
Redis数据类型详解:选择合适的数据结构优化你的应用
|
24天前
|
NoSQL Java Redis
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
266 0
|
1天前
|
存储 NoSQL 算法
Redis入门到通关之Redis数据结构-Hash篇
Redis入门到通关之Redis数据结构-Hash篇
10 1
|
1天前
|
存储 NoSQL Redis
Redis入门到通关之Redis数据结构-List篇
Redis入门到通关之Redis数据结构-List篇
|
1天前
|
存储 NoSQL 安全
Redis入门到通关之Redis数据结构-String篇
Redis入门到通关之Redis数据结构-String篇
|
1天前
|
存储 NoSQL Redis
Redis入门到通关之数据结构解析-SkipList
Redis入门到通关之数据结构解析-SkipList
|
1天前
|
存储 NoSQL 安全
Redis入门到通关之数据结构解析-动态字符串SDS
Redis入门到通关之数据结构解析-动态字符串SDS
|
1天前
|
存储 NoSQL Java
Redis入门到通关之数据结构解析-Dict
Redis入门到通关之数据结构解析-Dict
|
1天前
|
存储 缓存 NoSQL
Redis入门到通关之Hash命令
Redis入门到通关之Hash命令