专题三:redis的数据类型之hash
一、基本介绍
前面一个专题我们讲到string去存储明星微博粉丝数,微博数等,大概介绍了两种方式:
- set user:id:012345:fans 12210862 set user:id:012345:blogs 83
- 采用json的方式:set user:id:012345 {id:012345, blogs:83, fans:12210862}
第一种方式,相当于是两个key,分别去存储,第二种方式呢,取数据还可以,修改就显得比较笨重。我们做一下变形,变成下面这种形式:相当于存储空间变成了一个键对应一个值,外部只需要明星的id的key就好了。相当于一个key存储了多组数据,我们简化下图:

hash类型:
- 对一系列存储的数组进行编组,方便管理,典型应用存储对象信息
- 需要的存储结构:一个存储空间保存多个键值对数据
- 底层用hash表结构存储数据

hash存储结构优化
- 如果field数量较少,存储结构优化为类数组结构
- 如果filed数量较多,存储结构优化为HashMap结构
二、基本操作
| 功能 | 命令 | 其他说明 |
| 添加修改数据 | hset key field value | |
| 获取数据 |
hget key field hgetall key |
如果是获取所有的key,field和value都会得到,交叉展示 |
| 删除数据 | hdel key field | 可以删除多个field |
| 添加修改多个数据 | hmset key field1 value1 field2 value2 | |
| 获取多个数据 | hmget key field1 field2 | |
| 获取哈希表中字段的数量 | hlen key | 返回field个数 |
| 获取哈希表中是否存在指定字段 | hexists key field | 存在返回1,不存在返回0 |
三、扩展操作
| 功能 | 命令 | 其他说明 |
| 获取哈希表中所有字段名 | hkeys key | 得到所有的field |
| 获取哈希表中所有字段值 | hvals key | 得到所有的value |
| 设置指定字段的数值数据增加指定范围的值 |
hincrby key field incremet hincrbyfloat key field increment |
四、注意事项
- hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套对象;如果数据未获取到,对应值为nil
- 每个hash可以存储2^32-1个键值对(存储有上限)
- hash类型十分贴近对象的存储格式,并且可以灵活添加删除对象的属性值。但是hash的设计初衷不是为了存储大量对象设计的,而且更不能将hash作为对象列表使用
- hgetall操作可以获取全部属性,如果内部fields过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈。
五、业务场景
比方说电商中的购物车,每个用户使用自己的购物车,购物车中购买多个商品,每个商品的数量也不尽相同,这个时候我们就可以考虑hash的存储结构;key 就是用户的ID,field是商品的id,value就是购买对应商品的数量。
存储结构OK了,那么我们购物车的操作是不是也能实现了?当然可以的,比方说要获取购物车中商品的个数可以使用hlen,获取某个商品的购买数量hget,购买数量修改hset/hincrby,
看全部购物车hgetall,删除hdel。因此用hash是没有问题。
六、string存储对象和hash存储对象区别
string存对象讲究整体性,要么一次性更新,要么一次性获取,以读为主;
hash可以用field把属性隔离开来,讲究的是更新操作的灵活性;hash是一个群组概念,把一系列的数据包装起来,对外产生唯一的key。
如果更新比较多,推荐使用hash,如果更加注重对外呈现,推荐string。
专题三:redis的数据类型之hash的更多相关文章
- redis(三)-----redis基本数据类型
Redis的全称是REmote Dictionary Server,它主要提供了5种数据结构:字符串.哈希.列表.集合.有序集合,同时在字符串的基础之上演变 出了位图(Bitmaps)和HyperLo ...
- 关于redis的几件小事(三)redis的数据类型与使用场景
1.string 这是最基本的类型了,就是普通的set和get,做简单的kv缓存. 2.hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对 ...
- redis 五大数据类型之hash篇
1.hset/hget/hmset/hmget/hgetall/hdel --hgetall 是以截图中 key-value 分别一一显示出来,k1对应v1 ,k2对应v2 2.hlen 3.hexi ...
- Redis笔记(三)Redis的数据类型
前面说过,Redis的一大特性是支持丰富的数据类型, 这为更多的应用场景提供了可能. Redis有五种数据类型,包括string,list,set,sorted set和hash,注意,Redis的数 ...
- 专题二:redis的数据类型之string
一.redis的数据存储格式 redis本身是一个Map,其中所有的数据都是采用 "key:value"的方式进行存储的. 我们说的数据类型是数据存储的类型,也就是对应下图的val ...
- 2. redis的数据类型
一. string类型 字符串类型是redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至是一张图片(二进制内容).一个字符串类型的值存储的最大容量是1GB 命令 (1)setnx ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- Redis的数据类型及其常用命令
快速入门Redis 首先安装redis: windows下安装redis Linux下安装redis 1. 什么是redis Redis属于nosql(非关系型数据库) 关系型数据库是基于关系表的数据 ...
- Redis的数据类型及相关操作命令
redis 基础内容 —— redis的数据类型及相关操作的Linux命令.所谓大厦千层基础承载,希望大家认真学习这一讲: 一.redis 的五大数据类型: 1.String(字符串): 2.List ...
随机推荐
- Java程序运行内存机制
Java程序运行内存机制 栈内存包留调用方法.变量的区域,堆内存是new对象的区域,方法区为保存class文件的区域. 程序刚开始时,先加载类文件相应的数据到方法区,然后就从main()方法开始执行. ...
- Paxos 协议
可用性与一致性 为了向用户提供更好的服务体验,现代软件架构越来越注重系统的可用性availability. 正是在这种趋势的驱动下,微服务与容器化技术才能在今天大行其道. 而高可用架构的前提是冗余: ...
- 安装 Windows 10 系统时分区选择 MBR 还是 GUID?
一.MBR 和 GUID 的概述 MBR 分区表 MBR:Master Boot Record,即硬盘主引导记录分区表,指支持容量在2.1TB以下的硬盘,超过2.1TB的硬盘只能管理2.1TB,最多只 ...
- ORA-00001: unique constraint (string.string) violated 违反唯一约束条件(.)
ORA-00001: unique constraint (string.string) violated ORA-00001: 违反唯一约束条件(.) Cause: An UPDATE or I ...
- gitlab-配置邮件
一:配置邮件 1. 进入配置文件,通过修改/etc/gitlab/gitlab.rb来设置邮件功能 修改后的文件 1 ## GitLab URL 2 ##! URL on which GitLab ...
- docker容器命令2
docker容器命令2 启动守护式容器 docker run -d 镜像名字 [root@tzh ~]# docker images REPOSITORY TAG IMAGE ID CREATED S ...
- Prometheus 系列开篇:为什么要学 Prometheus ?
「Prometheus 系列开篇:为什么要学 Prometheus ?」首发于[陈树义]公众号,点击跳转到原文https://mp.weixin.qq.com/s/HCS6X3l6nVBw_hAnd6 ...
- Springboot+Redis(发布订阅模式)跨多服务器实战
一:redis中发布订阅功能(http://www.redis.cn/commands.html#pubsub) PSUBSCRIBE pattern [pattern -]:订阅一个或者多个符合pa ...
- 【idea】重装系统(格式化C盘后)idea无法导入maven(jdk重装了,版本不同),结果报错!
[以下部分截图]2019-11-25 09:48:49,045 [ 108964] WARN - #org.jetbrains.idea.maven - Cannot open inde ...
- 485hub
485hub 485hub ZLAN9480A是一款可通过一路RS485主口扩展出8路RS485从口的工业级隔离型8口RS485集线器.可以有效的实现RS485网络的中继.扩展与隔离. ZLAN948 ...