Python操作Redis_服务端


Part1前言

前面我们都是使用 ​​Redis​​​ 客户端对 ​​Redis​​​ 进行使用的,但是实际工作中,我们大多数情况下都是通过代码来使用 ​​Redis​​​ 的,由于小编对 ​​Python​​​ 比较熟悉,所以我们今天就一起来学习下如何使用 ​​Python​​​ 来操作 ​​Redis​​。

Part2环境准备

  • ​Redis​​ 首先需要安装好。
  • ​Python​​​ 安装好(建议使用​​Python3​​)。
  • ​Redis​​​ 的​​Python​​​ 库安装好(​​pip install redis​​)。

Part3开始实践

1小试牛刀

例:我们计划通过 ​​Python​​​ 连接到 ​​Redis​​​。然后写入一个 ​​kv​​​,最后将查询到的 ​​v​​ 打印出来。

直接连接

#!/usr/bin/python3

import redis # 导入redis模块

r = redis.Redis(host='localhost', port=6379, password="pwd@321", decode_responses=True) # host是redis主机,password为认证密码,redis默认端口是6379
r.set('name', 'phyger-from-python-redis') # key是"name" value是"phyger-from-python-redis" 将键值对存入redis缓存
print(r['name']) # 第一种:取出键name对应的值
print(r.get('name')) # 第二种:取出键name对应的值
print(type(r.get('name')))

Python操作Redis_redis_02执行结果Python操作Redis_redis_03服务端查看客户端列表

其中的 ​​get​​ 为连接池最后一个执行的命令。

连接池

通常情况下,需要连接 ​​redis​​​ 时,会创建一个连接,基于这个连接进行 ​​redis​​ 操作,操作完成后去释放。正常情况下,这是没有问题的,但是并发量较高的情况下,频繁的连接创建和释放对性能会有较高的影响,于是连接池发挥作用。

连接池的原理:预先创建多个连接,当进行 ​​redis​​​ 操作时,直接获取已经创建好的连接进行操作。完成后,不会释放这个连接,而是让其返回连接池,用于后续 ​​redis​​ 操作!这样避免连续创建和释放,从而提高了性能!

#!/usr/bin/python3

import redis,time # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库

pool = redis.ConnectionPool(host='localhost', port=6379, password="pwd@321", decode_responses=True) # host是redis主机,需要redis服务端和客户端都起着 redis默认端口是6379
r = redis.Redis(connection_pool=pool)
r.set('name', 'phyger-from-python-redis')
print(r['name'])
print(r.get('name')) # 取出键name对应的值
print(type(r.get('name')))

Python操作Redis_redis_04执行结果

你会发现,在实际使用中直连和使用连接池的效果是一样的,只是在高并发的时候会有明显的区别。

2基操实践

对于众多的 ​​Redis​​​ 命令,我们在此以 ​​SET​​ 命令为例进行展示。

格式:​ ​​set(name, value, ex=None, px=None, nx=False, xx=False)​

在 redis-py 中 set 命令的参数:


参数名

释义

ex

​<int>​​过期时间(m)

px

​<int>​​过期时间(ms)

nx

​<bool>​​如果为真,则只有 name 不存在时,当前 set 操作才执行

xx

​<bool>​​如果为真,则只有 name 存在时,当前 set 操作才执行

ex

我们计划创建一个 ​​kv​​​ 并且设置其 ​​ex​​​ 为 ​​3​​​,期待 ​​3​​​ 秒后此 ​​k​​​ 的 ​​v​​​ 会变为 ​​None​​。

#!/usr/bin/python3

import redis,time # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库

pool = redis.ConnectionPool(host='localhost', port=6379, password="pwd@321", decode_responses=True) # host是redis主机,需要redis服务端和客户端都起着 redis默认端口是6379
r = redis.Redis(connection_pool=pool)
r.set('name', 'phyger-from-python-redis',ex=3)
print(r['name']) # 应当有v
time.sleep(3)
print(r.get('name')) # 应当无v
print(type(r.get('name')))

Python操作Redis_服务端_053秒过期

nx

由于 px 的单位太短,我们就不做演示,效果和 ex 相同。

我们计划去重复 ​​set​​​ 前面已经 ​​set​​​ 过的 ​​name​​​,不出意外的话,在 ​​nx​​​ 为真时,我们将会 ​​set​​​ 失败。但是人如果 ​​set​​​ 不存在的 ​​name1​​,则会成功。

#!/usr/bin/python3

import redis,time # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库

pool = redis.ConnectionPool(host='localhost', port=6379, password="pwd@321", decode_responses=True) # host是redis主机,需要redis服务端和客户端都起着 redis默认端口是6379
r = redis.Redis(connection_pool=pool)
r.set('name', 'phyger-0',nx=3) # set失败
print(r['name']) # 应当不生效
r.set('name1', 'phyger-1',nx=3) # set成功
print(r.get('name1')) # 应当生效
print(type(r.get('name')))

Python操作Redis_服务端_06只有不存在的k才会被set

如上,你会发现 ​​name​​​ 的 ​​set​​​ 未生效,因为 ​​name​​​ 已经存在于数据库中。而 ​​name1​​​ 的 ​​set​​​ 已经生效,因为 ​​name1​​ 是之前在数据库中不存在的。

xx

我们计划去重复 ​​set​​​ 前面已经 ​​set​​​ 过的 ​​name​​​,不出意外的话,在 ​​nx​​​ 为真时,我们将会 ​​set​​​ 成功。但是人如果 ​​set​​​ 不存在的 ​​name2​​,则会失败。

#!/usr/bin/python3

import redis,time # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库

pool = redis.ConnectionPool(host='localhost', port=6379, password="pwd@321", decode_responses=True) # host是redis主机,需要redis服务端和客户端都起着 redis默认端口是6379
r = redis.Redis(connection_pool=pool)
r.set('name', 'phyger-0',xx=3) # set失败
print(r['name']) # 应当变了
r.set('name2', 'phyger-1',xx=3) # set成功
print(r.get('name2')) # 应当没有set成功
print(type(r.get('name')))

Python操作Redis_服务端_07只有存在的k才会被set

以上,就是今天全部的内容,更多信息建议参考 ​​redis​​ 官方文档。