python的redis操作(2)之hash数据

󰃭 2016-04-13

redis 的hash

redis 的hash数据结构可用来存储对象类型的数据

应用场景

快速的存取用户信息, 而用户的信息包含了许多属性, 比如uname, age, sex, work 等等, 而且更容易进行属性的更新, 假如用string类型进行存取, 还需要进行序列化和反序列化的操作。

实践

存取用户信息

hset

设置某个用户信息

r_con.hset( "tony", "uname", "tony") #1L
r_con.hset( "tony", "uname", "tony") #0L
r_con.hset( "tony", "age", 27) #1L
r_con.hset( "tony", "sex", "man") #1L

hset 如果每次为key(“tony”) 创建了新的field(如uname, age), 就返回1, 否则返回0

hget

用于读取某个key的field的值

r_con.hget("tony", "uname") #'tony'

hkeys

返回某个key的所有的fields

r_con.hkeys("tony") #['uname', 'age', 'sex']

hvals

返回某个key的所有的fields的值

r_con.hvals("tony") #['tony', '27', 'man']

hgetall

返回某个key的所有键值对

r_con.hgetall("tony") #{'age': '27', 'sex': 'man', 'uname': 'tony'}

hlen

返回某个key的fields的数量

r_con.hlen("tony") #3  (3个字段: age,sex,uname)

hmget

返回某个key的指定的多字段的值的集合, 并按顺序返回

r_con.hmget("tony", ("uname","age")) #['tony', '27']

hmset

指定某个key的所有键值对的值, 使用dict结构定义键值对

r_con.hmset("Yi_Zhi_Yu", {"uname": "Yi_Zhi_Yu", "age":25, "sex": "man"}) #True

hscan

命令用于迭代哈希键中的键值对。

举个栗子,我们换种方式存储用户信息

r_con.hmset("userinfos", {"tony": {"uname": "tony", "age":27, "sex": "man"}, "Yi_Zhi_Yu":{"uname": "Yi_Zhi_Yu", "age":25, "sex": "man"}}) #True

这样, userinfos 里就存储了两个用户信息, 我们使用hscan 可以对userinfos 的键值对进行迭代获取

r_con.hscan("userinfos")
#(0L,
#{'Yi_Zhi_Yu': "{'uname': 'Yi_Zhi_Yu', 'age': 25, 'sex': 'man'}",
#  'tony': "{'uname': 'tony', 'age': 27, 'sex': 'man'}"})

每次scan 都会返回userinfos的部分键值对和下次迭代的指针偏移, 可用于下次迭代,但如果这个返回的指针偏移量是0, 就表示已经迭代到hash列表的结束位置了

同时,hscan还有match以及count参数, 用于指定scan时只匹配match的结果以及每次迭代返回的最大数量count

hscan_iter

这个与hscan相似, 不过返回的是一个生成器, 这样, 我们可以直接通过这个生成器迭代获取key的每个field了

us = r_con.hscan_iter("userinfos") #<generator object hscan_iter at 0x7f1c629859b0>
us.next() #('tony', "{'uname': 'tony', 'age': 27, 'sex': 'man'}")
us.next() #('Yi_Zhi_Yu', "{'uname': 'Yi_Zhi_Yu', 'age': 25, 'sex': 'man'}")