redis(一)中主要记录了关于字符串作为value时的操作方法,并应用redis对页面进行缓存,

redis(二)中将主要记录关于hash(值是字典)的value的操作方法及应用:

 一、方法

1、设置与获取

hset(name,key,value),没有过期时间,这里不能设置单独键值对的过期时间,

hget(name,key)

hmset(name,mapping),其中mapping是字典,

hmget(name,keys),其中keys可以是集合列表,也可以是单独要获取的值用逗号隔开,

hgetall(name),获取mapping,即name对应的字典,

hkeys(name),获取name的字典值中所有的key,

hvals(name),获取name的字典值中所有的value,

hlen(name),获取name的字典值中键值对的个数,

r.hset('name','key1','value1')
        print(r.hget('name','key1'))        # b'value1'

        r.hmset('name',{'k1':'v1','k2':'v2','k3':'v3','k4':'v4'})
        print(r.hmget('name','k2'))             # [b'v2']
        print(r.hmget('name','k2','k3','k4'))   # [b'v2', b'v3', b'v4']
        print(r.hmget('name',['k2','k3']))      # [b'v2', b'v3']

        print(r.hgetall('name'))   # {b'key1': b'value1', b'k1': b'v1', b'k2': b'v2', b'k3': b'v3', b'k4': b'v4'}
        print(r.hkeys('name'))  # [b'key1', b'k1', b'k2', b'k3', b'k4']
        print(r.hvals('name'))  # [b'value1', b'v1', b'v2', b'v3', b'v4']
        print(r.hlen('name'))   # 5
设置与获取

2、hexists(name,key),判断键值key是否存在

说明:如果存在,返回True;否则,返回False,

        r.hmset('name',{'k1':'v1','k2':'v2','k3':'v3','k4':'v4'})
        print(r.hgetall('name'))   # {b'key1': b'value1', b'k1': b'v1', b'k2': b'v2', b'k3': b'v3', b'k4': b'v4'}
        print(r.hexists('name','k1'))   # True
        print(r.hexists('name','k8'))   # False
hexists

3、hdel(name,*key),删除指定的key对应的键值对

        r.hmset('name',{'k1':'v1','k2':'v2','k3':'v3','k4':'v4'})
        print(r.hgetall('name'))   # {b'key1': b'value1', b'k1': b'v1', b'k2': b'v2', b'k3': b'v3', b'k4': b'v4'}
        r.hdel('name','k3','k1')
        print(r.hgetall('name'))    # {b'key1': b'value1', b'k2': b'v2', b'k4': b'v4'}
hdel

4、自增、自减

hincrby(name,key,amount=1),指定键值key,默认自增1,可以通过amount设置增减值,但只能是整数,返回值为修改后的key的值,

r.hmset('dict1',{'k1':'1','k2':'2','k3':'3','k4':'4'})
        print(r.hgetall('dict1'))                   # {b'k1': b'1', b'k2': b'2', b'k3': b'3', b'k4': b'4'}
        print(r.hincrby('dict1','k1'))              # 2
        print(r.hincrby('dict1','k2',amount=6))     # 8
        print(r.hgetall('dict1'))                   # {b'k1': b'2', b'k2': b'8', b'k3': b'3', b'k4': b'4'}
hincrby

hincrbyfloat(name,key,amount=1.0),使用方法同上hincrby,可以进行小数增减,返回值仍为修改后的value,

        r.hmset('dict1',{'k1':'1','k2':'2','k3':'3','k4':'4'})
        print(r.hgetall('dict1'))                   # {{b'k1': b'1', b'k2': b'2', b'k3': b'3', b'k4': b'4'}
        print(r.hincrbyfloat('dict1','k1'))              # 2.0
        print(r.hincrbyfloat('dict1','k2',amount=-2.2))     # -0.2
        print(r.hgetall('dict1'))                   # {b'k1': b'2', b'k2': b'-0.2', b'k3': b'3', b'k4': b'4'}
hincrbyfloat

 5、迭代获取数据

r,data = hscan(name,cursor=0,match=None,count=None)

说明:实现增量式迭代获取数据,当数据量较大时有用,相当于数据切片获取,

其中:cursor:指游标位置,每一次操作都从游标指定位置开始读取数据,

   match:相当于模糊匹配,相当于设置模糊匹配的模板,

   count:取值的个数,但是不是很准,基本上会比预设的多几个,

   r:返回的最新游标位置,

   data:按设置提取的数据值

r,data = hscan_iter(name,match=None,count=None)

说明:利用yeild实现自动迭代,各参数含义同 hscan,

 二、关于过期时间

在redis中,hash方式的value,不能对每一个键值对设置过期时间,字符串方式的可以,

但是可以使用expire代码,对整体设置过期时间:

r.expire('name',10)   # 设置过期时间10秒

三、使用hash的redis设置session

import redis
r = redis.Redis(connection_pool=config.pool)

class RedisSession:
    session_id = "__sessionId__"

    def __init__(self,handler):
        self.handler = handler
        client_random_str = handler.get_cookie(RedisSession.session_id,None)

        if client_random_str and r.exists(client_random_str):
            self.random_str = client_random_str
        else:
            self.random_str = create_session_id()
            r.hset(self.random_str,None,None)

        # 重新设置缓存中指定session对应键值对的有效时间
        r.expire(self.random_str,config.SESSION_EXPIRES)

        # 浏览器中重新设置cookie,或者修改cookie的超时时间
        expires_time = time.time() + config.SESSION_EXPIRES
        handler.set_cookie(RedisSession.session_id,self.random_str,expires=expires_time)


    def __setitem__(self, key, value):
        if type(value) == dict:
            r.hset(self.random_str,key,json.dumps(value))
        else:
            r.hset(self.random_str,key,value)


    def __getitem__(self, key):
        result = r.hget(self.random_str,key)
        if result:
            ret_str = str(result,encoding='utf-8')
            try:
                result = json.loads(ret_str)
            except:
                result = ret_str
        return result

    def __delitem__(self,key):
        r.hdel(self.random_str,key)
session