特性

Hash 是一个 String 类型的 field(域)和 value(值)的映射表,Hash 特别适合存储对象。Redis 中每个 Hash 可以存储 2^32-1 个键值对(4,294,967,295)。

使用场景

  • 缓存对象数据
  • 缓存购物车信息
  • 缓存商品信息
  • 计数器

命令使用

命令 描述 时间复杂度
HDEL 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略 O(N), N 为要删除的域的数量
HEXISTS 查看哈希表 key 中,给定域 field 是否存在 O(1)
HSET 返回哈希表 key 中给定域 field 的值 O(1)
HGETALL 返回哈希表 key 中,所有的域和值 O(N), N 为哈希表的大小
HINCRBY 为哈希表 key 中的域 field 的值加上增量 increment O(1)
HINCRBYFLOAT 为哈希表 key 中的域 field 加上浮点数增量 increment O(1)
HKEYS 返回哈希表 key 中的所有域 O(N), N 为哈希表的大小
HLEN 返回哈希表 key 中域的数量 O(1)
HMGET 返回哈希表 key 中,一个或多个给定域的值 O(N), N 为给定域的数量
HMSET 同时将多个 field-value (域-值)对设置到哈希表 key O(N), Nfield-value 对的数量
HSET 将哈希表 key 中的域 field 的值设为 value O(1)
HSETNX 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 O(1)
HVALS 返回哈希表 key 中所有域的值 O(N), N 为哈希表的大小
HSCAN 用于迭代哈希表中的键值对 O(N), N 为哈希表的大小

说明

HINCRBY:

为哈希表 key 中的域 field 的值加上增量 increment

增量也可以为负数,相当于对给定域进行减法操作。

如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。

如果域 field 不存在,那么在执行命令前,域的值被初始化为 0

对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。

本操作的值被限制在 64 位(bit)有符号数字表示之内。

HINCRBYFLOAT

如果哈希表中没有域 field ,那么 HINCRBYFLOAT 会先将域 field 的值设为 0 ,然后再执行加法操作。

如果键 key 不存在,那么HINCRBYFLOAT 会先创建一个哈希表,再创建域 field ,最后再执行加法操作。

当以下任意一个条件发生时,返回一个错误:

  • field 的值不是字符串类型(因为 redis 中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型)
  • field 当前的值或给定的增量 increment 不能解释(parse)为双精度浮点数(double precision floating point number)

HINCRBYFLOAT 命令的详细功能和 INCRBYFLOAT 命令类似,请查看 INCRBYFLOAT 命令获取更多相关信息。

HMGET

如果给定的域不存在于哈希表,那么返回一个 nil 值。

因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。

HMSET

此命令会覆盖哈希表中已存在的域。

如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。

HSET

如果 key 不存在,一个新的哈希表被创建并进行 HMSET 操作。

如果域 field 已经存在于哈希表中,旧值将被覆盖。

HSETNX

将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。

若域 field 已经存在,该操作无效。

如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。

RedisTemplate 基本使用

添加

通过put方法添加元素

redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");

通过putAll方法以map集合的形式添加

Map<String, String> newMap = new HashMap<>();
newMap.put("6","6号");
newMap.put("7","7号");
newMap.put("8","8号");
newMap.put("9","9号");
redisTemplate.opsForHash().putAll("hash:key",newMap);

查询

通过values(H key)方法获取变量中的hashMap值

redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
List<Object> hashList = redisTemplate.opsForHash().values("hash:key");
//输出结果..............hashList:[1号, 2号, 3号]

通过entries(H key)方法获取变量中的键值对

redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
Map<Object,Object> map = redisTemplate.opsForHash().entries("hash:key");
//输出结果..............map:{1=1号, 2=2号, 3=3号}

通过get(H key, Object hashKey)方法获取map键的值

redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");Object mapValue = redisTemplate.opsForHash().get("hash:key","1");
//输出结果..............mapValue:1号

通过hasKey(H key, Object hashKey)方法判断变量中是否存在map键

redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");boolean hashKeyBoolean = redisTemplate.opsForHash().hasKey("hash:key","1");
//输出结果..............hashKeyBoolean:true
hashKeyBoolean = redisTemplate.opsForHash().hasKey("hash:key","111");
//输出结果..............hashKeyBoolean:false

通过keys(H key)方法获取变量中的键数量

redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");Set<Object> keySet = redisTemplate.opsForHash().keys("hash:key");
//输出结果..............keySet:3

通过size(H key)方法获取变量的数量

redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");
long hashLength = redisTemplate.opsForHash().size("hash:key");//输出结果..............hashLength:3

通过multiGet(H key, Collection hashKeys)方法以集合的方式获取变量中的值

redisTemplate.opsForHash().put("hash:key","1","1号");
redisTemplate.opsForHash().put("hash:key","2","2号");
redisTemplate.opsForHash().put("hash:key","3","3号");List<Object> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
List mapValueList = redisTemplate.opsForHash().multiGet("hash:key",list);
//输出结果..............mapValueList:[1号, 2号, 3号]

通过scan(H key, ScanOptions options)方法获取匹配键值对

匹配获取键位map1的键值对,不能模糊匹配;

ScanOptions.NONE为获取全部键对;

redisTemplate.opsForHash().put("hash:key", "1", "1号");
redisTemplate.opsForHash().put("hash:key", "2", "2号");
redisTemplate.opsForHash().put("hash:key", "3", "3号");Cursor<Map.Entry<Object, Object>> cursor = redisTemplate.opsForHash().scan("hash:key", ScanOptions.scanOptions().match("1").build());
while (cursor.hasNext()) {Map.Entry<Object, Object> entry = cursor.next();log.info("..............entry:" + entry.getKey() + "---->" + entry.getValue());
}
//输出结果..............entry:1---->1号//获取全部键值对
Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan("hash:key",ScanOptions.NONE);

通过increment(H key, HK hashKey, double delta)方法使变量中的键以值的大小进行自增长

redisTemplate.opsForHash().put("hash:key", "1", "1号");
redisTemplate.opsForHash().put("hash:key", "2", "2号");
redisTemplate.opsForHash().put("hash:key", "3", "3号");double hashIncDouble = redisTemplate.opsForHash().increment(hash_key, "4", 3);
//输出结果..............hashIncDouble:3.0
hashIncDouble = redisTemplate.opsForHash().increment(hash_key, "4", 3);
//输出结果..............hashIncDouble:6.0Map map = redisTemplate.opsForHash().entries(hash_key);
//输出结果..............map:{1=1号, 2=2号, 3=3号, 4=6}

通过increment(H key, HK hashKey, long delta)方法使变量中的键以值的大小进行自增长

redisTemplate.opsForHash().put("hash:key", "1", "1号");
redisTemplate.opsForHash().put("hash:key", "2", "2号");
redisTemplate.opsForHash().put("hash:key", "3", "3号");long hashIncLong = redisTemplate.opsForHash().increment(hash_key, "5", 6);
//输出结果..............hashIncLong:6
hashIncLong = redisTemplate.opsForHash().increment(hash_key, "5", 6);
//输出结果..............hashIncLong:12Map map = redisTemplate.opsForHash().entries(hash_key);
//输出结果..............map:{1=1号, 2=2号, 3=3号, 5=12}

修改

通过putIfAbsent(H key, HK hashKey, HV value)方法添加不存在于变量中的键值对

当前key存在时,则不会修改key的值

//当前key存在时,则不会修改key的值
redisTemplate.opsForHash().putIfAbsent("hash:key","1","1号-1");
redisTemplate.opsForHash().putIfAbsent("hash:key","10","10号");
Map map = redisTemplate.opsForHash().entries("hash:key");
//输出结果..............map:{1=1号, 2=2号, 3=3号, 10=10号}

删除

通过delete(H key, Object… hashKeys)方法删除变量中的键值

redisTemplate.opsForHash().put("hash:key", "1", "1号");
redisTemplate.opsForHash().put("hash:key", "2", "2号");
redisTemplate.opsForHash().put("hash:key", "3", "3号");redisTemplate.opsForHash().delete("hash:key", "1", "2");
Map map = redisTemplate.opsForHash().entries("hash:key");
//输出结果..............map:{3=3号}

Redis数据类型-Hash-基本使用相关推荐

  1. Redis数据类型——hash

    简介 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息 需要的存储结构:一个存储空间保存多个键值对数据 hash类型:底层使用哈希表结构实现数据存储 hash存储结构优化 : ...

  2. 【Redis】3. Redis数据类型 Hash

    学习教程 https://www.bilibili.com/video/BV1CJ411m7Gc?p=12 Hash类型 存储的困惑 对象类数据的存储如果具有较为频繁的更新需求操作会显得笨重 hash ...

  3. redis数据类型hash总结

    前言 redis在互联网公司的项目中基本上都会使用到,这得益于redis丰富的数据结构和高效的底层存储结构,接下来会通过几篇文章探讨并总结一些redis在实际项目中的使用 环境准备 window或者l ...

  4. redis数据类型 - Hash类型

    hash类型,是一个string类型的field和value的映射表. hash存放的是键值对,可以很方便的存放对象. 常用操作 hset 设置hash field为指定值,如果key不存在,则先创建 ...

  5. 系统性详解Redis操作Hash类型数据(带源码分析及测试结果)

    1 缘起 系统讲解Redis的Hash类型CURD, 帮助学习者系统且准确学习Hash数据操作, 逐步养成测试的好习惯, 本文较长,Hash的操作比较多,请耐心看, 既可以集中时间看,亦可以碎片时间学 ...

  6. Redis数据类型(hash 类型)

    Redis数据类型(hash 类型) hash 类型及操作 ① 概述 ② 相关命令列表 ③ 命令示例 hash 类型及操作 ① 概述 Redis中的Hash类型可以理解是具有String Key和St ...

  7. Redis 数据类型之(底层解析)

    Redis 数据类型之(底层解析) Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redi ...

  8. Redis 数据类型介绍

    Redis 数据类型介绍 你也许已经知道Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值.也就是说,你不必仅仅把字符串当作键所指向的值.下列这些数据类型都可 ...

  9. redis设置密码和启动 redis数据类型

    Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径.Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象. Redis运行在内存中 ...

  10. Redis之Hash数据结构

    0.前言 redis是KV型的内存数据库, 数据库存储的核心就是Hash表, 我们执行select命令选择一个存储的db之后, 所有的操作都是以hash表为基础的, 下面会分析下redis的hash数 ...

最新文章

  1. 3D Cube计算引擎加速运算
  2. ASP.NET 2.0 绑定高级技巧
  3. SAP实施项目中采购员在非生产性采购申请审批流中的角色安排
  4. 2012体感发展加速,微软再添新对手
  5. Sql Server 数据分页
  6. go语言学习(7)锁
  7. 百度前端fex-team团队面试指南
  8. mysql卸载工具下载_MySQL的卸载、下载与安装
  9. HDU 1402——A * B Problem Plus
  10. 数据库索引优化原理,索引的工作机制
  11. Jquery,Ready函数.
  12. 求1000的阶乘c语言编程,用C语言编写程序,求出1000的阶乘?
  13. eclipse 添加jar (servlet api)
  14. java 接口传数组_Restful接口传递数组参数
  15. 需要在计算机安装msxml版本,Win7安装Office2010提示需要MSXML 6.10.1129.0组件怎么办?...
  16. 植被覆盖指数计算教程(ENVI)
  17. steam同乐无法连接远程计算机,Steam加入远程同乐 这个功能要怎么用
  18. 国内十大白银期货APP最新排名
  19. Lead项目中简单分析卡号的编码规则
  20. 达梦DM单机部署以及日常运维管理

热门文章

  1. access考试素材_Access数据库基础教程素材.doc
  2. b+树时间复杂度_前端大神用的学习笔记:线段树和树状数组
  3. IE9和JPEG-XR:第一印象
  4. 哈工大《微积分》——一元积分学与微分方程
  5. 基于QT的界面框架qcanpool使用教程(废弃)
  6. sqlserver到Oracle,SQLSERVER到ORACLE的数据库迁移
  7. 怎么创建网页?有几种方法
  8. LMS Virtual.Lab二次开发:声学仿真理论基础准备(Python)
  9. win10系统重装win7注意
  10. C++对数函数log()用法