高可用Redis(三):Hash类型
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格式,
对用户的属性进行查询,更新和添加都比较方便
保存用户相关数据的方式比较

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
高可用Redis(二):字符串类型
1.Redis字符串结构 对于Redis来说,所有的key都是字符串,其value可以是string,list,hash,set,zset 比如下面的 键值对的value还可以更加复杂,比如可以是json格式,xml格式,序列化等 字符串类型的value的长度不能大于512MB。 在实际生产中,如果一个值保存成500MB的话,获取这个值的时候会占用很多的网络流量,其次读取的时候也会非常慢,这对于Redis这种单线程应用来说并不明智 在生产环境中,考虑到并发和网络流量的因素,value的大小建议在100KB以内 Redis字符串的使用场景: 缓存 计数器,比如视频网站中视频的播放次数统计等 分布式锁 2.Redis字符串相关命令 2.1 get命令,set命令和del命令 get key 获取key对应的value set key value 设置key-value del key 删除key-value 例子: 127.0.0.1:6379> set hello 'world' OK 127.0.0.1:6379> get hello "world" 127.0.0.1:6...
-
下一篇
消息中间件系列五、rabbit消息的确认机制
前言:这是中间件一个系列的文章之一,有需要的朋友可以看看这个系列的其他文章:消息中间件系列一、消息中间件的基本了解消息中间件系列二、Windows下的activeMQ和rabbitMQ的安装消息中间件系列三、JMS和activeMQ的简单使用消息中间件系列四、认识AMQP和RabbiyMq的简单使用消息中间件系列五、rabbit消息的确认机制消息中间件系列六,rabbit与spring集成实战 一、消息的确认机制 1、消费者收到的每一条消息都必须进行确认。(分为自动确认和消费者自行确认) 消费者在声明队列时,指定autoAck参数,true自动确认,false时rabbitmq会等到消费者显示的发回一个ack信号才会删除消息。autoAck=false,有足够时间让消费者处理消息,直到消费者显示调用basicAck为止。Rabbitmq中消息分为了两部分:1、等待投递的消息;2、已经投递,但是还没有收到ack信号的。如果消费者断连了,服务器会把消息重新入队,投递给下一个消费者。补充:未ack的消息是没有超时时间的,没有处理会一直在队列中,知道内存溢出。 2、如何明确拒绝消息 a、消费者...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker容器配置,解决镜像无法拉取问题
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境