Redis - Python 客户端基本使用指南

概述

参考:python 模块Redis模块,连接Redis数据库

Python 中的 Redis 客户端库允许开发者与 Redis 数据库进行交互。这些库允许在 Python 中连接到 Redis、执行命令以读取或写入数据,并处理 Redis 数据。

以下是一些常见的 Python Redis 客户端库:

  • redis 库:是 Python 中最常用的 Redis 客户端库之一。它提供了与 Redis 数据库的高度集成,支持 Python 2.x 和 3.x 版本。它具有易于使用的 API,可以轻松地执行 Redis 命令,例如设置值、获取值、处理列表、集合、有序集合等。

    注:python 的 redis 库支持直连和哨兵模式,但并不支持集群模式,推荐库:redis-py-cluster

    安装命令:pip install redis

  • redis-py-cluster 库:是 Python 中的一个用于连接和操作 Redis 集群的客户端库,允许以编程方式连接到 Redis 集群,并执行各种操作,而无需手动管理分片和节点。

    Redis 集群是 Redis 数据库的一种分布式部署方式,通过将数据分片存储在不同的 Redis 实例上来提供高可用性和横向扩展性。

    主要特点和功能:

    • 自动节点发现:允许指定一个或多个节点的初始连接地址,然后会自动发现集群中的其他节点,不需要手动配置每个节点的连接信息。
    • 自动分片:可以自动将操作路由到正确的节点和分片,不需要手动计算分片和维护节点列表。
    • 高可用性:支持 Redis 集群的故障转移和自动重新连接,确保在节点故障或网络问题后的连续可用性。
    • 支持常用 Redis 命令:可以使用执行常见的 Redis 命令,如 SET、GET、HGET、HSET、DEL、INCR、DECR 等。
    • 线程安全:是线程安全的,可以在多线程应用程序中使用。

    安装命令:pip install redis-py-cluster


连接 redis 数据库

单点 | 直连模式

  • 同步连接

    连接方法:

    redis.Redis(
        host='localhost', 	# ip地址
        port=6379, 			# 端口
        db=0, 				# 数据库,默认 0
        password=None, 		# 密码
        single_connection_client=False, 	# True时,不使用连接池
        connection_pool=None, 				# 连接池
        decode_responses=False, 			# 默认为False,若设置为True,则在获取数据时将字节解码为字符串(utf-8)
        socket_timeout=None, 				# 响应的时间
        socket_connect_timeout=None, 		# 建立连接超时时间
        retry_on_timeout=False, 			# True时, 命令超时后,将会重试一次, 重试成功则正常返回; 失败则抛出timeout异常;False时直接抛出异常
        retry_on_error=None, 		# 重试错误列表
        max_connections=None, 		# 最大连接数
    )
    

    示例:

    import redis
    
    connect = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)
    connect.set('test','哈哈哈哈')
    print(connect.get('test'))
    
  • 异步连接

    redis.asyncio.Redis() :异步连接 redis 数据库,参数同 redis.Redis()

    示例:

    import asyncio
    import redis.asyncio as redis
    
    async def run():
        async with redis.Redis(host='127.0.0.1',port=6379,decode_responses=True) as connect:
            await connect.set('test','我是异步')
            result = await connect.get('test')
            print(result)
    
    asyncio.run(run())
    

哨兵模式

  • 示例:

    from redis.sentinel import Sentinel
    
    sentinel_nodes = [('192.168.1.110', 16380), ('192.168.1.110', 16381), ('192.168.1.110', 16382)]
    sentinel = Sentinel(sentinel_nodes, sentinel_kwargs={'password': '123456'}, db=0, socket_timeout=0.5)
    master = sentinel.master_for('mymaster', password='123456')
    slave = sentinel.slave_for('mymaster', password='123456')
    print(master.llen('test'))
    

集群模式

  • 示例:

    from rediscluster import StrictRedisCluster
    
    redis_nodes = [{'host':'192.168.1.110','port':13790},
                   {'host':'192.168.1.110','port':13791},
                   {'host':'192.168.1.110','port':13793},
                   {'host':'192.168.1.120','port':13794}]
    redisconn = StrictRedisCluster(startup_nodes=redis_nodes, decode_responses=True, password='123456')
    redisconn.set("name", "helloworld")
    print("My name is: ", redisconn.get('name'))
    

redis.connect 常用方法

注:以下方法,异步需要使用 async await

字符串操作

设置值

  • set(name, value, ex=None, px=None, nx=False, xx=False) :设置指定 key 的值
    • name :键名
    • value :键对应的值
    • ex :可选,设置键的过期时间,单位是秒
    • px :可选,设置键的过期时间,单位是毫秒
    • nx :可选,默认为 False,如果设置为 True,只有当键不存在时才设置值
    • xx :可选,默认为 False,如果设置为 True,只有当键已存在时才设置值
  • setnx(name, value) :设置值,只有 name 不存在时,执行设置操作
  • setex(name, time, value)) :设置值
    • time :过期时间(秒)
  • psetex(name, time_ms, value) :设置值
    • time_ms :过期时间(毫秒)
  • mset({name1:value1, name2:value2, name3:value3, …}) :批量设置值

获取值、删除值

  • get(name) :获取指定 key 的值

    • name:键名
  • mget(name1, name2, name3, …) :批量获取值

  • getrange(name, start, end) :获取部分值

    • start :开始 index
    • end :结束 index,不包含结束 index 的字符
  • getset(name,value) :设置新值,并获取旧值

  • *delete(names) :删除一个或多个 key

    • names :要删除的键名

其他

  • setrange(name, offset, value) :从指定字符串索引 offset 开始,替换字符串
  • append(name, value) :在原有字符基础上追加字符
  • strlen(name) :返回 name 对应值的字节长度(一个汉字 3 个字节)
  • incr(name, amount=1) :自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增
  • decr(name, amount=1) :自减 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自减
  • incrby(name, amount=1) :在原有数值基础上加上一定的数值,当 name 不存在时,则创建 name=amount
  • decrby(name, amount=1) :在原有数值基础上减去一定的数值,当 name 不存在时,则创建 name=amount
  • incrbyfloat(name, amount=1.0) :自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增。
  • setbit(name, offset, value) :对 name 对应值的二进制表示的位进行操作
  • getbit(name, offset) :获取 name 对应的值的二进制表示中的某位的值 (0 或1 )
  • bitcount(key, start=None, end=None) :获取 name 对应的值的二进制表示中 1 的个数

列表操作

  • *lpush(name, values) :将一个或多个值插入列表头部(左侧)
    • name :列表名
    • values :一个或多个值
  • *rpush(name, values) :将一个或多个值插入列表尾部(右侧)
  • lpushx(name, value) :向已有 name 的列表的左边添加元素,没有的话无法创建
  • rpushx(name, value) :向已有 name 的列表的右边添加元素,没有的话无法创建
  • linsert(name, where, refvalue, value) :在name对应的列表的某一个值前或后插入一个新值
    • where :BEFORE或AFTER
    • refvalue :标杆值,即:在它前后插入数据
    • value :要插入的数据
  • lset(name, index, value) :指定索引位置重新赋值
  • lrange(name, start, end) :在 name 对应的列表中取出 start - end 索引之间的值,包含 end
  • llen(name) :获取 name 列表中值的数量
  • lindex(index) :取值(根据索引号取值)
  • lpop(name) :移除并返回列表左侧的第一个元素
  • rpop(name) :移除并返回列表右侧的第一个元素
  • *blpop(keys, timeout) :将多个列表排列,按照从左到右去移除对应列表的元素
  • *brpop(keys, timeout) :将多个列表排列,按照从右到左去移除各个列表内的元素
  • rpoplpush(src, dst, timeout ) :从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
    • src :要取数据的列表的 name
    • dst :要添加数据的列表的 name
  • brpoplpush(src, dst, timeout=0) :从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧
    • timeout :当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞
  • lrem(name, value, num) :删除指定的 value,num 为负数时从后向前删除
  • ltrim(name, start, end) :在 name 对应的列表中移除没有在 start - end 索引之间的值

哈希操作

  • hset(name, key, value) :在哈希表中设置字段的值
    • name :哈希表名
    • key :字段名
    • value :字段的值
  • hsetnx(name, key, value) :设置值,只有 name 不存在时,执行设置操作
  • hmset(name, {key1:value1, key2:value2, key3:value3, …}) :批量添加值
  • hget(name, key) :获取哈希表中 key 字段的值
  • *hmget(name, keys) :获取哈希表中一个或多个字段的值
  • hgetall(name) :取出所有的值
  • hkeys(name) :获取所有的 key
  • hvals(name) :获取所有的 value
  • hlen(name) :获取 hash 中键值对的个数
  • hstrlen(name, key) :获取指定 key 值的长度
  • *hdel(name, keys) :删除哈希表中一个或多个字段
  • hexists(name, key) :判断 hash 中 key 是否存在
  • hincrby(name, key, amount=1) :自增自减数(正数自增,负数自减)
  • hincrbyfloat(name, key, amount=1.0) :自增自减浮点数(正浮点数自增,负浮点数自减)
  • hscan(name, cursor=0, match=None, count=None) :取值查看–分片读取
    • cursor :游标(基于游标分批取获取数据)
    • match :匹配指定 key,默认 None,表示所有的 key
    • count :每次分片最少获取个数,默认 None,表示采用 Redis 的默认分片个数
  • hscan_iter(name, match=None, count=None) :利用 yield 封装 hscan 创建生成器,实现分批去 redis 中获取数据
    • match :匹配指定 key,默认 None,表示所有的key
    • count :每次分片最少获取个数,默认 None,表示采用 Redis 的默认分片个数

集合操作

  • sadd(name, values) :向集合添加一个或多个元素
    • name :集合名
    • values :一个或多个元素
  • smembers(name) :获取集合中的所有元素
  • scard(name) :获取name集合中的个数
  • srandmember(namem,num) :从集合随机取出 num 个元素
  • srem(name, values) :从集合中删除一个或多个元素
  • spop(name) :从集合移除一个成员,并将其返回,说明一下,集合是无序的,所有是随机删除的
  • smove(src, dst, value) :将某个成员从一个集合中移动到另外一个集合
  • sismember(name, value) :检查 value 是否是 name 对应的集合的成员,结果为 True 和 False
  • sdiff(keys) :获取多个集合的差集
  • *sdiffstore(dest, keys) :获取多个集合的差集,并存进一个新的集合
  • sinter(keys) :获取多个集合的交集
  • *sinterstore(dest, keys) :获取多个集合的差集,并存进一个新的集合
  • sunion(keys) :获取多个集合的并集
  • *sunionstore(dest, keys) :获取多个集合的并集,并存进一个新的集合

有序集合操作

  • zadd(name, mapping) :向有序集合添加一个或多个成员

    • name :有序集合名
    • mapping :成员及其分数的字典

    其他可选参数:

    • nx :强制 ZADD 只创建新元素而不更新已经存在的元素的分数。默认 False

    • xx :强制 ZADD 只更新已经存在的元素的分数存在。不会添加新元素。默认 False

    • ch :将返回值修改为已更改的元素数。更改的元素包括添加的新元素和元素谁的分数变了。默认 False

    • incr :修改 ZADD 的行为像 ZINCRBY。默认 False

      在这种模式下,只有 a 可以指定单个元素/分数对,分数是数量现有的分数将增加到。

      使用此模式时 ZADD 的返回值将是元素的新分数。

    • lt :仅在新分数小于时更新现有元素当前分数。这个标志不会阻止添加新元素。默认 False

    • gt :仅在新分数大于时更新现有元素当前分数。这个标志不会阻止添加新元素。默认 False

  • zrange(name, start, end) :按分数范围获取有序集合的成员

    • start :分数的起始值
    • end :分数的结束值

    其他可选参数:

    • desc :排序规则,默认按照分数从小到大排序。默认 False
    • withscores :是否获取元素的分数,默认只获取元素的值。默认 False
    • score_cast_func :对分数进行数据转换的函数。默认 float
  • zrevrange(name, start, end) :从大到小排序(同 zrange 默认排序,集合是从大到小排序的)

    其他可选参数:

    • withscores :是否获取元素的分数,默认只获取元素的值 。默认 False
    • score_cast_func :对分数进行数据转换的函数。默认 float
  • zrangebyscore(name, min, max) :按照分数范围获取 name 对应的有序集合的元素

    • min :最小值
    • max :最大值

    其他可选参数:

    • start :有序集合索引起始位置(非分数)。默认 None
    • num :获取数量。默认 None
    • withscores :是否获取元素的分数,默认只获取元素的值 。默认 False
    • score_cast_func :对分数进行数据转换的函数。默认 float
  • zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float) :按照分数范围获取有序集合的元素并排序(默认从大到小排序)

  • zscan(name, cursor=0, match=None, count=None, score_cast_func=float) :获取所有元素

  • zscan_iter(name, match=None, count=None, score_cast_func=float) :获取所有元素–迭代器

  • zcard(name) :获取元素集合中的个数

  • *zrem(name, values) :从有序集合中删除一个或多个成员

  • zremrangebyrank(name, min, max) :根据索引范围删除

  • zremrangebyscore(name, min, max) :根据分数范围删除

  • zcount(name, min, max) :获取 name 对应的有序集合中分数在 [min,max] 之间的个数

  • zincrby(name, value, amount) :自增自减数(正数自增,负数自减)

  • zrank(name, value) :获取索引,按照分数顺序(从小到大)

  • zrevrank(name, value) :获取索引,按照倒序(从大到小)

  • zscore(name, value) :获取对应值的分数


键的相关通用操作

  • dbsize() :返回服务器中的键数
  • keys(pattern) :返回匹配 “pattern” 的键列表,不传返回全部
  • scan_iter(match, count) :返回匹配 match 键迭代器,不传返回全部
  • move(name, db) :将键 name 移动到另一个数据库 db
  • flushall(asynchronous=False) :删除当前主机上所有数据库中的所有键,asynchronous 是否异步
  • flushdb(asynchronous=False) :删除当前数据库中的所有键,asynchronous 是否异步
  • dump(name) :返回存储在指定键处的值的序列化版本
  • type(name) :返回键类型
  • rename(src, dst) :重命名键 src 为 dst
  • renamex(src, dst) :如果 dst 不存在,则将 src 重命名为 dst
  • exists(names) :一个或多个由 “names” 指定的键是是否存在

过期时间

  • expire(name, time, nx=False, xx=False, gt=False, lt=False) :为键 name 设置过期时间
    • time :过期时间,单位:秒
    • nx :仅当密钥没有过期时设置过期
    • xx :仅当密钥已存在过期时才设置过期
    • gt :仅当新过期时间大于当前过期时间时设置过期时间
    • lt :仅在新到期时间小于当前到期时间时设置到期时间
  • expireat(name, when, nx=False, xx=False, gt=False, lt=False) :为键 name 设置过期时间
    • when :可以表示为整数表示 unix 时间或 Python datetime 对象
  • pexpire(name, time, nx=False, xx=False, gt=False,lt=False) :为键 name 设置过期时间
    • time :过期时间,单位:毫秒
  • ttl(name) :返回键 name 到期前的秒数
  • pttl(name) :返回键 name 到期前的毫秒数
  • persist(name) :删除 name 的过期
  • time() :获取 redis 服务端的当前时间。它返回一个包含两个元素的数组,其中第一个元素是当前时间的秒数(自 Unix 时间戳的起始点以来的秒数),第二个元素是当前时间的微秒数。

连接状态和数据持久化

  • close() :关闭 Redis 连接
  • ping() :判断服务器是否连接成功
  • select(index) :切换数据库
  • save() :持久化数据
  • bgsave() :异步持久化数据
  • shutdonw(save=False, nosave=False, now=False, force=False, abort=False) :如果 Redis 配置了持久化,数据将在关机前被刷新
    • save :会强制执行 DB 保存操作
    • nosave :将阻止数据库保存操作,即使有一个或多个保存点配置
    • now :跳过等待滞后副本,即它绕过了第一步关机顺序
    • force :忽略任何通常会阻止服务器退出的错误
    • abort :取消正在进行的关机,不能与其他标志结合使用
  • lastsave() :获取 Redis 数据库中最后一次成功执行持久化操作的时间戳(一个 Python datetime 对象),也就是最后一次生成 RDB 快照的时间。

连接池

  • redis.ConnectionPool(option)

    option参数大部分和 redis.Redis 一致

    连接池的原理是,通过预先创建多个连接,当进行 redis 操作时,直接获取已经创建的连接进行操作,而且操作完成后,不会释放,用于后续的其他 redis 操作,这样就达到了避免频繁的 redis 连接创建和释放的目的,从而提高性能。

    redis 模块采用 ConnectionPool 来管理对 redis server 的所有连接

    import redis
    
    pool = redis.ConnectionPool(host='127.0.0.1', port=6379, decode_responses=True)
    connect = redis.Redis(connection_pool=pool)
    connect.set('name','数据库0')
    print(connect.get('name'))
    
  • redis.BlockingConnectionPool(option)

    option 参数大部分和 redis.Redis 一致

    BlockingConnectionPool 和 ConnectionPool 功能是一样的,但是是线程安全的,在多线程的环境下,建议用BlockingConnectionPool,比如 gunicorn 使用了多线程的 worker。同时,当所有连接都在使用时,获取可用连接不会抛异常,而是可以设置等待时间。

<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨鸦_Cormorant

大家喜欢的话可以点个关注投币哟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值