Python redis 使用教程

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 自定义增量迭代:🎫由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要获取name对应的所有列表。但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:


1.安装模块


Python 要使用 redis,需要先安装 redis 模块:


pip install redis


测试安装:


redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串


r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set('name', 'dahezhiquan')  # 设置 name 对应的值
print(r['name'])  # dahezhiquan
print(r.get('name'))  # dahezhiquan
print(type(r.get('name')))  # <class 'str'>


2.连接池


redis-py 使用 connection pool 来管理对一个 redis server 的所有连接,避免每次建立、释放连接的开销。


默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个 Redis 实例共享一个连接池。


redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set('name', 'dahe')
print(r.get('name'))  # dahe


3.redis 基本命令 String


set,在 Redis 中设置值,默认,不存在则创建,存在则修改:🧨

语法:


set(name, value, ex=None, px=None, nx=False, xx=False)


参数:

  • ex - 过期时间(秒)
  • px - 过期时间(毫秒)
  • nx - 如果设置为True,则只有name不存在时,当前set操作才执行
  • xx - 如果设置为True,则只有name存在时,当前set操作才执行

案例1:(3秒后,name的值就会变为None)


redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set('name', 'xiaoqian', ex=3)  # 设置过期时间为3秒
print(r.get('name'))  # xiaoqian


三秒后再次获取name的值:


print(r.get('name'))  # None


mset,批量获取值:🎶


redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set("name1", "xiaoqian")
r.set("name2", "xiaoguo")
print(r.mget('name1', 'name2'))  # ['xiaoqian', 'xiaoguo']


getset(name, value),设置新值并获取原来的值:😒


redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
print(r.getset("name1", "heihei"))  # xiaoqian
print(r.get("name1"))  # heihei


strlen(name),返回name对应值的字节长度(一个汉字3个字节):🙌


print(r.strlen("name"))


incr(name, amount=1),自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增:🤣

参数:

  1. name - Redis的name
  2. amount - 自增数(必须是整数)


redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.set("like", 521)
r.incr("like", amount=1)
print(r.get("like"))  # 522


可以使用incrbyfloat方法自增浮点数类型

使用decr进行自减操作

append(key, value),在redis name对应的值后面追加内容:🥞

参数:

  • key - redis的name
  • value - 要追加的字符串


r.append("name1", "world")
print(r.get("name1"))


4.redis 基本命令 hash


hset(name, key, value),单个增加–修改:💗


name对应的hash中设置一个键值对(不存在,则创建;否则,修改)


参数:


name - redis的name

key - name对应的hash中的key

value - name对应的hash中的value


redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.hset("dahe", "name", "guo")
r.hset("dahe", "age", 28)
# 获取dahe的所有key
print(r.hkeys("dahe"))  # ['name', 'age']
print(r.hget("dahe", "name"))  # guo
print(r.hmget("dahe", "name", "age"))  # ['guo', '28']


hmset(name, mapping),在name对应的hash中批量设置键值对:🤦‍♀️


redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.hmset("hash1", {"k1": "v1", "k2": "v2", "k3": "v3"})
print(r.hmget("hash1", "k1", "k2", "k3"))  # ['v1', 'v2', 'v3']


hgetall(name),取出所有的键值对:🛒


print(r.hgetall("dahe"))  # {'name': 'guo', 'age': '28'}


hvals(name),得到所有的value:😗


print(r.hvals("dahe"))  # ['guo', '28']


hdel(name,*keys),将name对应的hash中指定key的键值对删除:😶‍🌫️


r.hdel("hash1", "k1")
print(r.hgetall("hash1"))  # {'k2': 'v2', 'k3': 'v3'}


hincrby(name, key, amount=1),自增自减整数:🌭


参数:


name - redis中的name

key - hash对应的key

amount - 自增数(整数,负数表示自减)

hincrbyfloat(name, key, amount=1.0)表示自增自减浮点数


5.redis基本命令 list


lpush(name,values),增加:🥞


在name对应的list中添加元素,每个新的元素都添加到列表的最左边

redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.lpush("score", 10, 20, 30, 40)
print(r.lrange("score", 0, -1))  # ['40', '30', '20', '10']


rpush表示从右边增加

r.lset(name, index, value),对name对应的list中的某一个索引位置重新赋值:🥯


参数:

  • name - redis的name
  • index - list的索引位置
  • value - 要设置的值


redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.lset("score", 0, 521)
print(r.lrange("score", 0, 4))  # ['521', '30', '20', '10', '40']

r.lrem(name, value, num),删除:🥩


参数:


name - redis的name

value - 要删除的值

num - num=0,删除列表中所有的指定值;

num=2 - 从前到后,删除2个, num=1,从前到后,删除左边第1个

num=-2 - 从后向前,删除2个


r.lrem("list2", "11", 1)    # 将列表中左边第一次出现的"11"删除
print(r.lrange("list2", 0, -1))
r.lrem("list2", "99", -1)    # 将列表中右边第一次出现的"99"删除
print(r.lrange("list2", 0, -1))
r.lrem("list2", "22", 0)    # 将列表中所有的"22"删除
print(r.lrange("list2", 0, -1))


lindex(name, index),取值:💕


print(r.lindex("list2", 0))  # 取出索引号是0的值


自定义增量迭代:🎫

由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要获取name对应的所有列表。

但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:


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)
# 使用
for item in list_iter('list2'): # 遍历这个列表
    print(item)


6.redis基本命令 set

sadd(name,values),新增:🥩


pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.sadd("set1", 33, 44, 55, 66)  # 往集合中添加元素
print(r.scard("set1"))  # 4(集合长度)
print(r.smembers("set1"))  # {'66', '44', '55', '33'}(取出集合所有元素)


srem(name, values),在name对应的集合中删除某些值:🌭


r.srem("set1", 66)
print(r.smembers("set1"))  # {'44', '33', '55'}


7.其他常用操作


delete(*names),删除:🧧


根据删除redis中的任意数据类型(string、hash、list、set、有序set)


pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
r.delete("set2")


expire(name ,time),为某个redis的某个name设置超时时间:😗


r.expire("set1", time=3)


rename(src, dst),重命名:🍠


r.rename("dahe", "dahe-1")


8.管道


redis默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline是原子性操作

实例:


pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r = redis.Redis(connection_pool=pool)
pipe = r.pipeline()  # 创建一个管道
pipe.set('name', 'jack')
pipe.set('role', 'sb')
pipe.sadd('age', '18')
pipe.execute()
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
JSON C语言 C++
【Python 基础教程 26】Python3标准库全面入门教程:一步步带你深入理解与应用
【Python 基础教程 26】Python3标准库全面入门教程:一步步带你深入理解与应用
63 1
|
1月前
|
编译器 测试技术 C++
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
165 0
|
1月前
|
存储 安全 API
【Python 基础教程 21】Python3 文件操作全面指南:从入门到精通的综合教程
【Python 基础教程 21】Python3 文件操作全面指南:从入门到精通的综合教程
82 0
|
5天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
89 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
1月前
|
存储 算法 数据挖掘
【Python 基础教程 25】全面入门指南:深度解析Python3的命名空间,作用域及变量使用教程
【Python 基础教程 25】全面入门指南:深度解析Python3的命名空间,作用域及变量使用教程
55 0
|
1月前
|
存储 机器学习/深度学习 数据安全/隐私保护
【Python 基础教程 24】全面入门Python面向对象编程:深度探索与实战教程
【Python 基础教程 24】全面入门Python面向对象编程:深度探索与实战教程
79 0
|
1月前
|
Linux 数据库连接 C++
【Python 基础教程 23】Python3 错误与异常处理全面指南:从入门到精通的实用教程
【Python 基础教程 23】Python3 错误与异常处理全面指南:从入门到精通的实用教程
110 0
|
1月前
|
监控 API C语言
【Python 基础教程 22】全面揭秘Python3 os模块:从入门到高级的实用教程指南
【Python 基础教程 22】全面揭秘Python3 os模块:从入门到高级的实用教程指南
62 1
|
1月前
|
存储 前端开发 C++
【Python 基础教程 09】全面掌握Python3列表:从入门到精通的综合教程与实战指南
【Python 基础教程 09】全面掌握Python3列表:从入门到精通的综合教程与实战指南
90 1
|
1月前
|
JSON C++ 数据格式
【Python 基础教程 08】全面入门到精通:Python3 字符串操作实战教程与深度指南
【Python 基础教程 08】全面入门到精通:Python3 字符串操作实战教程与深度指南
87 0

热门文章

最新文章