day11-redis hash操作
一、前言
之前我们学习的是redis的string操作,今天我们来学习 hash 操作,hash表现形式上有些像pyhton中的dict,可以存储一组关联性较强的数据。
二、原理图
redis中Hash在内存中的存储格式如下图:

三、hash操作
1、hset(name, key, value) ,hget
1 # name对应的hash中设置一个键值对(不存在,则创建;否则,修改) 2 3 # 参数: 4 # name,redis的name 5 # key,name对应的hash中的key 6 # value,name对应的hash中的value 7 8 # 注: 9 # hsetnx(name, key, value),当name对应的hash中不存在当前key时则创建(相当于添加) 10 11 127.0.0.1:6379[2]> hset info name keven age 22 12 (integer) 2 13 127.0.0.1:6379[2]> hget info age #获取值 14 "22" 15 127.0.0.1:6379[2]> hget info name 16 "keven"
2、hmset ,hmget
1 # 在name对应的hash中批量设置键值对 2 3 # 参数: 4 # name,redis的name 5 # mapping,字典,如:{'k1':'v1', 'k2': 'v2'} 6 7 # 如: 8 # r.hmset('xx', {'k1':'v1', 'k2': 'v2'}) 9 10 # 在name对应的hash中获取多个key的值 11 12 # 参数: 13 # name,reids对应的name 14 # keys,要获取key集合,如:['k1', 'k2', 'k3'] 15 # *args,要获取的key,如:k1,k2,k3 16 17 # 如: 18 # r.mget('xx', ['k1', 'k2']) 19 # 或 20 # print r.hmget('xx', 'k1', 'k2') 21 22 127.0.0.1:6379[2]> hmset info2 name jack age 18 23 OK 24 127.0.0.1:6379[2]> hmget info2 25 (error) ERR wrong number of arguments for 'hmget' command 26 127.0.0.1:6379[2]> hmget info2 name 27 1) "jack" 28 127.0.0.1:6379[2]> hmget info2 name age 29 1) "jack" 30 2) "18"
3、hgetall
1 127.0.0.1:6379[2]> hgetall info 2 1) "name" 3 2) "keven" 4 3) "age" 5 4) "22" 6 127.0.0.1:6379[2]> hgetall info2 7 1) "name" 8 2) "jack" 9 3) "age" 10 4) "18" 11 127.0.0.1:6379[2]>
4、hlen
1 获取name对应的hash中键值对的个数 2 3 127.0.0.1:6379[2]> hlen info 4 (integer) 2 5 127.0.0.1:6379[2]> hlen info 2 6 (integer) 2
5、hkeys ,hvals
1 # 获取name对应的hash中所有的key的值 2 3 4 127.0.0.1:6379[2]> hkeys info 5 1) "name" 6 2) "age" 7 127.0.0.1:6379[2]> hkeys info2 8 1) "name" 9 2) "age" 10 11 # 获取name对应的hash中所有的value的值 12 127.0.0.1:6379[2]> hvals info 13 1) "keven" 14 2) "22" 15 127.0.0.1:6379[2]> hvals info2 16 1) "jack" 17 2) "18"
6、hexists (name,key)
1 #检查name对应的hash是否存在当前传入的key 2 3 127.0.0.1:6379[2]> hgetall info 4 1) "name" 5 2) "keven" 6 3) "age" 7 4) "22" 8 127.0.0.1:6379[2]> HEXISTS info name 9 (integer) 1 10 127.0.0.1:6379[2]> HEXISTS info test 11 (integer) 0 12 127.0.0.1:6379[2]>
7、hdel(name,keys)
1 # 将name对应的hash中指定key的键值对删除 2 127.0.0.1:6379[2]> hdel info name 3 (integer) 1 4 127.0.0.1:6379[2]> hgetall info 5 1) "age" 6 2) "22" 7 127.0.0.1:6379[2]>
8、hincrby
1 # 自增name对应的hash中的指定key的值,不存在则创建key=amount 2 # 参数: 3 # name,redis中的name 4 # key, hash对应的key 5 # amount,自增数(整数) 6 7 127.0.0.1:6379[2]> hincrby info3 k 1 8 (integer) 1 9 127.0.0.1:6379[2]> hincrby info3 k 2 10 (integer) 3 11 127.0.0.1:6379[2]> hgetall info3 12 1) "k" 13 2) "3" 14 127.0.0.1:6379[2]> hincrby info3 k 2 15 (integer) 5 16 127.0.0.1:6379[2]> hgetall info3 17 1) "k" 18 2) "5" 19 127.0.0.1:6379[2]>
9、hincrbyfloat(name, key, amount=1.0)
1 # 自增name对应的hash中的指定key的值,不存在则创建key=amount 2 3 # 参数: 4 # name,redis中的name 5 # key, hash对应的key 6 # amount,自增数(浮点数) 7 8 # 自增name对应的hash中的指定key的值,不存在则创建key=amount
10、hscan(name, cursor=0, match=None, count=None)
Start a full hash scan with:
HSCAN myhash 0
Start a hash scan with fields matching a pattern with:
HSCAN myhash 0 MATCH order_*
Start a hash scan with fields matching a pattern and forcing the scan command to do more scanning with:
HSCAN myhash 0 MATCH order_* COUNT 1000
1 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆 2 3 # 参数: 4 # name,redis的name 5 # cursor,游标(基于游标分批取获取数据) 6 # match,匹配指定key,默认None 表示所有的key 7 # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数 8 9 # 如: 10 # 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None) 11 # 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None) 12 # ... 13 # 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕 14 15 127.0.0.1:6379[2]> hgetall info2 16 1) "name" 17 2) "jack" 18 3) "age" 19 4) "18" 20 127.0.0.1:6379[2]> hscan info2 0 match n* 21 1) "0" 22 2) 1) "name" 23 2) "jack" 24 127.0.0.1:6379[2]>
10、hscan_iter(name, match=None, count=None)
1 # 利用yield封装hscan创建生成器,实现分批去redis中获取数据 2 3 # 参数: 4 # match,匹配指定key,默认None 表示所有的key 5 # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数 6 7 # 如: 8 # for item in r.hscan_iter('xx'): 9 # print item

浙公网安备 33010602011771号