1.哈希类型键值结构

哈希类型也是key-value结构,key是字符串类型,其value分为两个部分:field和value

其中field部分代表属性,value代表属性对应的值

上面的图里,user:1:info为key,name,age,Date为user这个key的一些属性,value是属性对应的值

在hash中,可以为key添加一个新的属性和新的值

比如使用下面的命令向user:1:info这个key添加一个新属性viewCounter,属性对应的值为100

hset user:1:info viewCounter 100

2.特点

key-value结构
key(field)不能相同,value可以相同

3.Redis哈希类型对应的命令

3.1 hget命令,hset命令和hdel命令

hget key field			获取hash key对应的field的value
hset key field value 设置hash key对应的field的value
hdel key field 删除hash key对应的field的value

例子:

127.0.0.1:6379> hset user:1:info age 23
(integer) 1
127.0.0.1:6379> hget user:1:info age
"23"
127.0.0.1:6379> hset user:1:info name python
(integer) 1
127.0.0.1:6379> hgetall user:1:info
1) "age"
2) "23"
3) "name"
4) "python"
127.0.0.1:6379> hdel user:1:info age
(integer) 1
127.0.0.1:6379> hgetall user:1:info
1) "name"
2) "python"
127.0.0.1:6379>

注意事项:

hget命令,hset命令和hdel命令的时间复杂度为O(1)

3.2 hexists命令和hlen命令

hexists key field	判断hash key是否有field
hlen key 获取hash key field的数量

例子:

127.0.0.1:6379> hgetall user:1:info
1) "name"
2) "python"
3) "age"
4) "23"
127.0.0.1:6379> hexists user:1:info name
(integer) 1
127.0.0.1:6379> hlen user:1:info
(integer) 2

注意事项:

hexists命令和hlen命令的时间复杂度为O(1)

3.3 hmget命令和hmset命令

hmget key field1 field2 ... fieldN							批量获取hash key的一批field对应的值
hmset key field1 value1 field2 value2 ... fieldN valueN 批量设置hash key的一批field value

例子:

127.0.0.1:6379> hmset user:2:info age 30 name mysql page 50
OK
127.0.0.1:6379> hlen user:2:info
(integer) 3
127.0.0.1:6379> hmget user:2:info age name
1) "30"
2) "mysql"
127.0.0.1:6379>

注意事项:

hmget命令和hmset命令的时间复杂度为O(1)

3.4 hgetall命令,hvals命令和hkeys命令

hgetall key			返回hash key对应所有的field和value
hvals key 返回hash key对应所有field的value
hkeys key 返回hash key对应所有field

例子:

127.0.0.1:6379> hgetall user:2:info
1) "age"
2) "30"
3) "name"
4) "mysql"
5) "page"
6) "50"
127.0.0.1:6379> hvals user:2:info
1) "30"
2) "mysql"
3) "50"
127.0.0.1:6379> hkeys user:2:info
1) "age"
2) "name"
3) "page"

注意事项:

hgetall命令,hvals命令和hkeys命令的时间复杂度为O(1)
由于Redis的单线程的特点以及hgetall会返回所有的key和value,所以如果hash中存储的数据过多时,hgetall命令的执行速度会比较慢

3.5 hsetnx命令,hincrby命令和hincrbyfloat命令

hsetnx key field value					设置hash key对应field的value(如field已经存在,则失败)
hincrby key field intCounter hash key对应的field的value自增intCounter
hincrbyfloat key field floatCounter hincrby浮点数版

注意事项:

hsetnx命令,hincrby命令和hincrbyfloat命令的时间复杂度为O(1)

4.实战

记录网站每个用户个人主页的访问量,也可以使用哈希类型

这样可以保证每个用户的相关数据是一个整体,而使用字符串类型保存的话,则每个用户个人主面的访问量与每个用户的其他数据都是一个分离的状态。

记录网站每个用户个人主页的访问量需要根据实际情况来进行设计使用

hincrby user:1:info pageview count

5.使用Redis保存每个用户相关的数据,可以使用三种方式

5.1 方式一

使用用户的id为key,把用户的相关数据进行序列化后并做为value

使用时,根据用户id获取对应的数据的字符串格式,进行反序列化后就可以得到用户相关的数据进行查询和更新操作

5.2 方式二

使用用户的id与用户对应的属性名进行拼接得到新的字符串,并做为key,用户对应属性的值做为value

这样,用户的所有信息都是分离开的,可以很方便的对用户的数据进行查询和更新,并且可以很方便的为用户添加新的属性,而不用对原来的属性有影响 

5.3 方式三

使用用户id做为key,用户的其他数据都保存为hash格式,

对用户的属性进行查询,更新和添加都比较方便

保存用户相关数据的方式比较

高可用Redis(三):Hash类型的更多相关文章

  1. 如何搭建高可用redis架构?

    如何搭建高可用redis架构? 温国兵 架构师小秘圈 昨天 作者:温国兵,曾任职于酷狗音乐,现为三七互娱 DBA.目前主要关注领域:数据库自动化运维.高可用架构设计.数据库安全.海量数据解决方案.以及 ...

  2. 高可用Redis服务架构分析与搭建

    基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在业务中用其存储用户登陆态(Session存储),加速一些热数据的查询(相比较mysql而言,速度有数量 ...

  3. centos下搭建高可用redis

    Linux下搭建高可用Redis缓存 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器.楼主是一枚JAVA后端程序员,也算是半个运维工程师了.在Li ...

  4. 高可用Redis服务架构分析与搭建(单redis实例)

    原文地址:https://www.cnblogs.com/xuning/p/8464625.html 基于内存的Redis应该是目前各种web开发业务中最为常用的key-value数据库了,我们经常在 ...

  5. Mycat高可用解决方案三(读写分离)

    Mycat高可用解决方案三(读写分离) 一.系统部署规划 名称 IP 主机名称 配置 192.168.199.112 mycat01 2核/2G Mysql主节点 192.168.199.110 my ...

  6. Redis从出门到高可用--Redis复制原理与优化

    Redis从出门到高可用–Redis复制原理与优化 单机有什么问题? 1.单机故障; 2.单机容量有瓶颈 3.单机有QPS瓶颈 主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/s ...

  7. 使用Docker Compose部署基于Sentinel的高可用Redis集群

    使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...

  8. redis之Hash类型常用方法总结

    redis之Hash类型常用方法总结 格式: 存--HMGET key field [field ...] 取--HMGET key field [field ...] M:表示能取多个值,many ...

  9. 暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案

    暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案 这是悟空的第 158 篇原创文章 原文链接:首发悟空聊架构 官网:www.passjava.cn 你好,我是悟空. 前言 ...

随机推荐

  1. CentOS7切换源

    1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...

  2. vue上传图片 base64+canvas压缩图片

    这是先将图片 base64转码 在拿canvas压缩的

  3. Python基础:数据类型-列表与元组(6)

    Python中数据结构主要有序列.集合和字典. 1. 通用序列操作 Python内置了多种序列,其中最常用的两种:列表和元组.另一种重要的序列是字符串. 列表和元组的主要不同在于:列表是可以修改的,而 ...

  4. jmeter 安装

    3.1 windows10环境下测试工具jmeter安装与配置 3.1.1下载安装java 浏览器中打开链接:http://down-www.7down.net/pcdown/soft/xiazai/ ...

  5. python3 重写、重用、重载

    重用重用是用于在对象的概念中,实现代码的重用性 在继承角度,在子类继承父类之后,重新使用父类属性方法即是代码的重用 在组合角度,在一个类中以另外一个类的对象作为数据属性,提高代码的重用性 重用的方式: ...

  6. 解决Windows10中Virtualbox安装虚拟机没有64位选项

    今天想在Windows 10系统安装完Virtualbox虚拟机,然后打算装一个CENTOS系统,但是选择安装系统的时候竟然没有64位操作系统的选项,经过一阵Google,终于解决了,在这里盘点一下出 ...

  7. 2018 API变化

  8. 【BZOJ4030】[HEOI2015]小L的白日梦

    [BZOJ4030][HEOI2015]小L的白日梦 题面 BZOJ 洛谷 题解 要求的是最小的不开心连续段的期望. 然后发现自己就不会做了. 然后就可以来抄题解啦. 首先来猜性质: 第一个,一定是按 ...

  9. JS学习笔记Day17

    一. 创建对象的方法 (一)在了解原型链之前,首先先了解一下创建对象的几种方式,介绍以下三种. 代码: <script type="text/javascript"> ...

  10. (N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree

    Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longe ...