Python操作Redis大全


Python操作Redis大全文章插图
来源: 廖高祥 链接:
一、字符串 strings
Python操作Redis的redis模块对字符串(string)的主要操作函数包括:SET、GET、GETSET、SETEX、SETNX、MSET、MSETNX、INCR(INCRBY,DECR,DECRBY在python中庸同一个函数incr实现)、APPEND、SETRANGE、STRLEN 。 函数说明如下:

  1. SET: 为指定的键(key)设置值(value) ,set(self, name, value, **kwargs) 。
  2. GET:获取指定键(key)绑定的值(value) , get(self, name) 。
  3. GETSET:为指定的键(key)设置新的值(value) , 并返回旧的值(old Value) , getset(self, name, value)
  4. SETEX:为指定的键(key)设置过期以秒(second)计的过期时间 , setex(self, name, value, time)
  5. SETNX:键(key)不存在时 , 为键(key)指定值(value) , setnx(self, name, value)
  6. MSET:一次性设置多个键-值(key-value)对,函数设置的键-值对(即mapping所指内容)数据要以Python字典数据类型传入 , mset(self, mapping)
  7. MSETNX:键-值(key-value)对不存在时 , 设置键-值(key-value)对,msetnx(self, mapping) , mapping值参考6
  8. INCR:自增函数 , 默认步长为1 , 通过对步长(amount)大小以及字符的控制实现了INCRBY(amount>=1)、DECR(amount=-1)、DECRBY(amount<=-1)等函数功能 , incr(self, name, amount=1)
  9. APPEND:为指定的字符串追加值 , 若不存在则直接创建 , append(self, key, value)
  10. SETRANGE:用 value 参数覆写给定 key 所储存的字符串值 , 从偏移量 offset 开始 , setrange(self, name, offset, value)
  11. STRLEN:返回字符串的长度 , 当name不存在时返回0 , strlen(self, name)
示例代码如下:
#!/usr/bin/python# -*- coding:utf-8 -*-# __author__ = 'Jack'pool = redis.ConnectionPool(host='127.0.0.1', port=6379)r = redis.Redis(connection_pool=pool)r.flushall # 清空Redisr.setex('name', value='http://kandian.youth.cn/index/liaogx', time=2) # 设置新值 , 过期时间为3sr.mset(k1 = 'v1', k2 = 'v2', k3 = 'v3') # 批量设置新值print(r.mget('k1', 'k2', 'k3', 'k4')) # 批量获取新值print(r.getset('name', 'liaogaoxiang')) # 设置新值并获取原来的值print(r.getrange('name', 0, 1)) # 获取子序列 0 <= x <= 1r.setrange('name', 0, 'LIAO') # 修改字符串内容 , 从指定字符串索引开始向后替换(新值太长时 , 则向后添加) , 返回值的长度i = 0while i < 4:print(r.get('name'))time.sleep(1)i += 1source = 'foo'r.set('n1', source)r.setbit('n1', 7, 1)'''注:如果在Redis中有一个对应: n1 = "foo" , 那么字符串foo的二进制表示为:01100110 01101111 01101111所以 , 如果执行 setbit('n1', 7, 1) , 则就会将第7位设置为1 , 那么最终二进制则变成 01100111 01101111 01101111 , 即:"goo"'''print(r.get('n1'))print(r.getbit('n1', 7)) # 获取n1对应的值的二进制表示中的某位的值 (0或1)r.set('n2', '廖高祥')print(r.strlen('n2')) # 返回对应的字节长度(一个汉字3个字节)r.set('num', 1)r.incr('num', amount=10)r.decr('num', amount=1)print(r.get('num')) # 自增num对应的值 , 当name不存在时 , 则创建name=amount , 否则 , 则自增 。 r.append('num', 111)print(r.get('num')) # 在redis num对应的值后面追加内容输出结果如下:
[b'v1', b'v2', b'v3', None]b'liaogx'b'li'b'LIAOgaoxiang'b'LIAOgaoxiang'b'LIAOgaoxiang'b'LIAOgaoxiang'b'goo'19b'10'b'10111'二、列表 lists
Python操作Redis主要利用了redis模块来实现 , list表操作函数主要模拟了Redis操作命令LPUSH , LRANGE , LINDEX , BLPOP , BRPOP 。 函数说明如下:
  1. lpush函数实现了从向指定redis列表头部压入数据功能 , lpush key value
  2. lrange获取列表指定范围的函数 , lrange key start end
  3. lindex根据列表下标量获取列表元素值 , lindex key index
  4. blpop从列表头部取出第一个元素 , 返回该元素值并从列表删除(l代表left , 左边)
  5. brpop从列表尾部取出第一个元素 , 返回该元素值并从列表删除(r代表right , 右边)
  6. LPUSHX、RPUSHX以及其他一些Redis列表(List)函数目前版本无法实现 , 如有可实现方法博客代码事例将会得到更新 。
示例代码如下:
#!/usr/bin/python# -*- coding:utf-8 -*-# __author__ = 'Jack'pool = redis.ConnectionPool(host='127.0.0.1', port=6379)r = redis.Redis(connection_pool=pool)r.flushall # 清空Redisr.lpush('oo', 11) # 保存顺序为: 33,22,11r.lpushx('oo', 00) # 在name对应的list中添加元素 , 只有name已经存在时 , 值添加到列表的最左边print(r.llen('oo')) # name对应的list元素的个数r.linsert('oo', 'before', 11, 99) # 在11之前插入值99r.lset('oo', 1, 88) # 对name对应的list中的某一个索引位置重新赋值print(r.lrange('oo', 0, -1)) # 在name对应的列表分片获取数据r.lrem('oo', 88, num=1) # 在name对应的list中删除指定的值.num=0 , 删除列表中所有的指定值;num=2,从前到后 , 删除2个;num=-2,从后向前 , 删除2个print(r.lrange('oo', 0, -1))print(r.lpop('oo')) # 在name对应的列表的左侧获取第一个元素并在列表中移除 , 返回值则是第一个元素print(r.lindex('oo', 0)) # 在name对应的列表中根据索引获取列表元素r.lpush('l1', 11) # index为0r.rpush('l1', 22)r.rpush('l1', 33)r.rpush('l1', 44)r.rpush('l1', 55) # index为4r.ltrim('l1', 1, 3) # 在name对应的列表中移除没有在[start-end]索引之间的值print(r.lrange('l1', 0, -1))r.rpoplpush('l1', 'l1') # 从一个列表取出最右边的元素 , 同时将其添加至另一个列表的最左边;src要取数据的列表的name, dst要添加数据的列表的nameprint(r.lrange('l1', 0, -1))r.brpoplpush('l1', 'l1', timeout=3) # # timeout , 当src对应的列表中没有数据时 , 阻塞等待其有数据的超时时间(秒) , 0 表示永远阻塞print(r.lrange('l1', 0, -1))print(r.blpop('l1', 3)) # 从列表头部取出第一个元素 , 返回该元素值并从列表删除(l代表left , 左边)print(r.lrange('l1', 0, -1))'''# 由于redis类库中没有提供对列表元素的增量迭代 , 如果想要循环name对应的列表的所有元素 , 那么就需要:# 1、获取name对应的所有列表# 2、循环列表# 但是 , 如果列表非常大 , 那么就有可能在第一步时就将程序的内容撑爆 , 所有有必要自定义一个增量迭代的功能:'''print('自定义增量迭代:')r.flushallr.lpush('l1', 11) # index为0r.rpush('l1', 22)r.rpush('l1', 33)r.rpush('l1', 44)r.rpush('l1', 55) # index为4def list_iter(name):list_count = r.llen(name)for index in range(list_count):yield r.lindex(name, index)for item in list_iter('l1'):print(item)