hash redis springboot_SpringBoot系列教程之RedisTemplate Hash数据结构使用教程

本文详细介绍了如何在SpringBoot中利用RedisTemplate操作Hash数据结构,包括查询、添加、删除、批量查询、自增等操作,并讨论了Hash结构与List结合的场景,提供了一灰灰个人博客的链接以供进一步学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 hgetall(String key) {

return redisTemplate.execute((RedisCallback>) con -> {

Map result = con.hGetAll(key.getBytes());

if (CollectionUtils.isEmpty(result)) {

return new HashMap<>(0);

}

Map ans = new HashMap<>(result.size());

for (Map.Entry entry : result.entrySet()) {

ans.put(new String(entry.getKey()), new String(entry.getValue()));

}

return ans;

});

}

public Map hmget(String key, List fields) {

List result = redisTemplate.opsForHash().multiGet(key, fields);

Map ans = new HashMap<>(fields.size());

int index = -1;

for (String field : fields) {

++index;

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 List hGetList(String key, String field, Class obj) {

Object value = redisTemplate.opsForHash().get(key, field);

if (value != null) {

return JSONObject.parseArray(value.toString(), obj);

} else {

return new ArrayList<>();

}

}

public void hSetList(String key, String field, List values) {

String v = JSONObject.toJSONString(values);

redisTemplate.opsForHash().put(key, field, v);

}

II. 其他

0. 项目

1. 一灰灰Blog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

QQ: 一灰灰/3302797840

3. 扫描关注

一灰灰blog

知识星球

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值