python 实现 redis 数据库的操作
作者:autofelix
这篇文章主要介绍了python 包 redis 数据库的操作教程,redis 是一个 Key-Value 数据库,下文基于python的相关资料展开对redis 数据库操作的详细介绍,需要的小伙伴可以参考一下
一、安装
- redis 是一个 Key-Value 数据库
- Value 支持 string(字符串),list(列表),set(集合),zset(有序集合),hash(哈希类型)等类型
pip install redis
二、连接
import redis # 方式一 r = redis.StrictRedis(host='localhost', port=6379, db=0) # 方式二 r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 方式三,连接池 pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(host='localhost', port=6379, decode_responses=True)
三、string基本命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 设置值并设置过期时间, ex单位: 秒 r.set('food', 'mutton', ex=3) # 获取值 r.get('food') # 设置值并设置过期时间, px单位: 毫秒 r.set('food', 'beef', px=3) # nx=True时,则只有name不存在时,当前set操作才执行 r.set('fruit', 'watermelon', nx=True) # xx=True时,则只有name存在时,当前set操作才执行 r.set('fruit', 'watermelon', xx=True) # setnx设置值,只有name不存在时,执行设置操作 r.setnx('fruit1', 'banana') # setex第一个参数是key,第二个是过期时间(秒),第三个是值 r.setex("fruit2", 5, "orange") # psetex第一个参数是key,第二个是过期时间(毫秒),第三个是值 r.psetex("fruit3", 5000, "apple") # 批量设置值 mset(*args, **kwargs) r.mset(k1="v1", k2="v2") # 批量获取 r.mget('k1', 'k2') r.mget(['k1', 'k2']) # 设置新值并获取原来的值 r.getset("food", "barbecue") # 获取子序列(根据字节获取,非字符) r.getrange("cn_name", 0, 2) r.getrange("en_name", 0, -1) # 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加) r.setrange("en_name", 1, "ccc") # 对 name 对应值的二进制表示的位进行操作 r.setbit(name, offset, value) # 获取name对应的值的二进制表示中的某位的值,0或1 r.getbit("foo1", 0) # 获取name对应的值的二进制表示中 1 的个数 r.bitcount("foo",0,1) # 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值 r.bitop("AND","new","foo","foo1") # 返回name对应值的字节长度(一个汉字3个字节) r.strlen("foo") # 自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增。 r.incr("foo", amount=1) # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。 r.incrbyfloat("foo1", amount=2.0) # 自减 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自减。 r.decr("foo4", amount=3) # 在redis name对应的值后面追加内容 r.append("name", "haha")
四、hash基本命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # name对应的hash中设置一个键值对(不存在,则创建;否则,修改) r.hset("hash1", "k1", "v1") # 在name对应的hash中批量设置键值对 r.hmset("hash2", {"k2": "v2", "k3": "v3"}) # 在name对应的hash中获取根据key获取value r.hmget("hash2", "k2", "k3") r.hmget("hash2", ["k2", "k3"]) # 取出所有的键值对 r.hgetall("hash1") # 得到所有键值对的格式 hash长度 r.hlen("hash1") # 得到所有的keys(类似字典的取所有keys) r.hkeys("hash1") # 得到所有的value(类似字典的取所有value) r.hvals("hash1") # 判断成员是否存在(类似字典的in) r.hexists("hash1", "k4") # 删除键值对 r.hdel("hash1", "k1") # 自增自减整数 r.hincrby("hash1", "k3", amount=-1) # 自增自减浮点数 r.hincrbyfloat("hash1", "k5", amount=-1.0) # 取值查看--分片读取 r.hscan("hash1") # 利用yield封装hscan创建生成器,实现分批去redis中获取数据 for item in r.hscan_iter('hash1'): print(item) print(r.hscan_iter("hash1"))
五、list基本命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 增加 (从左边新增加)--没有就新建 r.lpush("list1", 11, 22, 33) # 增加(从右边增加)--没有就新建 r.rpush("list2", 11, 22, 33) # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边 r.lpushx("list10", 10) # 往已经有的name的列表的右边添加元素,没有的话无法创建 r.rpushx("list2", 99) # 在name对应的列表的某一个值前或后插入一个新值 r.linsert("list2", "before", "11", "00") # 修改(指定索引号进行修改) r.lset("list2", 0, -11) # 删除(指定值进行删除) r.lrem("list2", "11", 1) # 删除并返回 r.lpop("list2") # 删除列表最左边的元素,并且返回删除的元素 r.rpop("list2") # 删除列表最右边的元素,并且返回删除的元素 # 删除索引之外的值 r.ltrim("list2", 0, 2) # 根据索引号取值 r.lindex("list2", 0) # 移动 元素从一个列表移动到另外一个列表 r.rpoplpush("list1", "list2") # 移动 元素从一个列表移动到另外一个列表 可以设置超时 r.brpoplpush("list1", "list2", timeout=2) # 一次移除多个列表 r.blpop(["list10", "list11"], timeout=2) # 自定义增量迭代 def list_iter(name): """ 自定义redis列表增量迭代 :param name: redis中的name,即:迭代name对应的列表 :return: yield 返回 列表元素 """ list_count = r.llen(name) for index in range(list_count): yield r.lindex(name, index)
六、set基本命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 新增 r.sadd("set1", 33, 44, 55, 66) # 获取元素个数 类似于len r.scard("set1") # 获取集合中所有的成员 r.smembers("set1") # 获取集合中所有的成员--元组形式 r.sscan("set1") # 获取集合中所有的成员--迭代器的方式 for i in r.sscan_iter("set1"): print(i) # 差集 r.sdiff("set1", "set2") # 差集--差集存在一个新的集合中 r.sdiffstore("set3", "set1", "set2") # 交集 r.sinter("set1", "set2") # 交集--交集存在一个新的集合中 r.sinterstore("set3", "set1", "set2") # 并集 r.sunion("set1", "set2") # 并集--并集存在一个新的集合 r.sunionstore("set3", "set1", "set2") # 判断是否是集合的成员 类似in r.sismember("set1", 33) # 移动 将某个成员从一个集合中移动到另外一个集合 r.smove("set1", "set2", 44) # 删除--随机删除并且返回被删除值 r.spop("set2") # 删除--指定值删除 r.srem("set2", 11)
七、zset基本命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 新增 r.zadd("zset2", 'm1', 22, 'm2', 44) # 获取有序集合元素个数 类似于len r.zcard("zset1") # 获取有序集合的所有元素 r.zrevrange("zset1", 0, -1) # 获取所有元素--迭代器 for i in r.zscan_iter("zset3"): # 遍历迭代器 print(i) # 获取name对应的有序集合中分数 在 [min,max] 之间的个数 r.zcount("zset3", 11, 22) # 自增 r.zincrby("zset3", "n2", amount=2) # 获取值的索引号 r.zrank("zset3", "n1") # 删除--指定值删除 r.zrem("zset3", "n3") # 删除--根据排行范围删除,按照索引号来删除 r.zremrangebyrank("zset3", 0, 1) # 删除--根据分数范围删除 r.zremrangebyscore("zset3", 11, 22) # 获取值对应的分数 r.zscore("zset3", "n27")
八、其他通用命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 删除 根据删除redis中的任意数据类型 r.delete("gender") # 检查名字是否存在 r.exists("zset1") # 模糊匹配 根据模型获取redis的name r.keys("foo*") # 设置超时时间 r.expire("list5", time=3) # 重命名 r.rename("list5", "list5-1") # 随机获取name r.randomkey() # 获取类型 r.type("set1") # 查询所有的Key r.keys() # 当前redis包含多少条数据 r.dbsize() # 清空r中的所有数据 r.flushdb()
九、管道命令
- redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作
- 如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令
- 并且默认情况下一次pipline 是原子性操作
- 管道(pipeline)是redis在提供单个请求中缓冲多条服务器命令的基类的子类
- 它通过减少服务器-客户端之间反复的TCP数据库包
- 从而大大提高了执行批量命令的功能
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 默认的情况下,管道里执行的命令可以保证执行的原子性 # 默认 pipe = r.pipeline(transaction=True) # 禁止 pipe = r.pipeline(transaction=False) # 创建一个管道 pipe = r.pipeline() pipe.set('name', 'jack') pipe.set('role', 'sb') pipe.sadd('faz', 'baz') pipe.incr('num') pipe.execute() # 或者写成 pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute() print(r.get("name")) print(r.get("role")) print(r.get("num"))
到此这篇关于python 包 redis 数据库的操作教程的文章就介绍到这了,更多相关 redis 数据库操作 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!