前言

这一篇文章将讲述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;
}
  1. 首先是获得自增id

  2. 然后将id存入到前端传过来的json对象中

  3. 调用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查询多个会不方便些,步骤如下

  1. 获取相关的key
  2. 循环查找key相关的数据
  3. 将查询出来的结果添加到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的字符串长度

建议学习的人最好每个命令都去敲下,加深印象。下面诗句送给你们。

纸上得来终觉浅,绝知此事要躬行。————出自《冬夜读书示子聿》

redis系列:通过通讯录案例学习hash命令的更多相关文章

  1. redis系列:通过文章点赞排名案例学习sortedset命令

    前言 这一篇文章将讲述Redis中的sortedset类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/ ...

  2. redis系列:通过共同好友案例学习set命令

    前言 这一篇文章将讲述Redis中的set类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/learnW ...

  3. redis系列:通过队列案例学习list命令

    前言 这一篇文章将讲述Redis中的list类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/learn ...

  4. redis系列:通过日志案例学习string命令

    前言 该文章将通过一个小demo将讲述Redis中的string类型命令.demo将以springboot为后台框架快速开发,iview前端框架进行简单的页面设计,为了方便就不使用DB存储数据了,直接 ...

  5. Python操作redis系列以 哈希(Hash)命令详解(四)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1. Hset 命令用于 ...

  6. Redis系列(二):Redis的数据类型及命令操作

    原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...

  7. Redis系列(二):Redis的5种数据结构及其常用命令

    上一篇博客,我们讲解了什么是Redis以及在Windows和Linux环境下安装Redis的方法, 没看过的同学可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. 本篇博客我们来 ...

  8. Redis系列之-—Redis-cli命令总结【转】

    Redis-cli命令最新总结 参考资料: http://redisdoc.com/ 或者 http://doc.redisfans.com http://redis.io/commands 一. 进 ...

  9. Redis系列-存储hash主要操作命令

    Redis系列-存储篇hash主要操作函数小结 hash是一些列key value(field value)的映射表.常常用其存储一些对象实例.相对于把一个对象的各个字段存储为string,存储为ha ...

随机推荐

  1. <linux硬件及硬盘分区>关于硬盘的规划和使用细节

    ps:期末考试 终于结束了,这下我也终于有时间开始继续经营我的博客.这个学期上的一些课真的非常有用,感觉很多课程细地讲都可以写成非常精致的技术博文,比如流水线技术,数据库的一些技术,大学里的考试考的内 ...

  2. 吴恩达机器学习笔记(四) —— BP神经网络

    主要内容: 一.模型简介 二.一些变量所代表的含义 三.代价函数 四.Forward Propagation 五.Back Propagation 六.算法流程 待解决问题: 视频中通过指出:当特征变 ...

  3. CSS整体布局

    主要内容: 一.外边距margin与填充padding 二.浮动float与显示display 三.主布局 四.定位方式posotion 一.外边距margin与填充padding 1.margin设 ...

  4. Docker学习(二)

    docker run ubuntu /bin/echo 'Hello world' docker run -t -i ubuntu /bin/bash docker run  命令运行一个容器 -t ...

  5. JAVA- 数据库连接池原理

    第一次Java程序要在MySQL中执行一条语句,那么就必须建立一个Connection对象,代表了与MySQL数据库的连接通过直接发送你要执行的SQL语句之后,就会调用Connection.close ...

  6. php一维数组的创建

    php一维数组的创建 (1)通过array函数声明数组 使用array 函数定义数组,该函数返回通过所接受接收的参数建立的数组.array 函数使用的格式如下. $arry_name = array( ...

  7. java - BigDecimal的format()方法和setScale()方法格式字符串

    1.BigDecimal.setScale()方法用于格式化小数点 setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接删 ...

  8. 06 - Django应用第三步

    知识点 1) 编写urls 配合include()的URL查找过程 获取正则抓取的值并命名, 给url取名 2) 模板的编写 for循环的遍历 用点的方式执行函数, 不带括号 3) 视图函数的编写 H ...

  9. 8个Javascript小技巧,让你写的代码有腔调

    如果你想确保你的JavaScript在大多数浏览器和移动设备中都可以工作,那么我从大漠等大神指导,原来可以使用f2etest,也可以使用Endtest,browserstack等 1. 使用 + 字符 ...

  10. Ffmpeg移植S3C2440

    Ffmpeg移植过程: FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证.它的移植同样遵循LGPL或GPL移植方法:configure.make.make ...