专题三: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 ...
随机推荐
- Python-运算符和其优先级
运算符 算数运算符 + - * ** / // % print(4 + 5) print("a" + "b") print([1, 2] + [1, 4]) p ...
- 05 C语言的数据类型
C语言的数据类型 在C 中,数据类型是用来声明不同类型的变量或函数的一个广泛的概念.变量的数据类型决定了变量存储占用的空间大小,以及如何去解释存储的位模式. C 中的数据类型可分为以下几大类: 序号 ...
- GetPrivateProfileString
参考: 1. https://blog.csdn.net/tunnel115/article/details/3081340 2. https://blog.csdn.net/hopedream200 ...
- 一文搞懂PV、UV、VV、IP及其关系与计算
写在前面 十一长假基本上过去了,很多小伙伴在假期当中还是保持着持续学习的心态,也有不少小伙伴在微信上问我,让我推送相关的文章.这个时候,我都是抽空来整理小伙伴们的问题,然后,按照顺序进行推文. PS: ...
- 远程触发Jenkins的Pipeline任务的并发问题处理
前文概述 本文是<远程触发Jenkins的pipeline任务>的续篇,上一篇文章实战了如何通过Http请求远程触发指定的Jenkins任务,并且将参数传递给Jenkins任务去使用,文末 ...
- Windows 编程基础
1 Windows应用程序的分类 1.1 控制台程序 DOS程序,本身没有窗口,通过WINDOWS下的DOS窗口执行. 1.2 窗口程序 拥有自己的窗口,通过窗口可以和用户进行交互.(比如:记事本,画 ...
- Solr单机安装
Solr单机安装 一.下载 自行到官网下载所需版本即可,我这里使用的是solr-7.1.0solr官网:http://archive.apache.org/dist/lucene/solr/ 二.安装 ...
- java的各种集合为什么不安全(List、Set、Map)以及代替方案
我们已经知道多线程下会有各种不安全的问题,都知道并发的基本解决方案,这里对出现错误的情况进行一个实际模拟,以此能够联想到具体的生产环境中. 一.List 的不安全 1.1 问题 看一段代码: publ ...
- docker自定义网络里的dns实现原理
简单说一下流程吧,不写了. docker会修改容器里的/etc/resolv.conf文件,把dns服务器设置成127.0.0.11,因为127.0.0.0/8地址都是本机回环地址,所以dns查询的时 ...
- JavaWeb01_html&css
一. html简介 1. 什么是html ①. HyperText Markup Language:超文本标记语言,是最基本的网页语言 ②. 超文本:超出文本范畴 ③. 标记:标记就是标签,html所 ...