高可用Redis(三):Hash类型

1.哈希类型键值结构

哈希类型也是key-value结构,key是字符串类型,其value分为两个部分:field和value
其中field部分表明属性,value表明属性对应的值python

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

在hash中,能够为key添加一个新的属性和新的值redis

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

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

注意事项:code

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

例子:blog

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格式,

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

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

相关文章
相关标签/搜索