[转]使用python来操作redis用法详解
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = redis.ConnectionPool(**REDIS_CONF) self._client = redis.Redis(connection_pool=connection_pool)
1.字符类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class StringRedisClass(CommRedisBase): ''' 字符类 ''' def set(name, value, ex=None, px=None, nx=False, xx=False) ''' ex: 过期时间(秒) px: 过期时间(毫秒) nx: 如果设置为True: 则只有name不存在时: 当前set操作才执行 xx: 如果设置为True: 则只有name存在时: 当前set操作才执行 ''' def setnx(name, value) ''' 设置值: 只有name不存在时: 执行设置操作(添加) ''' def setex(name, value, time) ''' time: 过期时间(数字秒 或 timedelta对象) ''' def psetex(name, time_ms, value) ''' time_ms: 过期时间(数字毫秒 或 timedelta对象) ''' def mset(*args, **kwargs) ''' 批量设置值 ''' def mget(keys, *args) ''' 批量获取 ''' def getset(name, value) ''' 设置新值并获取原来的值 ''' def getrange(key, start, end) ''' 获取子序列(根据字节获取: 非字符) 参数: name: Redis 的 name start, 起始位置(字节) end, 结束位置(字节) ''' def setrange(name, offset, value) ''' 修改字符串内容: 从指定字符串索引开始向后替换(新值太长时: 则向后添加) 参数: offset: 字符串的索引: 字节(一个汉字三个字节) value: 要设置的值 ''' def setbit(name, offset, value) ''' 对name对应值的二进制表示的位进行操作 参数: name: redis的name offset: 位的索引(将值变换成二进制后再进行索引) value: 值只能是 1 或 0 ''' def getbit(name, offset) ''' 获取name对应的值的二进制表示中的某位的值 (0或1) ''' def bitcount(key, start=None, end=None) ''' 获取name对应的值的二进制表示中 1 的个数 参数: key: Redis的name start 字节起始位置 end: 字节结束位置 ''' def bitop(operation, dest, *keys) ''' 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值 参数: operation,AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或) dest, 新的Redis的name *keys,要查找的Redis的name ''' def strlen(name) ''' 返回name对应值的字节长度(一个汉字3个字节) ''' def incr(self, name, amount=1) ''' 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。 参数: name,Redis的name amount,自增数(必须是整数) 注:同incrby 应用场景 – 页面点击数 假定我们对一系列页面需要记录点击次数。例如论坛的每个帖子都要记录点击次数,而点击次数比回帖的次数的多得多。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。所以,点击数的增加使用redis的INCR命令最好不过了。 当redis服务器启动时,可以从关系数据库读入点击数的初始值(12306这个页面被访问了34634次) ''' def incrbyfloat(self, name, amount=1.0) ''' 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。 参数: name,Redis的name amount,自增数(浮点型) ''' def decr(self, name, amount=1) ''' 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。 参数: name,Redis的name amount,自减数(整数) ''' def append(key, value) ''' 在redis name对应的值后面追加内容 参数: key, redis的name value, 要追加的字符串 '''
2.hash类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class HSetRedisClass(CommRedisBase): ''' hash集合类 ''' def hset(name, key, value) ''' 单个增加--修改(单个取出)--没有就新增,有的话就修改 name对应的hash中设置一个键值对(不存在,则创建;否则,修改) 参数: name,redis的name key,name对应的hash中的key value,name对应的hash中的value 注: hsetnx(name, key, value),当name对应的hash中不存在当前key时则创建(相当于添加) ''' def hmset(name, mapping) ''' 批量增加 在name对应的hash中批量设置键值对 参数: name,redis的name mapping,字典,如:{'k1':'v1', 'k2': 'v2'} ''' def hget(name,key) ''' 在name对应的hash中获取根据key获取value hmget(name, keys, *args) 在name对应的hash中获取多个key的值 参数: name,reids对应的name keys,要获取key集合,如:['k1', 'k2', 'k3'] *args,要获取的key,如:k1,k2,k3 ''' def hgetall(name) ''' 获取name对应hash的所有键值 ''' def hlen(name) ''' 获取name对应的hash中键值对的个数 ''' def hkeys(name) ''' 获取name对应的hash中所有的key的值 ''' def hvals(name) ''' 获取name对应的hash中所有的value的值 ''' def hexists(name, key) ''' 检查name对应的hash是否存在当前传入的key ''' def hdel(name,*keys) ''' 将name对应的hash中指定key的键值对删除 ''' def hincrby(name, key, amount=1) ''' 自增name对应的hash中的指定key的值,不存在则创建key=amount 参数: name,redis中的name key, hash对应的key amount,自增数(整数) ''' def hincrbyfloat(name, key, amount=1.0) ''' 自增name对应的hash中的指定key的值,不存在则创建key=amount 参数: name,redis中的name key, hash对应的key amount,自增数(浮点数) 自增name对应的hash中的指定key的值,不存在则创建key=amount ''' def hscan(name, cursor=0, match=None, count=None) ''' 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆 参数: name,redis的name cursor,游标(基于游标分批取获取数据) match,匹配指定key,默认None 表示所有的key count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数 如: 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None) 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None) ... 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕 ''' def hscan_iter(name, match=None, count=None) ''' 利用yield封装hscan创建生成器,实现分批去redis中获取数据 参数: match,匹配指定key,默认None 表示所有的key count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数 '''
3.List
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class ListRedisClass(CommRedisBase): ''' redis集合List ''' def lpush(name,values) ''' 增加(类似于list的append,只是这里是从左边新增加)--没有就新建 在name对应的list中添加元素,每个新的元素都添加到列表的最左边 ''' def rpush(name,values) ''' 增加(从右边增加)--没有就新建 ''' def lpushx(name,value) ''' 往已经有的name的列表的左边添加元素,没有的话无法创建 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边 ''' def lpushx(name,value) ''' 往已经有的name的列表的右边添加元素,没有的话无法创建 ''' def linsert(name, where, refvalue, value) ''' 在name对应的列表的某一个值前或后插入一个新值 参数: name,redis的name where,BEFORE或AFTER refvalue,标杆值,即:在它前后插入数据 value,要插入的数据 ''' def lset(name, index, value) ''' 对name对应的list中的某一个索引位置重新赋值 参数: name,redis的name index,list的索引位置 value,要设置的值 ''' def lrem(name, value, num) ''' 在name对应的list中删除指定的值 参数: name,redis的name value,要删除的值 num, num=0,删除列表中所有的指定值; num=2,从前到后,删除2个; num=1,从前到后,删除左边第1个 num=-2,从后向前,删除2个 ''' def lpop(name) ''' 在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素 更多: rpop(name) 表示从右向左操作 ''' def ltrim(name, start, end) ''' 在name对应的列表中移除没有在start-end索引之间的值 参数: name,redis的name start,索引的起始位置 end,索引结束位置 ''' def lindex(name, index) ''' 在name对应的列表中根据索引获取列表元素 ''' def rpoplpush(src, dst) ''' 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边 参数: src,要取数据的列表的name dst,要添加数据的列表的name ''' def brpoplpush(src, dst, timeout=0) ''' 从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧 参数: src,取出并要移除元素的列表对应的name dst,要插入元素的列表对应的name timeout,当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞 ''' def blpop(keys, timeout) ''' 将多个列表排列,按照从左到右去pop对应列表的元素 参数: keys,redis的name的集合 timeout,超时时间,当元素所有列表的元素获取完之后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞 更多: r.brpop(keys, timeout) 同blpop,将多个列表排列,按照从右像左去移除各个列表内的元素 ''' def list_iter(name) ''' 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要: 获取name对应的所有列表 循环列表 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能 ''' list_count = llen(name) for index in range(list_count): yield lindex(name, index)
4.Set类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class SetRedisClass(): ''' Redis Set类 ''' def sadd(name,values) ''' name对应的集合中添加元素 ''' def scard(name) ''' 获取name对应的集合中元素个数 ''' def smembers(name) ''' 获取name对应的集合的所有成员 ''' def sscan(name, cursor=0, match=None, count=None) ''' 获取集合中所有的成员--元组形式 ''' def sscan_iter(name, match=None, count=None) ''' 获取集合中所有的成员--迭代器的方式 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大 ''' def sdiff(keys, *args) ''' 在第一个name对应的集合中且不在其他name对应的集合的元素集合 ''' def sdiffstore(dest, keys, *args) ''' 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中 ''' def sinter(keys, *args) ''' sinterstore(dest, keys, *args) 获取多一个name对应集合的并集,再将其加入到dest对应的集合中 ''' def sunion(keys, *args) ''' 获取多个name对应的集合的并集 ''' def sunionstore(dest,keys, *args) ''' 获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中 ''' def sismember(name, value) ''' 检查value是否是name对应的集合的成员,结果为True和False ''' def smove(src, dst, value) ''' 将某个成员从一个集合中移动到另外一个集合 ''' def spop(name) ''' 从集合移除一个成员,并将其返回,说明一下,集合是无序的,所有是随机删除的 ''' def srem(name, values) ''' 在name对应的集合中删除某些值 '''
5.有序集合ZSet
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class ZSetRedisClass(CommRedisBase): ''' 有序集合类 ''' def zadd(name, *args, **kwargs) ''' 在name对应的有序集合中添加元素 ''' def zcard(name) ''' 获取name对应的有序集合元素的数量 ''' def zrange( name, start, end, desc=False, withscores=False, score_cast_func=float) ''' 按照索引范围获取name对应的有序集合的元素 参数: name,redis的name start,有序集合索引起始位置(非分数) end,有序集合索引结束位置(非分数) desc,排序规则,默认按照分数从小到大排序 withscores,是否获取元素的分数,默认只获取元素的值 score_cast_func,对分数进行数据转换的函数 ''' def zrevrange(name, start, end, withscores=False, score_cast_func=float) ''' 从大到小排序(同zrange,集合是从大到小排序的) ''' def zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float) ''' 按照分数范围获取name对应的有序集合的元素 ''' def zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float) ''' 按照分数范围获取有序集合的元素并排序(默认从大到小排序) ''' def zscan(name, cursor=0, match=None, count=None, score_cast_func=float) ''' 获取所有元素--默认按照分数顺序排序 ''' def zscan_iter(name, match=None, count=None,score_cast_func=float) ''' 获取所有元素--迭代器 ''' def zcount(name, min, max) ''' 获取name对应的有序集合中分数 在 [min,max] 之间的个数 ''' def zincrby(name, value, amount) ''' 自增name对应的有序集合的 name 对应的分数 ''' def zrank(name, value) ''' 获取某个值在 name对应的有序集合中的索引(从 0 开始) 更多: zrevrank(name, value),从大到小排序 ''' def zrem(name, values) ''' 删除name对应的有序集合中值是values的成员 ''' def zremrangebyrank(name, min, max) ''' 根据排行范围删除 ''' def zremrangebyscore(name, min, max) ''' 根据分数范围删除 ''' def zscore(name, value) ''' 获取name对应有序集合中 value 对应的分数 '''
6.others
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
OtherRedisClass(): ''' 其他常用操作 ''' def delete(*names) ''' 根据删除redis中的任意数据类型(string、hash、list、set、有序set) ''' def exists(name) ''' 检测redis的name是否存在,存在就是True,False 不存在 ''' def keys(pattern='') ''' 根据模型获取redis的name 更多: KEYS * 匹配数据库中所有 key 。 KEYS h?llo 匹配 hello , hallo 和 hxllo 等。 KEYS hllo 匹配 hllo 和 heeeeello 等。 KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo ''' def expire(name ,time) ''' 为某个redis的某个name设置超时时间 ''' lpush("list5", 11, 22) expire("list5", time=3) print(r.lrange("list5", 0, -1)) time.sleep(3) print(r.lrange("list5", 0, -1)) def rename(src, dst) ''' 对redis的name重命名 ''' def randomkey() ''' 随机获取一个redis的name(不删除) ''' def type(name) ''' 获取name对应值的类型 ''' def scan(cursor=0, match=None, count=None) ''' 查看所有元素 ''' def scan_iter(match=None, count=None) ''' 查看所有元素--迭代器 ''' def get(name) ''' 查询key为name的值 ''' def dbsize() ''' 当前redis包含多少条数据 ''' def save() ''' 执行"检查点"操作,将数据写回磁盘。保存时阻塞 ''' def flushdb() ''' 清空redis中的所有数据 '''