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'}")