实战|教你用Python玩转Redis

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
简介: 之前辰哥已经给大家教了Python如何去连接Mysql(实战|教你用Python玩转Mysql),并进行相应操作(插、查、改、删)。除了Mysql外,Python最常搭配的数据库还有Redis。那么今天辰哥就来给大家讲解一下Python如何使用Redis,并进行相关的实战操作。

大家好,我是辰哥。

之前辰哥已经给大家教了Python如何去连接Mysql(实战|教你用Python玩转Mysql),并进行相应操作(插、查、改、删)。除了Mysql外,Python最常搭配的数据库还有Redis。

那么今天辰哥就来给大家讲解一下Python如何使用Redis,并进行相关的实战操作。

提示:本文讲解了Redis常用的方法,推荐收藏。

01

Redis的安装

window版Redis安装包下载地址:

https://github.com/MicrosoftArchive/redis/releases

Linux版Redis安装包下载地址:

https://redis.io/download

上面两张图显示的都是截止到目前,Redis最新版本,辰哥已经把这上面提到的安装包下载好,后台回复:redis安装包,直接获取。

提示:这里就不在展示如何安装,基本都是下一步的操作。因为安装包可能有的读者不知道在哪下载,这里就讲一下。下面开始具体的实际操作。

02

Redis简介

Redis是一个key-value存储系统(数据库)。redis支持存储的value类型有很多种,如string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)。

为了保证效率,数据都是缓存在内存中。可以周期性的把更新的数据写入磁盘或者把修改操作写入追加文件。Redis提供了Python,Ruby,Java,Php的客户端,使用很方便,本文主要以Python来讲解Redis的操作。

1.安装redis库
通过下面命令进行安装

pip install redis
redis库:Python3链接redis

2.python连接redis
python连接redis分两种情况(一种是有密码,一种是无密码)

因为redis安装的时候,默认是无密码的

有密码:

import redis
r = redis.Redis(host="192.168.31.196", port=6379,password="123456")

密码是:123456,host是redis对应的主机ip,port是端口6379(redis默认端口)

无密码:

import redis
r = redis.Redis(host='192.168.31.196', port=6379)

上面的连接方式属于普通连接(相对于连接池来说),此外还有连接池(connection pool)的连接方式,可以管理所有的连接,避免每次建立、释放连接带来的开销。

连接池:

import redispool = redis.ConnectionPool(host='192.168.31.196', port=6379)

r = redis.Redis(connection_pool=pool)
先看一个例子

import redis
r = redis.Redis(host='192.168.31.196', port=6379)
r.set('name1', 'chenge') #添加
r.set('name2', '辰哥') #添加
print(r.get('name1')) #获取
print(r.get('name2')) #获取
在通过Python代码连接redis,并设置了两个key-value(name1:chenge 和 name2:辰哥)

可以看到这里英文正常显示,中文乱码,为了解决中文乱码问题,在连接Redis的时候,加入utf-8的编码格式

import redis
r = redis.Redis(host='192.168.31.196', port=6379,decode_responses=True, charset='UTF-8', encoding='UTF-8')
r.set('name1', 'chenge') #添加
r.set('name2', '辰哥') #添加
print(r.get('name1')) #获取
print(r.get('name2')) #获取
这样就可以正常显示中文了

ok,连接好Redis之后,下面开始讲解Redis的各种操作。Redis存储结构是key-value,不同的是value类型的不同,所以这里就对不同的类型进行详细介绍。

03

string操作

1.set
r.set('name1', 'chenge') #添加
在Redis中设置值,默认不存在就创建,存在就修改

此外set设置的时候还可以加入过期时间(类似cookie有效期这样),一旦过期之后,再通过key去取value时,value的结果为None。

还可以这样设置

设置过期时间(秒),这里是5秒过期

r.setex('key1',5,'value1')

设置过期时间(毫秒),这里是1000耗秒过期

r.psetex("key2",1000,"value2")
2.mset
set是设置单个key-value,mset可以批量设置多个key-value

批量设置值

r.mset({'key3':'value3', 'key4':'value4'})
print(r.get('key3'))
print(r.get('key4'))

3.mget
get可以取出单个value,mget可以批量取出多个value

批量获取-法一

print(r.mget("key3","key4"))

批量获取-法二

v_list=["key3","key4"]
print(r.mget(v_list))

4.getrange
getrange(key, start, end),根据start和end去截取序列(取出的value)

print(r.getrange("key3",0,3)) # 输出:valu
5.append
append(key, value),在key对应的值后面追加内容

print(r.get("key3")) #输出:'value3
r.append("key3","chenge")
print(r.get("key3")) #输出:value3chenge
6.strlen
strlen(key),返回key对应值的字节长度(一个汉字3个字节)

r.set("key5","辰哥")
print(r.strlen("key5")) # 输出:6
r.set("key6","chenge")
print(r.strlen("key6")) # 输出:6
以上这6个方法是string字符串中常用的,此外还有一些方法(不常用),辰哥就不一一介绍,需要用到的时候可以去redis官方文档学习。

04

List操作

Redis中的List在内存中按照一个key对应一个List来存储

1.lpush和rpush
lpush(key,values),每个新元素都添加到列表最左边

rpush(key,values),每个新元素都添加到列表最右边

r.lpush("key7",1)
r.lpush("key7",2,3,4)#保存在列表中的顺序为4,3,2,1
r.rpush("key8",1)
r.rpush("key8",2,3,4)#保存在列表中的顺序为1,2,3,4
2.lpushx和rpushx
lpushx(key,value),添加元素时,只有key存在,value添加到列表最左边

rpushx(key,value),添加元素时,只有key存在,value添加到列表最右边

3.llen
llen(key),返回key对应的list元素的个数

r.lpush("key9",2,3,4) # 输出:3
4.linsert
linsert(key, where, refvalue, value)),在name对应的列表的某一个值前或后插入一个新值。

r.linsert("key9","BEFORE","2","chenge")#在列表内找到第一个元素2,在它前面插入chenge

输出:chenge,2,3,4

5.lset
r.lset(key, index, value),对list中的某一个索引位置重新赋值

r.lset("key9",0,"辰哥")
6.lpop
lpop(name),移除列表的左侧第一个元素,返回值则是第一个元素

print(r.lpop("key9"))
7.lindex
lindex(name, index),根据索引获取列表内元素,比如返回第一个元素

print(r.lindex("key9",1))
8.lrange
lrange(name, start, end), 分片获取元素

print(r.lrange("key9", 0, -1)) #输出全部内容

输出:['4', '3', '2']

9.ltrim
ltrim(name, start, end),移除列表内没有在该索引之内的值

r.ltrim("key9", 0, 2)

05

Hash操作

Redis中的hash在内存中类似一个key对应一个dict来存储

1.hset和hget
hset(name, key, value),name对应的hash中设置一个键值对(不存在,则创建,否则,修改)

hget(name,key),在name对应的hash中根据key获取value

r.hset("key10","a1","a2")

在key10对应的hash中根据key获取value

print(r.hget("key10","a1"))#输出:a2
2.hgetall、hmset和hmget
‍‍hgetall(name),获取name对应hash的所有键值

print(r.hgetall("key10")) # 输出:{'a1': 'a2'}
hmset(name, mapping),在name对应的hash中批量设置键值对

其中mapping:字典

dic = {"c1":"cc","d1":"dd"}
r.hmset("key11",dic)
print(r.hget("key11","c1")) #输出:cc
hmget(name, keys, *args),在name对应的hash中获取多个key的值

k_list=["c1","d1"]
print(r.hmget("key11",k_list)) # 输出:['cc', 'dd']
print(r.hmget("key11","c1","d1")) # 输出:['cc', 'dd']
3.hlen、hkeys和hvals
hlen(name),获取hash中键值对的个数

hkeys(name),获取hash中所有的key的值

hvals(name),获取hash中所有的value的值

print(r.hlen("key11")) #输出:2
print(r.hkeys("key11")) #输出:['c1', 'd1']
print(r.hvals("key11")) #输出:['cc', 'dd']
4.hexists和hdel
hexists(name, key),检查name对应的hash是否存在当前传入的key

hdel(name,*keys),删除指定name对应的key所在的键值对

print(r.hexists("key11","c1"))#输出:True
print(r.hexists("key11","c2"))#输出:False

删除指定key11对应的c1所在的键值对

r.hdel("key11","c1")
print(r.hexists("key11","c1"))#输出:False

06

Set操作

Set集合就是不允许重复的列表

1.sadd、smembers和scard
sadd(key,values),给key对应的集合中添加元素

smembers(key),获取key对应的集合的所有成员

scard(key),获取key对应的集合中的元素个数

r.sadd("key12","a1")
r.sadd("key12","a1","a1")

print(r.smembers("key12")) #输出:{'a1'}
print(r.scard("key12")) #输出:1
2.sdiff 和 sdiffstore
sdiff(keys, *args),在第一个key对应的集合中且不在其他key对应的集合的元素集合

r.sadd("key13","a1","a2","a4")
r.sadd("key14","a2","a3")
r.sadd("key15","a1","a2","a3")
print(r.sdiff("key13","key14","key15"))#输出:{'a4'}
sdiffstore(newkey, keys, *args),相当于把sdiff获取的值加入到newkey对应的集合中

r.sdiffstore("key16","key13","key14","key15")
print(r.smembers("key16")) #输出:{'a4'}
3.sinter和 sinterstore
sinter(keys, *args),获取多个key对应集合的并集

r.sadd("key13","a1","a2","a4")
r.sadd("key14","a2","a3")
r.sadd("key15","a1","a2","a3")
print(r.sinter("key13","key14","key15"))#输出:{'a2'}
sinterstore(newkey, keys, *args),获取多个key对应集合的并集,再讲其加入到newkey对应的集合中

r.sinterstore("key17","key13","key14","key15")
print(r.smembers("key17")) #输出:{'a2'}
4.sismember、smove和 spop
sismember(name, value),检查value是否是name对应的集合内的元素

r.sadd("key13", "a1", "a2", "a4")
print(r.sismember("key13","a1")) # 输出:True
print(r.sismember("key13","a5")) # 输出:False
smove(src, dst, value),将某个元素从一个集合中移动到另外一个集合

r.sadd("key18", "a1", "a2", "a4")
r.sadd("key19", "a5")
r.smove("key18", "key19", "a2")
print(r.smembers("key19")) #输出:{'a2', 'a5'}
spop(name),从集合的右侧移除一个元素,并将其返回

print(r.spop("key19")) #输出:a5
print(r.smembers("key19")) #输出:{'a2'}
5.有序集合
此外还有有序集合操作:在集合的基础上,为每一个元素排序。

zadd(name, mapping),其中name为有序集合名,mapping为dict类型的键-值对

zcard(name),获取有序集合内元素的数量

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

r.zadd("key20", {"a": 10, "b": 3, "c": 8})
print(r.zcard("key20")) #输出:3
print(r.zcount("key20", 2, 5)) #输出:1
print(r.zcount("key20", 7, 15)) #输出:1

07

通用操作

以上是按不同类型的value进行对应的操作,redis有一些无视类型的通用操作方法。(这里就只是列出方法并说明,就不再一一演示)

delete(*names),根据name删除redis中的任意数据类型

exists(name),检测redis的name是否存在

keys(pattern=''),根据 ?等通配符匹配获取redis的name

expire(name ,time),为某个name设置超时时间

rename(src, dst),重命名

move(name, db)),将redis的某个值移动到指定的db下

randomkey(),随机获取一个redis的name(不删除)

type(name),获取name对应值的类型

08

小结

今天的技术讲解文章就到此结束,主要是将了如何通过python去连接Redis,Redis的存储结构是key-value类型,本文按value类型分类讲解了string字符串操作、list操作、hash操作、set操作以及通用操作。(干货文章,推荐收藏)

最后说一声:原创不易,求给个赞、在看、评论

推荐阅读

520情人节|用Python跟‘喜欢的人’表白

实战|教你用Python玩转Mysql

照片模糊?辰哥手把手教你用Python让照片高清化

采集+图谱可视化|手把手教你采集明星人物关系并进行图谱展示

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
16天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
18天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
53 4
|
17天前
|
机器学习/深度学习 数据可视化 数据处理
Python数据科学:从基础到实战
Python数据科学:从基础到实战
25 1
|
18天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
33 1
|
21天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
37 1
|
21天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
36 1
|
23天前
|
Linux 开发者 iOS开发
Python系统调用实战:如何在不同操作系统间游刃有余🐟
本文介绍了 Python 在跨平台开发中的强大能力,通过实际例子展示了如何使用 `os` 和 `pathlib` 模块处理文件系统操作,`subprocess` 模块执行外部命令,以及 `tkinter` 创建跨平台的图形用户界面。这些工具和模块帮助开发者轻松应对不同操作系统间的差异,专注于业务逻辑。
35 2
|
13天前
|
数据采集 存储 数据处理
探索Python中的异步编程:从基础到实战
【10月更文挑战第39天】在编程世界中,时间就是效率的代名词。Python的异步编程特性,如同给程序穿上了一双翅膀,让它们在执行任务时飞得更高、更快。本文将带你领略Python异步编程的魅力,从理解其背后的原理到掌握实际应用的技巧,我们不仅会讨论理论基础,还会通过实际代码示例,展示如何利用这些知识来提升你的程序性能。准备好让你的Python代码“起飞”了吗?让我们开始这场异步编程的旅程!
29 0
|
17天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
22天前
|
开发者 Python
探索Python中的装饰器:从入门到实战
【10月更文挑战第30天】本文将深入浅出地介绍Python中一个强大而有趣的特性——装饰器。我们将通过实际代码示例,一步步揭示装饰器如何简化代码、增强函数功能并保持代码的可读性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往更高效编程的大门。
下一篇
无影云桌面