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,一经查实,立即删除!

相关文章

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

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

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…

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

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

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; 一个提升英文单词拼…

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

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

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

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

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

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

Servlet解析

概念 Servlet是运行在服务端的小程序&#xff08;Server Applet)&#xff0c;可以处理客户端的请求并返回响应&#xff0c;主要用于构建动态的Web应用&#xff0c;是SpringMVC的基础。 生命周期 加载和初始化 默认在客户端第一次请求加载到容器中&#xff0c;通过反射实例化…

太速科技-633-4通道2Gsps 14bit AD采集PCie卡

4通道2Gsps 14bit AD采集PCie卡 一、板卡概述 二、性能指标 板卡功能 参数 内容 ADC 芯片型号 AD9689 路数 4路ADC&#xff0c; 采样率 2Gsps 数据位 14bit 数字接口 JESD204B 模拟接口 交流耦合 模拟输入 1V 连接器 6路 SMA 输入阻抗 50Ω 模拟指…

戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机硬件与操作系统之间的桥梁&#xff0c;它负责初始化和测试系统硬件组件&#xff0c;并加载启动操作系统。在某些情况下&#xff0c;如调整启动顺序、更改系统时间或日期、修改硬件配置等&#xff0c;您可能需要进入BIOS进…

分类模型评估利器-混淆矩阵

相关文章 地理时空动态模拟工具介绍&#xff08;上&#xff09; 地理时空动态模拟工具介绍&#xff08;下&#xff09;地理时空动态模拟工具的使用方法 前言 混淆矩阵&#xff08;Confusion Matrix&#xff09;是机器学习领域中用于评估分类模型性能的一种工具。它通过矩阵的…

贪心算法概述

贪心算法总是作出当前看来最好的选择&#xff0c;是局部最优 可以使用贪心算法的问题一般具有两个重要的性质 贪心选择性质最优子结构性质 贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择来达到 其与动态规划的问题区别在于&#xff0c;动态规划算法通…

Unity-Mirror网络框架-从入门到精通之Basic示例

文章目录 前言Basic示例场景元素预制体元素代码逻辑BasicNetManagerPlayer逻辑SyncVars属性Server逻辑Client逻辑 PlayerUI逻辑 最后 前言 在现代游戏开发中&#xff0c;网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架&#xff0c;专为多人…

wx015基于springboot+vue+uniapp的经济新闻资讯的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

CSS 中 content换行符实现打点 loading 正在加载中的效果

我们动态加载页面内容的时候&#xff0c;经常会使用“正在加载中…”这几个字&#xff0c;基本上&#xff0c;后面的 3 个点都是静态的。静态的问题在于&#xff0c;如果网络不流畅&#xff0c;加载时间比较长&#xff0c;就会给人有假死的 感觉&#xff0c;但是&#xff0c;如…

ESLint+Prettier的配置

ESLintPrettier的配置 安装插件 ​​​​​​ 在settings.json中写下配置 {// tab自动转换标签"emmet.triggerExpansionOnTab": true,"workbench.colorTheme": "Default Dark","editor.tabSize": 2,"editor.fontSize": …