python-redis访问指南

Redis(Remote Dictionary Server)是一种开源的内存数据结构存储,可用作数据库、缓存和消息代理。它功能强大且灵活,可根据需求调整架构和配置,以高性能、简单易用、支持多种数据结构而闻名,广泛应用于各种场景,包括实时数据处理、会话存储和分布式应用等。

一、Redis 的特点

高性能Redis 将数据存储在内存中,读写速度极快,适合实时应用场景。每秒读写操作数可以达到数十万。

丰富的数据结构支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。

持久化支持提供 RDB 快照和 AOF(Append-Only File)两种持久化方式,数据即使断电也可以恢复。

简单易用提供简单的命令集,易于学习和使用。并支持多种编程语言的客户端。

多种功能支持事务、Lua 脚本、发布/订阅、主从复制和分布式部署。

分布式特性提供 Redis Cluster 模式,可支持大规模、高可用的分布式集群。

二、Redis 的应用场景

缓存:存储热点数据以减少数据库压力,提高响应速度。

会话存储:用于存储用户会话信息,例如电商网站购物车数据。

分布式锁:使用 Redis 的原子操作实现分布式锁。

实时数据分析:高性能处理实时数据流,例如在线计数器、排行榜等。

消息队列:利用 Redis 的列表或发布/订阅功能实现生产者消费者模型。

计数器:通过自增功能实现精准计数,如视频播放量统计。

三、Redis 支持的数据结构

3.1 字符串(String)

最基本的数据类型,可存储字符串、数字等。

示例命令:

    SET key value

    GET key

    INCR key

用途:缓存对象、计数器、会话数据。 

3.2 哈希(Hash)

存储键值对的集合,类似 Python 的字典。

示例命令:

    HSET user:1 name "Alice"

    HGET user:1 name

    HGETALL user:1

用途:存储用户信息、配置数据等。

3.3 列表(List)

有序的字符串集合,可用于队列或栈。

示例命令:

    LPUSH mylist "item1"

    RPUSH mylist "item2"

    LPOP mylist

用途:消息队列、任务队列。

3.4 集合(Set)

无序的字符串集合,自动去重。

示例命令:

    SADD myset "item1"

    SADD myset "item2"

    SMEMBERS myset

用途:社交网络中的好友推荐、去重功能。

3.5 有序集合(Sorted Set)

类似集合,但每个成员有一个分数,用于排序。

示例命令:

    ZADD leaderboard 100 "Alice"

    ZADD leaderboard 200 "Bob"

    ZRANGE leaderboard 0 -1 WITHSCORES

用途:排行榜、任务调度。

3.6 位图(Bitmap)

用于高效地存储和操作二进制数据。

3.7 HyperLogLog

用于估算基数(不重复元素的数量),占用内存极小。

四、Redis 的持久化方式

4.1 RDB(Redis Database File)

  1. 定期将内存数据保存为快照。
  2. 优点:对性能影响小,适合冷备。
  3. 缺点:可能丢失最近一次快照后的数据。

4.2 AOF(Append-Only File)

  1. 将每次写操作追加到日志文件中。
  2. 优点:数据丢失量极小。
  3. 缺点:文件较大,恢复速度较慢。

4.3 混合持久化

  1. 同时使用 RDB 和 AOF,兼顾数据完整性和恢复速度。

五、Redis 的高可用架构

主从复制:主节点处理读写请求,从节点负责备份和读请求。提高读取性能,增强数据可靠性。

哨兵模式:监控主从节点状态,自动故障转移。提供高可用能力。

Redis Cluster:分布式部署,将数据分片存储到多个节点。支持大规模数据存储和高并发。

六、Redis 与其他数据库的对比

特性

Redis

MySQL

MongoDB

存储模式

内存+持久化

磁盘存储

磁盘存储

数据结构

丰富

表结构

BSON 文档

读写性能

极高

中等

事务支持

简单事务(MULTI)

完整事务

事务(4.0后支持)

应用场景

缓存、队列、计数器

OLTP、复杂查询

文档存储、分析

七、注意事项

内存限制Redis 的性能依赖内存大小,需设置合理的内存淘汰策略。

持久化选型根据数据重要性选择适当的持久化方式。

线程安全Redis 单线程处理命令,需注意避免长时间阻塞操作。

连接池对高并发场景使用连接池提升性能。

八、代码封装

最后,风云同样用python写了一个类,操作redis,大家只要在这个基础上稍作修改,便可投入项目使用,当然,redis服务器和python库的安装这里先省略了,有需要的可以去百度查阅,代码如下,自取不谢!

import redisclass RedisHelper:"""RedisHelper: 封装 Redis 的常用操作,支持多种数据结构和应用场景。"""def __init__(self, host='localhost', port=6379, db=0, password=None):"""初始化 Redis 连接。:param host: Redis 主机地址:param port: Redis 端口:param db: Redis 数据库编号:param password: Redis 密码"""self.connection = redis.StrictRedis(host=host, port=port, db=db, password=password, decode_responses=True  # 自动解码为字符串)# 字符串操作def set_string(self, key, value, ex=None):"""设置字符串键值对。:param key: 键名:param value: 值:param ex: 过期时间(秒)"""self.connection.set(key, value, ex)def get_string(self, key):"""获取字符串键的值。:param key: 键名:return: 值"""return self.connection.get(key)# 哈希操作def set_hash(self, hash_name, key, value):"""设置哈希键值对。:param hash_name: 哈希名称:param key: 键名:param value: 值"""self.connection.hset(hash_name, key, value)def get_hash(self, hash_name, key):"""获取哈希键的值。:param hash_name: 哈希名称:param key: 键名:return: 值"""return self.connection.hget(hash_name, key)def get_all_hash(self, hash_name):"""获取整个哈希的键值对。:param hash_name: 哈希名称:return: 哈希键值对"""return self.connection.hgetall(hash_name)# 列表操作def push_to_list(self, list_name, value, from_left=True):"""向列表添加元素。:param list_name: 列表名称:param value: 值:param from_left: 是否从左侧插入"""if from_left:self.connection.lpush(list_name, value)else:self.connection.rpush(list_name, value)def pop_from_list(self, list_name, from_left=True):"""从列表弹出元素。:param list_name: 列表名称:param from_left: 是否从左侧弹出:return: 弹出的值"""return self.connection.lpop(list_name) if from_left else self.connection.rpop(list_name)def get_list(self, list_name, start=0, end=-1):"""获取列表的所有元素。:param list_name: 列表名称:param start: 起始索引:param end: 结束索引:return: 列表值"""return self.connection.lrange(list_name, start, end)# 集合操作def add_to_set(self, set_name, value):"""向集合添加元素。:param set_name: 集合名称:param value: 值"""self.connection.sadd(set_name, value)def get_set_members(self, set_name):"""获取集合中的所有成员。:param set_name: 集合名称:return: 集合成员"""return self.connection.smembers(set_name)# 有序集合操作def add_to_sorted_set(self, zset_name, value, score):"""向有序集合添加元素。:param zset_name: 有序集合名称:param value: 值:param score: 分数"""self.connection.zadd(zset_name, {value: score})def get_sorted_set(self, zset_name, start=0, end=-1, withscores=True):"""获取有序集合中的元素。:param zset_name: 有序集合名称:param start: 起始索引:param end: 结束索引:param withscores: 是否返回分数:return: 有序集合元素"""return self.connection.zrange(zset_name, start, end, withscores=withscores)# 发布/订阅def publish_message(self, channel, message):"""向频道发布消息。:param channel: 频道名称:param message: 消息内容"""self.connection.publish(channel, message)def subscribe_to_channel(self, channel):"""订阅频道。:param channel: 频道名称"""pubsub = self.connection.pubsub()pubsub.subscribe(channel)print(f"已订阅频道: {channel}")for message in pubsub.listen():if message['type'] == 'message':print(f"收到消息:{message['data']}")# 事务操作def execute_transaction(self, operations):"""使用事务执行多个操作。:param operations: 操作函数的列表,操作函数接受事务对象作为参数"""with self.connection.pipeline() as pipe:for operation in operations:operation(pipe)pipe.execute()# 使用示例
if __name__ == "__main__":redis_helper = RedisHelper()# 字符串操作redis_helper.set_string('key1', 'value1')print(f"获取 key1: {redis_helper.get_string('key1')}")# 哈希操作redis_helper.set_hash('user:1', 'name', 'Alice')print(f"获取哈希 user:1 -> name: {redis_helper.get_hash('user:1', 'name')}")# 列表操作redis_helper.push_to_list('tasks', 'task1')redis_helper.push_to_list('tasks', 'task2', from_left=False)print(f"任务列表: {redis_helper.get_list('tasks')}")# 集合操作redis_helper.add_to_set('tags', 'python')redis_helper.add_to_set('tags', 'redis')print(f"标签集合: {redis_helper.get_set_members('tags')}")# 有序集合操作redis_helper.add_to_sorted_set('leaderboard', 'Alice', 100)redis_helper.add_to_sorted_set('leaderboard', 'Bob', 200)print(f"排行榜: {redis_helper.get_sorted_set('leaderboard')}")# 发布/订阅# 请在不同终端分别运行发布和订阅代码# redis_helper.publish_message('news', 'Hello, Redis!')# redis_helper.subscribe_to_channel('news')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL锁的概念

锁的基本概念 锁在 MySQL 中是一种并发控制机制,它确保在多用户或多事务环境下数据的完整性和一致性。当多个事务同时访问和操作数据库中的数据时,为了防止数据出现不一致、丢失更新、脏读、不可重复读和幻读等问题,就需要使用锁来协调这些事…

Java-多种方法实现多线程卖票

Java多线程卖票是一个经典的并发编程问题,它展示了如何在多个线程之间安全地共享和修改资 源。以下是几种实现方式: 使用synchronized关键字: 使用synchronized修饰符来同步方法或代码块,确保同一时刻只有一个线程可以访问临界区(即操 作共享资源的代码)。 使用Reen…

Px4 V2.4.8飞控Mavlink命令控制说明

首先,可以使用两种方法连接飞控,使用虚拟机(LINUX)或使用地面站(QGC)连接。 在px4的代码文件位置打开命令终端,输入连接命令: ./Tools/mavlink_shell.py 在控制台使用help来获取所有…

【Vue3】h、ref:vue3的两个新特性(重要)-h和ref

h、ref:vue3的两个新特性-重要 h 函数( createElement)ref 函数总结 在 Vue 3 中,h 和 ref 是两个非常重要的函数,它们在框架的运行和组件的创建中扮演着关键角色。在 Vue 3 中,这两个函数是构建现代 Vue 应…

MySQL8安装与卸载

1.下载mysql MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2.解压mysql安装包 解压到自己定义的目录,这里解压就是安装,解压后的路径不要有空格和中文。 3.配置环境变量 配置环境变量可以方便电脑在任何的路径…

简洁安装配置在Windows环境下使用vscode开发pytorch

简洁安装配置在Windows环境下使用vscode开发pytorch 使用anaconda安装pytorch,通过vscode集成环境开发pytorch 下载 anaconda 下载网址,选择对应系统的版本 https://repo.anaconda.com/archive/ windows可以选择Anaconda3-2024.10-1-Windows-x86_64.e…

25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)

一、JUC 简介 JUC 是 java.util.concurrent 工具包的简称,这是一个处理线程的工具包,从 JDK1.5 开始出现 二、进程与线程 1、基本介绍 (1)进程 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源…

使用 Jupyter Notebook:安装与应用指南

文章目录 安装 Jupyter Notebook1. 准备环境2. 安装 Jupyter Notebook3. 启动 Jupyter Notebook4. 选择安装方式(可选) 二、Jupyter Notebook 的基本功能1. 单元格的类型与运行2. 可视化支持3. 内置魔法命令 三、Jupyter Notebook 的实际应用场景1. 数据…

快速理解MIMO技术

引言 在无线通信领域,MIMO(Multiple-Input Multiple-Output,多输入多输出)技术是一项革命性的进步,它通过在发射端和接收端同时使用多个天线,极大地提高了通信系统的容量、可靠性和覆盖范围。本文简要阐释其…

unity学习3:如何从github下载开源的unity项目

目录 1 网上别人提供的一些github的unity项目 2 如何下载github上的开源项目呢? 2.1.0 下载工具 2.1.1 下载方法1 2.1.2 下载方法2(适合内部项目) 2.1.3 第1个项目 和第4项目 的比较 第1个项目 第2个项目 第3个项目 2.1.4 下载方法…

npm install --global windows-build-tools --save 失败

注意以下点 为啥下载windows-build-tools,是因为node-sass4.14.1 一直下载不成功,提示python2 没有安装,最终要安装这个,但是安装这个又失败,主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …

十二、Vue 路由

文章目录 一、简介二、安装与基本配置安装 Vue Router创建路由实例在应用中使用路由实例三、路由组件与视图路由组件的定义与使用四、动态路由动态路由参数的定义与获取动态路由的应用场景五、嵌套路由嵌套路由的概念与配置嵌套路由的应用场景六、路由导航<router - link>…

NLP 中文拼写检测纠正论文-08-Combining ResNet and Transformer

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…

深度学习中的离群值

文章目录 深度学习中有离群值吗&#xff1f;深度学习中的离群值来源&#xff1a;处理离群值的策略&#xff1a;1. 数据预处理阶段&#xff1a;2. 数据增强和鲁棒模型&#xff1a;3. 模型训练阶段&#xff1a;4. 异常检测集成模型&#xff1a; 如何处理对抗样本&#xff1f;总结…

儿童坐姿矫正器是如何实现语音提示功能?

儿童坐姿不正确&#xff0c;不仅影响他们的体态美观&#xff0c;更关乎其身体健康与成长发育。长期以往&#xff0c;可能会导致脊柱侧弯、近视加深等一系列健康问题。家长应当对此给予足够重视&#xff0c;及时纠正孩子们的坐姿习惯。 为了改善这一状况&#xff0c;可以从这方…

C++ 的 error_code 之三:自定义 error_condition

1 自定义 error_condition ​ 上一节我们实现了自定义的 error_code&#xff0c;通过定制 std::error_code 的内部机制&#xff0c;支持与系统相关错误码的隐式转换和直接比较&#xff0c;这一节我们再考虑一种情况。假设我们的支持库要同时支持 Windows 和 Linux 系统&#x…

pytdx,取市场股票列表,get_security_list,start参数为8000时,数据获取失败,导致无法获取全量数据的BUG修正

连接&#xff0c;普通行情&#xff08;服务器&#xff09;&#xff0c;想获取所有的深市A股的股票列表 调用get_security_list函数&#xff0c;但是发现&#xff0c;start为8000开始数据取不到了 于是&#xff0c;打开pytdx的源码 .conda/envs/qmt_mini/Lib/site-packages/p…

【蓝桥杯——物联网设计与开发】Part1:GPIO

目录 一、GPIO输出——LED &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;驱动原理 &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#x1f7e2;️main 函数 &#xff08;4&#xff09;实验现象 二…

如何得到深度学习模型的参数量和计算复杂度

1.准备好网络模型代码 import torch import torch.nn as nn import torch.optim as optim# BP_36: 输入2个节点&#xff0c;中间层36个节点&#xff0c;输出25个节点 class BP_36(nn.Module):def __init__(self):super(BP_36, self).__init__()self.fc1 nn.Linear(2, 36) # …

小程序发版后,强制更新为最新版本

为什么要强制更新为最新版本&#xff1f; 在小程序的开发和运营过程中&#xff0c;强制用户更新到最新版本是一项重要的策略&#xff0c;能够有效提升用户体验并保障系统的稳定性与安全性。以下是一些主要原因&#xff1a; 1. 功能兼容 新功能或服务通常需要最新版本的支持&…