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

 

posted @ 2018-04-09 15:15  东郭仔  阅读(139)  评论(0)    收藏  举报