redis系列:通过通讯录案例学习hash命令
前言
这一篇文章将讲述Redis中的hash类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了。
项目Github地址:https://github.com/rainbowda/learnWay/tree/master/learnRedis/case-hash
案例
demo功能是通讯录,整个demo的大致页面如下
准备工作
首先定义一个key的前缀,已经存储自增id的key
private static final String CONTACTS_KEY_PREFIX = "contacts:";
private static final String CONTACTS_ID_KEY = "contactsID";
通讯录相关的key将会以contacts:1、contacts:2、contacts:3的形式存储
redis操作对象
private RedisTemplate redisTemplate;
//string 命令操作对象
private ValueOperations valueOperations;
//hash 命令操作对象
private HashOperations hashOperatio
疑惑
如果读者和我一样是学Java的,刚听到hash时的第一反应是这个不是一个算法吗?当时我也是这样想的。那么先来看看hash在Redis中的结构,如下图(图片来源于Redis in Action)。
如果图看不懂的,我再来介绍下。其实Redis中的hash结构就和mysql中的表类似,把key当做表名,一张表中有多个列名(sub-key),每个列有自己的值(value),然后这张表只能存放一条数据。不过,这里的hash结构不会像mysql中固定好的,它可以很方便的增加删除列,例如增加sub-key3删除sub-key1.
新增
命令介绍
先来看看hash中关于新增的一些命令
命令 | 用例 | 描述 |
---|---|---|
HSET | HSET key field value | 设置 key 指定的哈希集中指定字段的值。 |
HSETNX | HSETNX key field value | 当field不存在时,才能成功设置值 |
HMSET | HMSET key field value [field value ...] | 设置 key 指定的哈希集中指定字段的值(多个) 。 |
接下来看看demo中新增的功能,下图中点击+按钮,然后在弹出框中填入name和phone属性,点击提交后整个新增流程结束。
来看看后台的方法
@RequestMapping(value = "/add",method = RequestMethod.POST)
public boolean add(@RequestBody JSONObject contacts){
//获取自增id
Long contactsId = valueOperations.increment(CONTACTS_ID_KEY, 1);
contacts.put("id",String.valueOf(contactsId));
//json转map,然后存入redis
hashOperations.putAll(CONTACTS_KEY_PREFIX+contactsId,contacts.getInnerMap());
return true;
}
- 首先是获得自增id
- 然后将id存入到前端传过来的json对象中
- 调用hashOperations对象的putAll方法将对象传入到Redis中。(putAll方法其实是调用了hmset命令,源码如下)
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()));
}
//调用hMSet
this.execute((connection) -> {
connection.hMSet(rawKey, hashes);
return null;
}, true);
}
}
列表查询
命令介绍
同样先看看相关的获取值命令
命令 | 用例 | 描述 |
---|---|---|
HGET | HGET key field | 返回 key 指定的哈希集中该字段所关联的值 |
HGETALL | HGETALL key | 返回 key 指定的哈希集中所有的字段和值。 |
HKEYS | HKEYS key | 返回 key 指定的哈希集中所有字段的名字。 |
HMGET | HMGET key field [field ...] | 返回 key 指定的哈希集中指定字段的值。 |
HVALS | HVALS key | 返回 key 指定的哈希集中所有字段的值。 |
HSCAN | 用于迭代Hash类型中的键值对。 |
HGET和HGETALL命令
来看看HGET和HGETALL在redis客户端和java中是如何操作的
redis客户端执行的命令如下
hset key field1 "Hi"
hset key field1 "Hello"
hsetnx key field1 "Hello"
hsetnx key field2 " redis"
hget key field1
hgetall key
执行结果如下
下面是java代码
@Test
public void hGetAll() {
jedis.hset("key", "field1", "Hi");
redisTemplate.opsForHash().put("key", "field1", "Hello");
System.out.println(jedis.hsetnx("key", "field1", "Hello"));
System.out.println(redisTemplate.opsForHash().putIfAbsent("key", "field2", "Hello"));
System.out.println(jedis.hget("key", "field1"));
System.out.println(jedis.hgetAll("key"));
//spring redisTemplate
System.out.println(redisTemplate.opsForHash().get("key", "field1"));
System.out.println(redisTemplate.opsForHash().entries("key"));
}
HKEYS
redis客户端执行的命令如下
hset hashKey field1 value1
hset hashKey field2 value2
hkeys hashKey
执行结果如下
下面是java代码
@Test
public void hKeys() {
jedis.hset("hashKey", "field1", "value1");
jedis.hset("hashKey", "field2", "value2");
System.out.println(jedis.hkeys("hashKey"));
//spring redisTemplate
System.out.println(redisTemplate.opsForHash().keys("hashKey"));
/**
* 注:两次结果返回的顺序是不一样的,
* 因为jedis.hkeys返回的是HashSet(内部使用HashMap)
* redisTemplate.opsForHash().keys返回的是LinkHashSet(内部使用LinkHashMap)
*/
}
HVALS
redis客户端执行的命令如下
hmset key field1 value1 field2 value2 field3 value3
hvals key
执行结果如下
下面是java代码
@Test
public void hVals() {
Map<String, String> map = new HashMap<>(3);
map.put("field1", "value1");
map.put("field2", "value2");
map.put("field3", "value3");
jedis.hmset("key", map);
System.out.println(jedis.hvals("key"));
//spring redisTemplate
System.out.println(redisTemplate.opsForHash().values("key"));
}
查询方法代码
接着写个查询方法,将新增的内容查询出来
@RequestMapping(value = "/getList",method = RequestMethod.GET)
public List getList(){
List list = new ArrayList();
//获取联系人的keys
Set<String> keys = redisTemplate.keys(CONTACTS_KEY_PREFIX+"*");
for (String key: keys) {
Map entries = hashOperations.entries(key);
list.add(entries);
}
return list;
}
这个hash查询多个会不方便些,步骤如下
- 获取相关的key
- 循环查找key相关的数据
- 将查询出来的结果添加到list中,返回
添加属性
来看看代码
@RequestMapping(value = "/addAttr", method = RequestMethod.POST)
public boolean addAttr(@RequestBody JSONObject contacts){
String id = contacts.getString("id");
String fieldName = contacts.getString("fieldName");
String fieldValue = contacts.getString("fieldValue");
hashOperations.put(CONTACTS_KEY_PREFIX+id, fieldName, fieldValue);
return true;
}
其实就是用hset命令进行插入
hset contacts:1 address 北京9527号
删除属性
命令介绍
命令 | 用例 | 描述 |
---|---|---|
HDEL | HDEL key field [field ...] | 从 key 指定的哈希集中移除指定的域 |
redis客户端执行的命令如下
hset hDelKey filed1 filedValue1
hdel hDelKey filed1
hdel hDelKey filed1
执行结果如下
现在来看看demo中的删除属性
代码如下
@RequestMapping(value = "/delAttr", method = RequestMethod.POST)
public boolean delAttr(@RequestBody JSONObject contacts){
String id = contacts.getString("id");
String fieldName = contacts.getString("fieldName");
hashOperations.delete(CONTACTS_KEY_PREFIX+id, fieldName);
return true;
}
其他命令
命令 | 用例 | 描述 |
---|---|---|
HEXISTS | HEXISTS key field | 返回hash里面field是否存在 |
HINCRBY | HINCRBY key field increment | 增加 key 指定的哈希集中指定字段的数值 |
HINCRBYFLOAT | HINCRBYFLOAT key field increment | 同上,加的是浮点型 |
HLEN | HLEN key | 返回 key 指定的哈希集包含的字段的数量。 |
HSTRLEN | HSTRLEN key field | 返回hash指定field的value的字符串长度 |
建议学习的人最好每个命令都去敲下,加深印象。下面诗句送给你们。
纸上得来终觉浅,绝知此事要躬行。————出自《冬夜读书示子聿》

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
权威报告:Java遭Kotlin威胁,2018程序员应该何去何从
最近,Packt 发布了“2018 开发者技能提升报告”,此报告调查了800多名开发人员和技术专家,从应用开发、web开发、安全和系统管理,以及数据四个方面对开发者进行了调查,旨在了解软件开发人员的工具使用情况和技能趋势。 Kotlin是Java强有力的竞争者 在此报告中,Java在编程语言中仍然占据着主导的地位,但是Kotlin可能很快替代Java在移动开发第一位置。在8000名接受调查的用户中,71%的受访者表示,Kotlin是Java强有力的竞争者。 Kotlin 于2011年出现,但直到最近才开始真正吸引工程师的特别青睐。Google 在 2017 年宣布 Kotlin 在 Android Studio 3.0 中完全获得支持,使之成为 Android 开发语言之一。预计到今年年底,Kotlin 将与 Java 展开激烈竞争。 B
-
下一篇
程序员都秃顶?Python创始人笑了,养生还得学这门语言
程序员爱脱发,是不争的事实,经常面对电脑,工作压力大,都会导致脱发的产生。正所谓“聪明绝顶”,越厉害的程序员,谢顶的可能性就越大。那么,我们看看世界上顶级的程序员们,看看是否能从中找到规律。 这位大牛,很多人都认识,C语言之父——丹尼斯·里奇。里奇的C语言,养活了世界上成千上万的程序员,可能是对人类做出的贡献太大了,2011年,在乔布斯去世一个礼拜后,上帝带走了他。 里奇的脱发等级在2级到3级之间,发际线比较高,额头也比较大,但头顶部位还是比较浓密的。C语言算不上特别难,看来齐大爷保养的也是非常的棒。 多少程序员要感谢里奇赏了你们饭碗了。 在TIOBE编程语言排行榜上,有这么一门语言,霸占排行榜榜首多年,这门计算机语言,就是Java,詹姆斯·高斯林在1990和他人一起创造了Java,因此他被称为Java之父。 高斯林的脱发等级已经达到了6级,前额部位基本脱落,头顶部位向后扩散,中间仅剩下隔离狭窄的毛发带了。不得不说高斯林是劳心劳力的,Java多么伟大的语言,想要搞定它,还真得多费工夫。 作为Java的兄弟语言,C++同样非常热门,开发游戏、科学计算、网络软件、分布式应用等等,都离不开C...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL数据库在高并发下的优化方案
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果