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
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'}
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'}
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'}
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)
浙公网安备 33010602011771号