redis 库是 python 专门操作 Redis 数据库的第三方库
redis 的安装和引用
安装 redis
pip install redis
引用 redis
import redis
连接到数据库
直接连接到数据库
# 创建数据库对象,连接数据库
client = redis.Redis(host='127.0.0.1', port=6379, password='123456', db=1)
使用连接池
使用连接池管理 redis 的连接,可以避免每次建立、释放连接的开销。
# 创建连接池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=1, max_connections=100, password='123456', decode_responses=True)
# 创建数据库对象,使用连接池管理
client = redis.Redis(connection_pool=pool)
数据库操作
redis 库没有直接切换数据库的功能,操作另一个数据库里的数据需要新建连接并指定数据库。
redis 不支持数据库切换,redis 也没有表结构等概念,所以 redis 没有对数据库的相关操作。
关于数据操作
redis 大部分的数据操作命令都可以作为 python 的 redis 库的方法进行使用。这里只列举一些常用方法。
通用数据操作
删除操作
方法 delete 能够删除若干个 key 及其 value,返回值是成功操作的记录个数,如果 key 不存在则忽略
res = client.delete(key, [key ...])
修改操作
方法 rename 能够修改 key 为 newkey,如果 newkey 存在则覆盖其 value,返回布尔值表示是否成功
res = client.rename(key, newkey)
查询操作
方法 exists 判断 key 是否存在,返回布尔值
res = client.exists(key)
方法 randomkey 能够随机返回一个数据库中存在的 key,如果没有则返回空
res = client.randomkey()
方法 type 能够返回某个键的数据类型,如果没有该 key 则返回空
res = client.type(key)
其他操作
方法 move 能够将 key 及其对应 value 移动到另一个数据库中,返回值为布尔值表示是否成功
res = client.move(key, db)
方法 expire 能够修改 key 的生存时间,成功返回1,否则返回0
res = client.expire(key, seconds)
方法 ttl 能够查询键的生存时间,如果没有键则返回空
res = client.ttl(key)
字符串数据操作
添加数据
1. set 添加(设置)单个键值对
如果没有相应的 key 则添加,如果有 key 则覆盖其值
res = client.set(name, value, ex=None, px=None, nx=False, xx=False)
- name: 键 key
- value: 值 value
- ex:过期时间(秒),时间到了后redis会自动删除
- px:过期时间(毫秒),时间到了后redis会自动删除。ex、px二选一即可
- nx:如果设置为True,则只有name不存在时,当前set操作才执行
- xx:如果设置为True,则只有name存在时,当前set操作才执行
- res: 返回值为是否操作成功
2. mset 添加(设置)多个键值对
如果没有相应的 key 则添加,如果有 key 则覆盖其值,此操作为原子操作,返回值为是否操作成功
data_dict = {
key1 : value1,
key2 : value2
}
res = client.mset(data_dict)
修改数据
1. setrange 根据索引修改值
res = client.setrange(name, offset, value)
- name: 键 key
- value: 修改的字符或字符串,修改位数根据 value 的长度从 offset 向后顺延
- offset: 偏移量,即字符串索引(下标),从0开始
- res: 返回修改后字符串长度
2. incr / decr 值自增/自减
值必须是整形或字符串型数值,否则会报错。默认增减量为 1,没有键则添加一个值为 0 的键,返回值为修改后的值
res = client.incr(key)
res = client.decr(key, 1)
res = client.incr(key, ‘4’)
3. incrbyfloat 值自增浮点数
incr 的浮点数版,需注意的是没有 decrbyfloat
res = client.incrbyfloat(key, 1.0)
4. append 字符串追加
在现有值后追加字符串,返回修改后字符串的长度
res = client.append(key, value)
查询数据
1. get 获取单个键的值
返回值为键对应的值,如果没有键则返回空
res = client.get(key)
2. mget 获取多个键的值
返回值为各键对应的值,如果没有键则对应的值返回空
res = client.mget(key1, key2)
res = client.mget([key1, key2])
3. getset 设置新值并返回旧值
如果没有键,则设置新值并返回空
res = client.getset(key, value)
4. getrange 根据索引获取键的部分值
start、end 表示开始和结束时候的索引,从0开始,左右闭合,越界忽略。如果完全越界或没有键则返回空
res = client.getrange(key, start, end)
5. strlen 获取值的长度
返回值的长度,如果没有键则返回0
res = client.strlen(key)
哈希表数据操作
添加数据
1. hset 添加/设置一个哈希表中的键值对
返回值为成功添加的数据个数(当使用 mapping 添加多个数据时)
res = client.hset(name, key, value)
2. hmset 添加/设置多个哈希表中的键值对
返回值为是否成功,mapping 是字典
res = client.hmset(name, mapping)
删除数据
1. hdel 删除哈希表中的键值对
返回删除的个数,没有的键将被忽略
res = client.hdel(name, keys)
修改数据
1. hincrby 自增哈希表中 key 对应的值(必须整数数值)
返回自增后的数值,若没有 key 则创建,且值为0,然后自增。
res = client.hincrby(name, key, amount=1)
2. hincrbyfloat hincrby 的小数版
res = client.hincrby(name, key, amount=1.0)
查询数据
1. hget 获取一个哈希表中的键的数据
res = client.hget(name, key)
2. hmget 获取多个哈希表中的键的数据
keys 可以是若干键名或键名组成的列表
res = client.hmget(name, keys)
3. hgetall 获取哈希表中所有的键值对
返回的是一个字典
res = client.hgetall(name)
4. hlen 获取哈希表的长度(键值对数量)
res = client.hlen(name)
5. hkeys 获取哈希表中所有的键
返回一个键名列表
res = client.hkeys(name)
6. hvals 获取哈希表中所有键的值
返回一个值列表
res = client.hvals(name)
7. hexists 检查哈希表中是否存在某个键
返回布尔值
res = client.hexists(name, key)
列表数据操作
添加数据
1. lpush / rpush 从左/右测添加元素
返回值是新列表长度
res = client.lpush(key, value [value …])
res = client.rpush(key, value [value …])
需注意的是使用 lpush 添加多个元素时,因为是以从左到右的顺序逐一从左到右往列表中添加(即最先添加的在最里面),所以顺序是反的。
2. lpushx / rpushx 从左/右侧添加元素都已存在的列表
返回值是新列表长度,需注意的是一次只能添加一个元素
res = client.lpushx(key, value)
res = client.rpushx(key, value)
3. linsert 在给定值前/后插入数据
返回值是新列表长度,如果是 -1 则是没找到 refvalue
res = client.linsert(name ,where, refvalue, value)
- name :键名 key
- where : 位置,BEFORE (前) 或 AFTER (后)
- refvalue : 指定值
- value : 插入的数据
删除数据
1. lren 删除列表中N个相同的值
返回值为删除的个数
res = lrem(name, value, num=0)
- name : 键名 key
- value : 需删除的值
- num : 删除的个数,正数表示从左往右删,负数表示从右往左删,0表示删除所有。
2. ltrim 删除索引范围外的所有值
返回是否成功
res = client.ltrim(key, start, end)
修改数据
1. lset 根据索引修改值
返回是否修改成功
res = clinet.lset(key, index, value)
查询数据
1. llen 查询列表长度
res = client.llen(key)
2. lindex 根据索引获取数据
res = client.lindex(key, index)
3. lrange 根据索引区间获取数据
区间以偏移量 start 和 stop 指定,超出区间可能取不到值,但是不会出错。start 和 stop 是索引(下标),从 0 开始,可以使用负数下标,即最后一个元素为 -1。取值使用左右闭合的原则,和 python 的左闭右开原则是不同的。
res = client.lrange(key, start, end)
4. lpop / rpop 弹出左/右侧的数据
返回弹出的数据
res = client.lpop(key)
res = client.rpop(key)
集合数据操作
添加数据
1. sadd 添加若干成员
返回添加元素(不计忽略)数量,若元素已有则忽略
res = client.sadd(name, *values)
删除数据
1. spop 弹出一个成员
res = client.spop(key)
2. srem 删除若干成员
返回成功删除元素个数
res = client.srem(name, *values)
查询数据
1. scard 查询成员数量
res = client.scard(key)
2. smembers 查询所有成员
res = client.smembers(key)
3. srandmember 随机获取成员
num 确定返回成员数量,若是多个成员则返回列表
res = client.srandmember(key, num=None)
4. sismember 判断成员是否存在
res = client.sismember(name, value)
有序集合数据操作
添加数据
1. zadd 添加/设置成员及分值
返回成功添加的成员数量,mapping 是成员和分值组成的字典。
res = client.zadd(name, mapping)
删除数据
1. zrem 删除若干成员
返回删除的个数
res = client.zrem(name, *values)
修改数据
4. zincrby 修改某个成员分数
成员存在则修改分数,不存在则添加该成员且分数从0起进行修改。返回修改后的分数
res = client.zincrby(name, value, amount=1)
查询数据
1. zcard 返回基数
res = client.zcard(key)
2. zcount 返回分值范围内的成员个数
区间左右闭合
res = client.zcount(key, min, max)
3. zscore 查询某个成员的分数
res = client.zscore(key, member)
4. zrank / zrevrank 返回按增序/降序排列某个成员的排名
res = client.zrank(name, value)
res = client.zrevrank(name, value)
5. zrange 返回排序范围内的成员和分数
res = client.zrange(name, start, end, desc=False, withscores=False, score_cast_func=float)
- name : 键名 key
- start : 查询起始排名
- end : 查询结束排名
- desc : 排名顺序,默认升序
- withscores : 是否返回成员分数
- score_cast_func : 对分数进行数据转换的函数
- res : 返回值,列表型,如果需要返回成员分数则是元组列表型。