Redis hash 是一个string类型的field和value的映射表,它的添加、删除操作都是O(1)(平均)。hash特别适用于存储对象,将一个对象存储在hash类型中会占用更少的内存,并且可以方便的存取整个对象。包含键值对的无序散列表。value 只能是字符串,不能嵌套其他类型。

同样是存储字符串,Hash 与 String 的主要区别?
1、把所有相关的值聚集到一个 key 中,节省内存空间
2、只使用一个 key,减少 key 冲突
3、当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU 的消耗

Hash 不适合的场景:
1、Field 不能单独设置过期时间
2、没有 bit 操作
3、需要考虑数据量分布的问题(value 值非常大的时候,无法分布到多个节点)

常用命令:

1.hset hash field value:

  1.1 将哈希表 hash 中域 field 的值设置为 value,如果给定的哈希表并不存在,那么一个新的哈希表将被创建并执行 HSET 操作。

  1.2 如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。

  1.3 返回值:当 HSET 命令在哈希表中新创建 field 域并成功为它设置值时, 命令返回 1,

      如果域 field 已经存在于哈希表, 并且 HSET 命令成功使用新值覆盖了它的旧值, 那么命令返回 0 。

2.hsetnx hash field value:

  2.1 当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value

  2.2 如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。

  2.3 如果哈希表 hash 不存在, 那么一个新的哈希表将被创建并执行 HSETNX 命令。

3. hget hash field: 在默认情况下返回给定域的值。如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 nil 。

4. hexists hash field:测试指定的field是否存在, 在给定域存在时返回 1,在给定域不存在时返回 0 。

5. hdel key field [field ....]:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。

              返回值:被成功移除的域的数量,不包括被忽略的域。

6. hlen key: 返回hash的field数量, 当 key 不存在时,返回 0 。

7. hstrlen key field: 返回哈希表 key 中,与给定域 field 相关联的值的字符串长度(string length)。如果给定的键或者域不存在, 那么命令返回 0 。

8. hincrby key field increment: 指定的hash field加上给定的值

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

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

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

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

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

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

9. hincrbyfloat key field increment:

  9.1 为哈希表 key 中的域 field 加上浮点数增量 increment 。

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

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

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

    9.4.1 域 field 的值不是字符串类型(因为 redis 中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型)

    9.4.2 域 field 当前的值或给定的增量 increment 不能解释(parse)为双精度浮点数(double precision floating point number)

10. hmset key field value [field value …]: 同时设置多个field

              同时将多个 field-value (域-值)对设置到哈希表 key 中。

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

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

11. HMGET key field [field …]:

              返回哈希表 key 中,一个或多个给定域的值。

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

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

12. hkeys key : 返回哈希表 key 中的所有域

       返回值:一个包含哈希表中所有域的表。当 key 不存在时,返回一个空表。

13. hvals key: 返回哈希表 key 中所有域的值。

       返回值:一个包含哈希表中所有值的表。当 key 不存在时,返回一个空表。

14. hgetall key: 返回哈希表 key 中,所有的域和值。在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。

       返回值:以列表形式返回哈希表的域和域的值。若 key 不存在,返回空列表。

应用场景:1.String可以做的事情,Hash都可以做。

     2. 存储对象类型的数据,比如对象或者一张表的数据,比 String 节省了更多 key 的空间,也更加便于集中管理。

     3.购物车   key:用户 id;field:商品 id;value:商品数量。  +1:hincrby。-1:hincrby。删除:hdel。全选:hgetall。商品数:hlen

 

  

redis-Hash(哈希表)的更多相关文章

  1. 2、使用HashOperations操作redis(Hash哈希表)

    文章来源:https://www.cnblogs.com/shiguotao-com/p/10560458.html 方法 c参数 s说明 Long delete(H key, Object... h ...

  2. hash 哈希表 缓存表

    系统初始hash表为空,当外部命令执行时,默认会从 PATH路径下寻找该命令,找到后会将这条命令的路径记录到 hash表中,当再次使用该命令时,shell解释器首先会查看hash 表,存在将执行之,如 ...

  3. Hash 哈希表和算法思路详解

    概述 哈希表是一种可以满足快速查找数据结构,时间复杂度接近O(1). 哈希函数是无限集到有限集的映射. 处理数据量大,查找效率要求高时推荐使用hash容器. 问题: 什么情况下考虑使用哈希容器? 常用 ...

  4. redis:hash哈希类型的操作

    1. hash哈希类型的操作 1.1. hset key field value 语法:hset key field value 作用:把key中field域的值设为value 注:如果没有field ...

  5. redis -hash(哈希.对象)

    hash 用于储存对象,对象的结构为属性.值 值的类型string 增加.修改: 设置单个属性: hset 键 field 值 例如: 设置键 user 的属性name 为 python hset u ...

  6. Redis哈希表总结

    本文及后续文章,Redis版本均是v3.2.8 在文章<Redis 数据结构之dict><Redis 数据结构之dict(2)>中,从代码层面做了简单理解.总感觉思路的不够条理 ...

  7. 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型

    第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...

  8. 纸上谈兵:哈希表(hash table)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! HASH 哈希表(hash table)是从一个集合A到另一个集合B的映射(map ...

  9. C#中使用Redis学习二 在.NET4.5中使用redis hash操作

    上一篇>> 摘要 上一篇讲述了安装redis客户端和服务器端,也大体地介绍了一下redis.本篇着重讲解.NET4.0 和 .NET4.5中如何使用redis和C# redis操作哈希表. ...

  10. 【转】C#中使用Redis学习二 在.NET4.5中使用redis hash操作

    摘要 上一篇讲述了安装redis客户端和服务器端,也大体地介绍了一下redis.本篇着重讲解.NET4.0 和 .NET4.5中如何使用redis和C# redis操作哈希表.并且会将封装的一些代码贴 ...

随机推荐

  1. mysql5.7修改root密码

    use mysql; update mysql.user set authentication_string=password('123456') where user='root'; flush p ...

  2. C:sizeof 运算符

    sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节 sizeof的返回值为size_t size_t类型在32位操作系统下是unsigned int,是一个无 ...

  3. POJ1087 A Plug of UNIX

    你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器(手机,电脑一类的),也有其对应型号:可是不一定用电器就能和插座匹配上,于是宾馆的商店里提供了一些转换器,这些转换器可以 ...

  4. lora

    Lora:特点 距离远,功耗低,不用sim卡和流量,秒级实时性,每秒几十kbps. 阿里与lora: 之前LoRa芯片只有Semtech一家企业掌握着LoRa芯片命脉,人们担心LoRa芯片不够丰富不能 ...

  5. 【PAT甲级】1004 Counting Leaves (30 分)(BFS)

    题意:给出一棵树的点数N,输入M行,每行输入父亲节点An,儿子个数n,和a1,a2,...,an(儿子结点编号),从根节点层级向下依次输出当前层级叶子结点个数,用空格隔开.(0<N<100 ...

  6. 使用 OClint 进行静态代码分析

    OCLint 就是一个建立在 Clang 上的工具,能够发现代码中潜在的问题. 最近需要一个静态分析代码工具,帮助我们发布运行应用前找到代码潜在的问题. 其实对于iOS开发,我们的日常开发上已经用到了 ...

  7. 【转】issue management in your test project

    What is Issue Management? Issue Management is the process to make others aware of the problem and th ...

  8. Java基础知识笔记第三章:运算符表达式语句

    算术运算符与表达式 操作符 描述 例子 + 加法 - 相加运算符两侧的值 A + B 等于 30 - 减法 - 左操作数减去右操作数 A – B 等于 -10 * 乘法 - 相乘操作符两侧的值 A * ...

  9. 2 Struts2的执行流程&配置文件的加载顺序

    执行流程: 访问前段页面,通过url访问action 访问xml中Struts2核心过滤器,并执行一组拦截器(这组拦截器在struts-default.xml中,实现了部分功能) 通过action配置 ...

  10. css height VS min-height

    height:容器高度固定(值是百分比时除外): min-height:容器高度小于该值时取该值,大于该值时按实际的值.应用:页面中页脚置底.