如何使用 Python 本地客户端操作读写云服务器 Redis 缓存数据库详细教程(更新中)

Redis 基本概述

Redis(Remote Dictionary Server)是一个开源的使用 ANSI C 语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。它通常被称为数据结构服务器,因为值(value)可以是字符串(string)、哈希(Hash)、列表(list)、集合(sets)、有序集合(sorted sets)等类型。

Redis 广泛应用于缓存、消息队列、计数器、排行榜、分布式锁等场景,为开发者提供了强大的数据存储和处理功能。

Redis 主要特点和概述

内存存储与持久化:Redis 主要将数据存储在内存中,因此读取速度非常快。同时,它也支持数据的持久化,可以将内存中的数据定期写入磁盘或其他存储介质,以防止数据丢失。

数据类型丰富:Redis 支持多种数据类型,如字符串、哈希、列表、集合和有序集合等,这使得Redis能够灵活地应用于各种场景。

发布 / 订阅模型:Redis 支持发布 / 订阅模型,允许发送者(pub)发送消息,订阅者(sub)接收消息。这种模型常用于实现实时消息系统、聊天室等。

事务支持:Redis 支持简单的事务处理,可以通过 MULTI、EXEC 和 DISCARD 等命令来执行一系列操作。

Lua 脚本:Redis 支持使用 Lua 脚本进行复杂的操作,提高了操作的灵活性和效率。

分布式与集群:Redis 支持分布式部署和集群功能,可以通过分片、复制等方式实现数据的水平扩展和高可用性。

高并发性能:由于 Redis 主要操作都在内存中完成,且采用单线程模型避免了多线程的上下文切换开销,因此 Redis 具有非常高的并发性能。

Python 远程连接 Redis

下载第三方库:redis (py - redis 使用)

pip3 install --pre redis -i https://pypi.tuna.tsinghua.edu.cn/simple 

采用非连接池技术连接如下:

import redis
host = '服务器IP'
port = 6379
r = redis.Redis(host=host, port=port)

采用连接池技术连接如下:

# 连接池:为了节约资源,减少多次连接带来的消耗。
# 默认设置的值和取得的值都是bytes类型,如果想改为str类型,可以添加decode_responses=True

pool=redis.ConnectionPool(host='服务器IP', port=6379, decode_responses=True)

关系型数据库都有一个连接池的概念:对于大量redis连接来说,如果使用直接连接redis的方式的话,将会造成大量的TCP的重复连接,所以,就引入连接池来解决这个问题。在使用连接池连接上redis之后,可以从该连接池里面生成连接,调用完成之后,该链接将会返还给连接池,供其他连接请求调用,这样将减少大量redis连接的执行时间。

在这里插入图片描述

Redis 基本操作

常规属性查看 redis 库中的 Redis 类生成对应的对象都有如下同名的方法供调用者调用。

在这里插入图片描述
具体的操作请参考:Redis 博客

配置服务器端开启远程

本地连接服务器端 Redis 数据库开放 6379 端口
在这里插入图片描述
宝塔面板 redis 管理 > 配置文件

将 bind 127.0.0.1 ::1 修改为 bind 0.0.0.0 (指所有的地址都可以访问,不建议此操作,仅供测试,因为一旦 bind 0.0.0.0 之后任何 IP 都能连接访问 redis 数据库,非常不安全)

这里的 bind 指的是只有指定的网段才能远程访问这个 redis。 注释掉后,就没有这个限制了。或者 bind 自己所在的网段。

在这里插入图片描述

将 protected-mode 要设置成 no (默认是设置成 yes 的, 防止了远程访问,在redis 3.2.3 版本后)

在这里插入图片描述
配置远程连接密码:取消注释 requirepass foobared,将 foobared 改成任意密码,用于验证登录。默认是没有密码的就可以访问的,我们这里最好设置一个密码。

在这里插入图片描述

特别注意:更新配置文件 bind 0.0.0.0 需要重启 redis 服务

本地连接测试

import redis

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

r.set("name", "唤醒手腕")
print(r.get("name"))
    raise TimeoutError("Timeout connecting to server")
redis.exceptions.TimeoutError: Timeout connecting to server

测试发现请求超时(通过站长工具扫描端口)

在这里插入图片描述
特别提醒(借助宝塔面板需要面板端口开放设置中 6379 也同时放行)

在这里插入图片描述
配置完成之后测试结果

b'\xe5\x94\xa4\xe9\x86\x92\xe6\x89\x8b\xe8\x85\x95'

需要开启解码返回

在 Python 的 redis 库中,decode_responses 是一个配置选项,用于控制从 Redis 服务器接收的响应是否应该被自动解码为字符串。默认情况下,decode_responses 被设置为 False,这意味着响应会以字节(bytes)形式返回。当你设置 decode_responses 为True时,所有的响应都会被自动解码为 UTF-8 字符串。

import redis

host = 'xxx.xxx.xxx.xxx'
port = 6379
r = redis.Redis(host=host, port=port, password="foobared", decode_responses=True)

r.set("name", "唤醒手腕")
print(r.get("name"))

Sort Set 读写操作

创建一个 Redis 连接

import redis  
  
host = 'xxx.xxx.xxx.xxx'
port = 6379
r = redis.Redis(host=host, port=port, password="foobared", decode_responses=True)

添加一些成员到有序集合中并指定分数

r.zadd('leaderboard', {'Alice': 1000, 'Bob': 1200, 'Charlie': 1100})  

获取有序集合的所有成员和分数

members_with_scores = r.zrange('leaderboard', withscores=True)  
print(members_with_scores)  # 输出: [('Alice', 1000.0), ('Charlie', 1100.0), ('Bob', 1200.0)]  

获取有序集合的成员数量

member_count = r.zcard('leaderboard')  
print(member_count)  # 输出: 3  

获取有序集合中分数最高的成员

top_member = r.zrevrange('leaderboard', 0, 0, withscores=True)  
print(top_member)  # 输出: [('Bob', 1200.0)]  

获取有序集合中分数在指定范围内的成员

members_in_range = r.zrangebyscore('leaderboard', 1000, 1100, withscores=True)  
print(members_in_range)  # 输出: [('Alice', 1000.0), ('Charlie', 1100.0)]  

更新有序集合中某个成员的分数

r.zincrby('leaderboard', 50, 'Alice')  

再次获取有序集合的所有成员和分数 查看 Alice 的分数变化

updated_members_with_scores = r.zrange('leaderboard', withscores=True)  
print(updated_members_with_scores)  # 输出可能包括 Alice 的新分数  

删除有序集合中的某个成员
r.zrem(‘leaderboard’, ‘Alice’)

再次获取有序集合的所有成员和分数 查看 Alice 是否已被删除

final_members_with_scores = r.zrange('leaderboard', withscores=True)  
print(final_members_with_scores)  # 输出将不再包含 Alice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/506670.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Leetcode】2810. 故障键盘

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 你的笔记本键盘存在故障,每当你在上面输入字符 ′ i ′ i ′i′ 时,它会反转你所写的字符串。而输入其他字符则可以正常工作。 给你一个下标从 0 0 0 开始…

.sdf和.msp文件读取

前言 .sdf和.msp文件都可以用来存储分子信息,.sdf文件可以用rdkit读取,.msp文件就只能当成文本文档读取了。 读取 rdkit安装 pip install rdkit .sdf读取 from rdkit import Chemsuppl_h Chem.SDMolSupplier(../data/HMDB/f_hmdb.sdf) # 得到一个迭…

【字节跳动笔试题汇总】 2024-03-31-字节跳动春招笔试题-三语言题解(CPP/Python/Java)

🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新字节跳动近期的春秋招笔试题汇总~ 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢&…

基于Python的口罩佩戴识别的设计与实现(UI界面+MySQL数据库+YOLOv5+训练数据集+开题报告+中期检查+论文)

本文旨在基于Python开发一种口罩佩戴识别系统,通过深度学习技术实现对口罩佩戴情况的准确检测。采用了YOLOv5系列目标检测算法作为基础模型,并结合迁移学习进行训练和优化。同时,为了提供更好的用户体验,本系统还设计了用户登录注…

“315晚会”中的“网络水军”是什么?

水军一词,源自网络用语,通常指的是一群在网络上被雇佣来进行特定活动的人群。他们的主要任务通常是在各种社交媒体平台、论坛或者评论区发表大量的帖子、评论或者回复,以此来达到某种特定的目的。这些目的可能包括提升某个产品、服务或者个人…

【机器学习300问】58、什么是词袋模型和N-gram模型?

词袋模型(Bag of Words, BoW)和N-gram模型主要用于早期的自然语言处理任务,上文中我介绍了机器是如何读懂文本的四个阶段,这篇文章带大家来看看在不同阶段中会用到的两个模型——词袋模型和N-gram模型。如果没有读过我之前的文章&…

纯小白蓝桥杯备赛笔记--DAY9(搜索)

文章目录 三道例题学会DFS剪枝什么是剪枝数字王国之军训排队--2942特殊的三角形--3008特殊的多边形--3075 DFS基础回溯简介回溯法模版例题N皇后--1508小朋友崇拜圈--182全球变暖--178 记忆化搜索简介斐波那契数列混境之地5-3820地宫取宝-216 三道例题学会DFS剪枝 什么是剪枝 …

云计算迎变局:阿里云、腾讯云“各有千秋”

毋庸置疑,无论在什么时候什么行业,低价策略都是一柄利器。比如,在电商行业,除了拼多多将低价策略贯彻到底之外,淘宝、京东也将性价比作为发力重点,并通过补贴、秒杀等方式,再度强调自身的“价格…

Pygame基础8-碰撞

Collisions 在Pygame中,我们使用矩形来移动物体,并且用矩形检测碰撞。 colliderect检测两个矩形是否碰撞,但是没法确定碰撞的方向。 Rect1.colliderect(Rect2) # collision -> return Ture # else -> return Falsecollidepoint可以…

数据结构——遍历二叉树和线索二叉树,树和森林

目录 1.遍历的算法实现 1.先序遍历 代码示例: 2.中序遍历 代码示例: 3.后序遍历 代码示例: 4.遍历算法的分析 2.遍历二叉树的非递归算法 1.中序遍历非递归算法 代码示例: 3.二叉树的层次遍历 代码示例: 4.二…

C#/.NET/.NET Core优秀项目和框架2024年3月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学…

BUUCTF [安洵杯 2019]吹着贝斯扫二维码 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件解压,得到很多没有后缀的文件和一个ZIP压缩包。 解题思路: 1、首先,查看ZIP压缩包,发现有密码&#xf…

GreatSQL 优化技巧:将 MINUS 改写为标量子查询

GreatSQL 优化技巧:将 MINUS 改写为标量子查询 前言 minus 指令运用在两个 SQL 语句上,取两个语句查询结果集的差集。它先找出第一个 SQL 所产生的结果,然后看这些结果有没有在第二个 SQL 的结果中,如果在,那这些数据…

2024年山东临沂教育人才引进报名流程

2024年山东临沂教育人才引进报名流程

表单全选反选(前端)

1.Html和JavaScript <table><tr><th class"allCheck"><input type"checkbox" name"" id"checkAll"> <span class"all">全选</span></th><th>商品</th><th>商…

Hive函数笔试题(简单)

第1题 有如下的用户访问数据 userId visitDate visitCount u01 2017/1/21 5 u02 2017/1/23 6 u03 2017/1/22 8 u04 2017/1/20 3 u01 2017/1/23 6 u01 2017/2/21 8 u02 2017/1/23 6 u01 2017/2/22 4 要求使用SQL统计出每个用户的累积访问次数&…

Qt中继承QCheckBox的类结合QTableWidget实现多选并且每个多选的id都不一样

1.相关描述 继承QCheckBox的类MyCheckBox&#xff0c;利用QTableWidget的setCellWidget方式添加MyCheckBox类的对象 2.相关页面 3.相关代码 mycheckbox.h #ifndef MYCHECKBOX_H #define MYCHECKBOX_H#include <QCheckBox> #include <QObject>class MyCheckBox : pu…

DSSS-UQPSK学习笔记

文章目录 非平衡四相键控-直接序列扩频&#xff08;UQPSK-DSSS&#xff09;信号因其能同时传输两路不同功率、不同速率信号的特点&#xff0c;在需要图象和数据综合业务传输的领域得到了广泛应用。 系统信号的调制方式为非平衡四相键控&#xff08;Unbalanced Quadrature Phase…

SpringBoot 整合Redis第1篇

SpringBoot是一个开发框架&#xff0c;Redis是一个高性能的键值存储数据库&#xff0c; 常用于缓存、会话管理、消息队列等应用场景。 定义 Redis是什么&#xff1f; 它是一个存储层级&#xff0c; 在实际项目中&#xff0c;位于关系数据库之上&#xff0c; 类似Android分为5…

vue3封装Element导航菜单

1. 导航外层布局 AsideView.vue <template><el-menu:default-active"defaultActive"class"my-menu":collapse"isCollapse":collapse-transition"false"open"handleOpen"close"handleClose"><menu…