【Redis数据结构 序】使用redis-py操作Redis数据库
2021/5/12 19:27:32
本文主要是介绍【Redis数据结构 序】使用redis-py操作Redis数据库,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
想要看更加舒服的排版、更加准时的推送
关注公众号“不太灵光的程序员”
每日八点有干货推送
同时发布《【Redis数据结构 1序】1使用redis-py操作Redis数据库》
本文依旧会对学习内容进行拆分,建议阅读时间基本保持10分钟内,
先学习之前章节内容点击《你不了解的Redis》阅读所有章节内容
【Redis数据结构】系列对常用String、List、Set、Sorted Set、Hashe和Stream6种类型进行介绍,并使用redis-py进行实践操作。
一个高性能的key-value数据库
Redis的出现,很大程度补偿了Memcached这类key-value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。
Redis和Memcached类似,它支持存储的value类型相对更多,value常用的数据结构有String、List、Set、Sorted Set、Hashe、Stream 6种,当然不同类型有不同的特性,操作命令是不尽相同的。
redis-py是Python中操作Redis数据库的常用模块,模块中命令函数基本上是与原命令命名一致,子命令都是作为命令的参数使用。
例如 SET命令
语法格式 :SET key value [EX seconds] [PX milliseconds] [NX|XX]
对应的函数是:set(self, name, value, ex=None, px=None, nx=False, xx=False, keepttl=False)
注:keepttl 为Redis 6.0 的特性,可以暂不考虑
注:模块的execute_command是实际调用原命令的函数
我们会结合python的redis模块对这6种数据结构的操作进行讲解,方便加深记忆。
Redis命令命名有以下特点:
- 命令 以S 开头的为 集合操作命令
- 命令 以Z 开头的为 有序集合操作命令
- 命令 以H 开头的为 哈希集操作命令
- 命令 以X 开头的为 流操作命令
例如:
- INCRBY 是 字符串类型原子递增的操作命令
- ZINCRBY 是 有序集合类型的分数(权值)原子递增的操作命令
- HINCRBY 是 哈希集类型指定字段的数值的原子递增的操作命令
1 Redis Server
Windows 下载 Redis-x64-3.0.501.zip 解压
管理员权限使用cmd切换到解压后的目录下:
- 手动指定配置文件启动:redis-server.exe redis.windows.conf
也可以直接双击redis-server.exe启动 - 安装服务:redis-server.exe --service-install redis.windows.conf
- 卸载服务:redis-server --service-uninstall
- 开启服务:redis-server --service-start
- 停止服务:redis-server --service-stop
配置文件 redis.windows.conf
- databases 可以设置db的数量,是大于0的任意整数,默认16
- port 可以设置端口,默认6379
- maxclients 设置最大连接数,默认10000
- requirepass 设置连接密码
启动后是这样的:
注:建议安装RedisDesktopManager帮助学习
2 Python环境
首先需要解释下 redis-py 2.X 和 redis-py 3.0的部分区别
数据库连接方式不同
在redis-py 2.X 中StrictRedis用于实现大部分官方的命令,Redis用于向后兼用旧版本,官方建议使用StrictRedis。
在redis-py 3.0 中StrictRedis只是Redis的一个别名,建议使用Redis。
数值类型不同
redis-py 2.X 可以接收任何类型的输入并强制转换为字符串类型。
redis-py 3.0 仅接受用户数据作为字节、字符串、数字(int,long和float), 其他类型将引发DataError异常。
在2.x中,当用户输入bool值或者None值是结果就不是预期的了,
会强制转换为“True”、“False”和“None”的字符串,这会导致各种隐藏错误类型。
参数不同
SETEX、LREM、TTL和PTTL命令的参数顺序发生变化。
MSET、MSETNX和ZADD命令的参数结构发生变化。
注:后文中的所有redis-py都指代redis-py3.0
pip install redis==3.5.1
redis-py 两种连接方式
- redis.Redis
- redis.StrictRedis
正如上面提到的 StrictRedis只是Redis的一个别名,建议使用Redis。
redis-py 连接池
- redis.ConnectionPool
redis-py 使用连接池来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。
redis-py 管道
- redis.Pipelines
redis-py 使用管道在单个请求中将多个命令缓冲到服务器,可以理解为数据库事务。
可以通过减少客户机和服务器之间来回传输的TCP数据包的数量来提高性能。
也可以减少应为客户端宕机,导致的一个连续操作没有完成而产生的异常。
实例:
pipe = r.pipeline() pipe.x ... pipe.execute()
Hello World
我们创建分别创建user:1000:message、user:1001:message、user_1002_message三个key,都保存字符串 Hello World 并读取它们。
# coding=gbk # 导入redis 模块 import redis redis_pool = redis.ConnectionPool( host='127.0.0.1', port=6379, db=0, password='cbs123', decode_responses=True ) r = redis.Redis(connection_pool=redis_pool) sr = redis.StrictRedis(connection_pool=redis_pool) # 将键key设定为指定的"字符串"值 r.set("user:1000:message", "Hello World", ex=100) sr.set("user:1001:message", "Hello World") sr.set("user:1004:message", "Hello World", px=10000) sr.set("user_1002_message", "Hello World") # 获取key对应的数值 r.get("user:1000:message") r.get("user:1001:message") r.get("user_1002_message") """ > True > True > True > Hello World > Hello World > Hello World """
我们可以看到key在RedisDesktopManager使用冒号分隔的key是做了层次划分的
当我们要使用的redis做数据表的重要数据缓存时,user:1000:message 可以表示为 user表的id为1000的记录中message的数据。
存储的key不多的话还比较好维护,有上万个key在同一级命名空间中维护起来还是比较痛苦的。
key的定义规则是见名知意,格式统一即可。
当然你也可以做其他格式的定义,你可以理解就好。
Redis通用命令
见源代码> 表示返回结果
# coding=gbk # 导入redis 模块 import redis redis_pool = redis.ConnectionPool( host='127.0.0.1', port=6379, db=0, password='cbs123', decode_responses=True ) r = redis.Redis(connection_pool=redis_pool) # 通用操作 不区分 数据类型的 # EXISTS key 检查key值是否存在,成功返回1,不成功返回0(key对应的值不存在) r.exists("user:1000:message") r.exists("user:1002:message") """ > 1 > 0 """ # TYPE key 返回key对应的值的类型,成功返回类型,不成功返回none(key对应的值不存在) r.type("user:1000:message") r.type("user:1002:message") """ > string > none """ # TTL key 返回key对应的剩余存活时间,成功返回时长单位秒,不成功返回-1 key值不存在返回-2 r.ttl("user:1000:message") r.ttl("user:1001:message") r.ttl("user:1004:message") r.ttl("user:1002:message") """ > 100 > -1 > 10 > -2 """ # 设置超时时间,当时间到达后会被删除 # EXPIRE key seconds 超时时间,当时间到达后会被删除,单位秒 # PEXPIRE key milliseconds 超时时间,当时间到达后会被删除,单位毫秒 r.expire("user:1000:message", 10) r.pexpire("user:1001:message", 10) """ > True > False > False """ # PERSIST key 删除key对应的超时时间,成功返回True,不成功返回False(key对应的值不存在) r.persist("user:1000:message") r.persist("user:1001:message") r.persist("user:1002:message") """ > True > False > False """ # DEL key 删除key对应的值,成功返回1,不成功返回0(key对应的值不存在) r.delete("user:1000:message") r.delete("user:1002:message") """ > 1 > 0 """
推荐阅读:
- Redis实现消息队列的6种方案
- 让运维更简单的7种定时任务实现方式
- 细品28岁程序员退休创业背后的可怕故事
-
工作中都有哪些让你心累的时刻
这篇关于【Redis数据结构 序】使用redis-py操作Redis数据库的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-17Redis学习:从入门到初级应用教程
- 2024-10-12Redis入门:新手必读教程
- 2024-09-26阿里云Redis项目实战:新手入门教程
- 2024-09-26阿里云Redis资料入门教程
- 2024-09-25阿里云Redis入门教程:快速掌握Redis的基本操作
- 2024-09-25阿里云Redis学习:新手入门教程
- 2024-09-21Redis资料入门教程:轻松掌握Redis基础知识
- 2024-09-21Redis资料:入门级用户必学教程
- 2024-09-21Redis资料:新手入门教程与实践指南
- 2024-09-20Redis教程:从入门到实践的全面指南