redis 学习(4)-- 哈希类型
redis 学习(4)-- 哈希类型
介绍
redis 中哈希键值结构:

可以看出:哈希键值包括 key,field,value 这三部分,即键,属性,值这三部分。可以这样来表示:
key, (field, value)
即将 key, (field, value) 看成一组键值对,将 field, value 看成另一组键值对。
其中:
field 不能相同,value 可以相同
哈希其实就是一个 small redis。
API 介绍
| 命令 | 含义 |
|---|---|
| hget key field | 获取存储在哈希表中指定field的值 |
| hset key field value | 将哈希表中指定field的值设置为value |
| hdel key field1 [field2...] | 删除哈希表中一个或多个field |
| hexists key field | 判断哈希表中,指定field是否存在 |
| hlen key | 获取哈希表中字段的数量 |
| hmget key field1 [field2...] | 取哈希表中所有给定field的值 |
| hmset key field1 value1 [field2 value2...] | 同时将一个或多个field-value对设置到哈希表中 |
| hincrby key fiel increment | 为哈希表中指定field的值加上一个整型增量 |
| hsetnx key field value | 只有当哈希表中field不存在时,才设置该field的值 |
| hincrbyfloat key field increment | 为哈希表中指定field的值加上一个浮点数增量 |
不建议使用的 API
hgetall key
- 含义:获取哈希表中所有字段和值
- 时间复杂度为O(n),不建议使用
hkeys key
- 含义:获取哈希表中的所有字段
- 时间复杂度为O(n),不建议使用
hvals key
- 含义:获取哈希表中的所有值
- 时间复杂度为O(n),不建议使用
演示
hget、hset、hdel

hexists、hlen

hmget、hmset

实战
- 实现如下功能:记录网站每个用户个人主页的访问量
hincrby user:1:info pageview count
- 实现如下功能:缓存视频的基本信息(数据源在MYSQL中)伪代码
public VideoInfo get(long id) {
String redisKey = redisPrefix + id;
Map<String,String> hashMap = redis.hgetAll(redisKey);
VideoInfo videoInfo = transferMapToVideo(hashMap);
if (videoInfo == null) {
videoInfo = mysql.get(id);
if (videoInfo != null) {
redis.hmset(redisKey, transferVideoToMap(videoInfo));
}
}
return videoInfo;
}
将数据缓存在哈希表中,做序列化,然后取出来,做反序列化。
String 和 Hash 比较
相似的 API
| String | Hash |
|---|---|
| get | hget |
| set setnx | hset hsetnx |
| del | hdel |
| incr incrby decr decrby | hincrby |
| mset | hmset |
| mget | hmget |
用户信息的实现
1. String 实现
set user:1:serialize(userinfo)
将用户信息序列化为 json、xml、protobuf 等对象,需要的时候再取出来。
2. String 实现 (V2)
set user:1:age 41
set user:1:link tv.sohu.com
将用户的每项信息依次设置 key 和 value。
3. Hash 实现
hset user:1:info: age 41
hset user:1:info link tv.sohu.com
将用户信息存到 哈希表中。
三种方案比较
| 命令 | 优点 | 缺点 |
|---|---|---|
| string v1 | 编程简单;可以节省内存 | 序列化开销;设置属性要操作整个数据 |
| string v2 | 直观;可以部分更新 | 内存占用较大;key较为分散 |
| hash | 直观;节省空间;可以部分更新 | 编程稍微复杂;ttl不好控制 |
redis 学习(4)-- 哈希类型的更多相关文章
- 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型
第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...
- redis学习笔记-01 string类型命令
一.set key value set joker 123456 #设定key为joker,value为123456的数据 二.keys * keys * #用于查看该数据库中所有的key值 三.se ...
- 峰Redis学习(3)Redis 数据结构(字符串、哈希)
第一节:Redis 数据类型介绍 五种数据类型: 字符串(String) 字符串列表(list) 有序字符串集合(sorted set) 哈希(hash) 字符串集合(set) 第二节:Redis ...
- 【redis 学习系列】API的理解与使用(二)
3.哈希 几乎所有的语言都支持了哈希(hash)类型.在Redis中,哈希类型是指键值本身又是一个键值对结构,形如:value = {{field, value} ... {field, value} ...
- API的理解和使用——哈希类型的命令
哈希常用的命令复习 命令 功能 hset key field value 设置哈希值 hsetnx 设置哈希值,field或键必须不存在 hget 获取某个file对应的值 hdel 删除一个或多个f ...
- Redis学习——数据结构上
一.常用的全局命令 1.查看所有的键: KEYS * KEYS pattern:查找所有符合给定模式 pattern 的 key . KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能 ...
- 尚硅谷redis学习4-数据类型
redis的数据类型包括String,Hash(类似于JAVA里的map),List,Set,Zset(sorted Set) String(字符串) string是redis最基本的类型,你可以理解 ...
- 【转】Redis学习---哈希结构内存模型剖析
[原文]https://www.toutiao.com/i6594624365906625032/ 概述 在前文<Redis字符串类型内部编码剖析>之中已经剖析过 Redis最基本的 St ...
- Redis之哈希类型命令
Hash(哈希) Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿 ...
随机推荐
- Bzoj3073Journeys
这不裸的dij吗?来,弄他. 打完以后发现不妙,这数据范围略神奇……算一算,考一场都可能跑不出来.map去重边(成功额外引入log)不怕,交.TLE,54. 这不玩呢吗,把map去了,交.MLE,71 ...
- 2018-2019-2 20165215《网络对抗技术》Exp7 网络欺诈防范
目录 实验目的 实验内容 实验步骤 (一)简单应用SET工具建立冒名网站 (二)ettercap DNS spoof (三)结合应用两种技术,用DNS spoof引导特定访问到冒名网站 基础问题回答 ...
- LeetCode 75. 颜色分类(Sort Colors)
题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色 ...
- 【编程漫谈】PHP
PHP是个很古老的脚本技术了,当年CGI比较让人诟病,于是PHP横空出世.PHP即写即用特性,吸引了一大批粉丝,而且类似C语言的编程风格,让那些C程序员非常容易地转到这个平台上来.当然PHP刚出来的时 ...
- 查重复出现的字段 SQL
select * from a where (select count(b.abc) from b where b.abc=a.abc)>1 一般treeview datagridview 都要 ...
- cocos creator发布win10全屏缩放问题
当前2.2.1版本cocos creator发布的win32版本不是全屏的, https://forum.cocos.org/t/win-exe/80429 https://blog.csdn.net ...
- 转:extjs 添加loading状态的三种解决办法:
extjs 添加loading状态的三种解决办法: 方法一: //materialGrid 指需要显示loading状态的控件id var o=Ext.getCmp('materialGrid'); ...
- Hibernate5 Guide
(1) 创建Maven工程 可以使用Eclipse或IDEA创建 (2) 修改pom文件 <project xmlns="http://maven.apache.org/POM/4.0 ...
- 行为验证码的asp.net MVC实现方式 qq521877626
界面http://localhost:你的服务器/Code/index 实现步骤: 注册账号https://www.geetest.com 新增验证 下载demo (url:http://docs ...
- django中使用mysql数据库
django连接mysql 安装MySQL 1 linux: apt install mysql-server apt install mysql-client mysql_secure_instal ...