一、基本使用
1、安装模块:pip install redis。
2、基本使用:
from redis import Redis # 导入模块 conn = Redis(host='127.0.0.1', port=6379) # 建立连接并获取连接对象 conn.set('name', 'jan') # 存入/修改 res = conn.get('name') # 获取
二、连接池
1、简述:可以存放多个redis连接,需要使用时,可以从连接池中拿出一个,用完会自动再返回连接池。
2、单列连接池:若每次要使用连接都新造连接池的话,会有多个连接池闲置,浪费资源,所以可以创建一个容量足够的单例连接池。
3、以模块导入的方式为例,创建单例连接池:
import redis # 创建一个容量为100的连接池 POOL = redis.ConnectionPool(host='127.0.0.1', port=6379, max_connections=100)
import redis from redis_pool import POOL # 导入连接池 # 从连接池中取出一个连接对象 conn = redis.Redis(connection_pool=POOL) conn.set('name', 'tom') res = conn.get('name')
三、string常用操作
1、conn.set(name, value, ex=None, px=None, nx=False, xx=False, keepttl=False):新建/修改。
①ex:过期时间,单位<秒>。
②px:过期时间,单位<毫秒>。
③nx:若设置为<True>,set操作只能新建,不能修改。
④xx:若设置为<True>,set操作只能修改,不能新建。
2、conn.mset(mapping):批量新建/批量修改。
①eg:conn.mset({'age1': 18, 'age2': 28})
3、conn.mget(keys, *args):批量获取。
①eg:conn.mget(['age1', 'age2'])
②eg:conn.mget('age1', 'age2')
4、conn.getset(name, value):获取原值并修改为新值。
①若name不存在,则新建,并返回None。
②eg:conn.getset('age1', 30)
5、conn.getrange(key, start, end):截取字符串的一部分,返回字符串,前闭后闭。
①eg:conn.getrange('name', 1, 3)
6、conn.incr(name, amount=1):累加。
①name:必须为纯数字。
②name:不存在则新建。
③amount:步长,默认为1,负数累减。
④eg:conn.incr('conut')
7、conn.decr(name, amount=1):累减,累加的反向操作。
8、conn.incrbyfloat(name, amount=1.0):小数累加,步长可为小数。
9、conn.append(key, value):拼接。
①相当于字符串相加。
②eg:conn.append('name', 'dsb')
四、hash常用操作
1、conn.hset(name, key=None, value=None, mapping=None):单键新增/修改。
①eg:conn.hset('stu1', 'age', 18)
②eg:conn.hset('stu1', {'name': 18})
2、conn.hget(name, key):获取指定键的值。
①eg:conn.hget('stu1', 'age')
3、conn.hmset(name, mapping):多键新增/修改。
①eg:conn.hmset('stu2', {'name': 'tom', 'age': 18})
4、conn.hmget(name, keys, *args):获取多键值,返回列表。
①eg:conn.hmget('stu2', 'name', 'age')
②eg:conn.hmget('stu2', ['name', 'age'])
5、conn.hgetall(name):获取所有键值,返回字典。
①eg:conn.hgetall('stu1')
6、conn.hlen(name):获取键的个数。
①eg:conn.hlen('stu1')
7、conn.hkeys(name):获取所有键,返回列表。
①eg:conn.hkeys('stu1')
8、conn.hvals(name):获取所有值,返回列表。
①eg:conn.hvals('stu1')
9、conn.hexists(name, key):判断指定键是否存在。
①conn.hexists('stu1', 'age')
10、conn.hdel(name, key) :删除指定键。
①conn.hdel('stu1', 'age')
11、conn.hincrby(name, key, amount=1):累加。
①key:必须为纯数字。
②key:不存在则新建。
②amount:步长,默认为1,负数累减。
12、conn.hincrbyfloat(name, key, amount=1.0):小数累加,步长可为小数。
13、conn.hscan(name, cursor=0, match=None, count=None):分页获取。
①eg:conn.hscan('stu1', cursor=0, match=None, count=None)
14、conn.hscan_iter(name, match=None, count=None):分页获取生成器。
①eg:conn.hscan_iter('stu1', match=None, count=None)
五、list常用操作
1、conn.lpush(name, *values):从左边加入若干个。
①列表不存在会新建。
②eg:conn.lpush('age_list', 1, 2, 3)
③eg:conn.lpush('age_list', *[1, 2, 3])
2、conn.lpushx(name, value):从左边加入一个。
①列表不存在,则操作无效。
②eg:conn.lpushx('age_list', 6)
3、conn.rpush(name, *values)和conn.rpushx(name, value):从右边加入若干个和加入一个。
4、conn.llen(name):统计列表的元素个数。
①eg:conn.llen('age_list')。
5、conn.linsert(name, where, refvalue, value):从某值前后加入一个。
①eg:conn.linsert('age_list', 'before', 3, 22)
②eg:conn.linsert('age_list', 'after', 3, 44)
6、conn.lset(name, index, value):从某索引位置加入一个。
①eg:conn.lset('age_list', 0, 111)
7、conn.lrem(name, count, value):从左边开始删除指定个数的指定值。
①count:负数从右边开始,为<0>代表所有。
②eg:conn.lrem('age_list', 0, 1)
8、conn.lpop(name):从左边开始弹出一个。
①eg:conn.lpop('age_list')
9、conn.rpop(name):从右边开始弹出一个。
10、conn.lindex(name, index):获取指定索引的值。
①eg:conn.lindex('age_list', 3)
11、conn.lrange(name, start, index):截取列表的一部分,返回列表,前闭后闭。
①eg:conn.lrange('age_list', 1, 3)
12、conn.ltrim(name, start, index):截留列表的一部分,其余的删除,前闭后闭。
①eg:conn.ltrim('age_list', 1, 3)
13、conn.blpop(keys, timeout=0)/conn.brpop(keys, timeout=0):阻塞式弹出。
①列表无值(列表不存在),则阻塞,直至有值可操作。
②timeout:阻塞等待时间,<0>代表无限。
14、conn.rpoplpush(src, dst):弹移。
①src:从原列表右侧弹出一个。
②dst:弹出的元素从左侧加入目标列表。
③eg:conn.rpoplpush('agr_list', 'tar_list')
15、conn.brpoplpush(src, dst):阻塞式弹移。
16、自定义分页获取列表数据:
def scan_list(name, count=2): # 默认每页显示2条 index = 0 # 从第一个数据开始 while True: data_list = conn.lrange(name, index, count + index - 1) # 从左边开始截取2条 if not data_list: # 截取不到则停止 return index += count if index == count: print('第一页') else: print('下一页') for item in data_list: yield item for age in scan_list('age_list', count=3): print(age)
六、其他通用常用操作
1、conn.delete(name):删除一条数据。
①eg:conn.delete('new_list')
2、conn.exists(name):判断某条数据是否存在。
①eg:conn.exists('new_list')
3、conn.keys(attern='*'):过滤查询。
①eg:conn.keys('dsb*') --- 查询以<dsb>开头的所有key。
4、conn.expire(name, time):设置过期时间,单位为<秒>。
①eg:conn.expire('age_list', 5)
5、conn.type(name):查看某条数据的类型。
①eg:conn.type('age_list')
七、redis管道
1、简介:redis没有专门的事务机制,但是可以通过管道来实现事务的效果。
2、代码:
pipe = conn.pipeline(transaction=True) # 生成管道对象 pipe.multi() # 声明管道可放多条指令 pipe.set('name', 'tom') # 向管道投放任务 pipe.set('age', 18) pipe.execute() # 所有任务投放完毕,执行该行,所有任务会统一执行,若有一条异常,则都不生效