Redis开发实践

在现代开发中,Redis 已经成为一种重要的高性能内存数据库。无论是作为缓存、消息队列还是排行榜的实现工具,它都表现出了极高的性能和灵活性。本文将带你了解 Redis 的基本概念,并通过 Python 示例代码实现 Redis 的核心功能。

文章目录

    • 1. Redis概述
      • 核心特点
    • 2. 环境准备
      • 安装 Redis
      • 安装 Python Redis 客户端
    • 3. Redis 基础操作(Python 实现)
      • 3.1 连接 Redis
      • 3.2 字符串操作
        • 使用场景
        • Python 示例
      • 3.3 列表操作
        • 使用场景
        • Python 示例
      • 3.4 哈希操作
        • 使用场景
        • Python 示例
      • 3.5 有序集合操作
        • 使用场景
        • Python 示例
    • 4. Redis 进阶功能(Python 实现)
      • 4.1 发布订阅(Pub/Sub)
        • 使用场景
        • Python 示例
      • 4.2 分布式锁
        • 使用场景
        • Python 示例
      • 4.3 持久化
    • 5. 性能优化与最佳实践
    • 6. 总结


1. Redis概述

Redis 是一个开源的内存数据结构存储,支持多种数据结构(字符串、哈希、列表、集合、有序集合等),并提供高效的读写性能。它既可以作为缓存,也可以作为持久化存储的一部分。

核心特点

  • 高性能:基于内存操作,延迟通常低于 1 毫秒。
  • 丰富的数据结构:支持字符串、列表、集合等多种结构。
  • 多功能:支持持久化、消息发布订阅、Lua 脚本等。
  • 分布式支持:通过 Redis Cluster 提供分布式存储。

2. 环境准备

安装 Redis

  1. 从 Redis 官网 下载并安装 Redis。
  2. 启动 Redis 服务:
    redis-server
    

安装 Python Redis 客户端

使用 redis-py 库来与 Redis 进行交互:

pip install redis

3. Redis 基础操作(Python 实现)

以下是 Redis 的基础操作以及对应的 Python 实现代码。

3.1 连接 Redis

from redis import Redis# 连接 Redis
redis_client = Redis(host="xxxx",port=6379,password="xxxx",decode_responses=True)
# 测试连接
try:redis_client.ping()print("成功连接到 Redis!")
except redis.ConnectionError:print("连接 Redis 失败,请检查服务是否启动。")

3.2 字符串操作

使用场景
  • 缓存简单的键值对,如用户信息、配置项。
Python 示例
# 设置键值对
redis_client.set("username", "Alice")
print("设置用户名:", redis_client.get("username"))# 设置带过期时间的键
redis_client.setex("temp_key", 10, "This will expire in 10 seconds")
print("临时键值:", redis_client.get("temp_key"))

3.3 列表操作

使用场景
  • 实现队列或栈功能。
Python 示例
# 左侧推入列表
redis_client.lpush("tasks", "task1", "task2", "task3")
print("当前任务列表:", redis_client.lrange("tasks", 0, -1))# 从右侧弹出一个任务
completed_task = redis_client.rpop("tasks")
print("完成任务:", completed_task)
print("剩余任务列表:", redis_client.lrange("tasks", 0, -1))

3.4 哈希操作

使用场景
  • 存储用户信息、对象属性等结构化数据。
Python 示例
# 设置哈希值
redis_client.hset("user:1001", mapping={"name": "Alice", "age": "30", "city": "New York"})
print("用户信息:", redis_client.hgetall("user:1001"))# 更新哈希值
redis_client.hset("user:1001", "age", "31")
print("更新后用户信息:", redis_client.hgetall("user:1001"))

3.5 有序集合操作

使用场景
  • 实现排行榜功能。
Python 示例
# 添加有序集合
redis_client.zadd("leaderboard", {"Alice": 100, "Bob": 95, "Charlie": 120})
print("排行榜:", redis_client.zrange("leaderboard", 0, -1, withscores=True))# 获取指定排名的用户
print("排名第一的用户:", redis_client.zrevrange("leaderboard", 0, 0, withscores=True))

4. Redis 进阶功能(Python 实现)

4.1 发布订阅(Pub/Sub)

使用场景
  • 实现实时消息通知或事件驱动系统。
Python 示例
# 发布消息
def publisher():redis_client.publish("news", "Breaking News: Python is awesome!")# 订阅消息
def subscriber():pubsub = redis_client.pubsub()pubsub.subscribe("news")for message in pubsub.listen():if message["type"] == "message":print(f"收到消息:{message['data']}")# 示例调用
import threadingthreading.Thread(target=subscriber).start()
publisher()

4.2 分布式锁

使用场景
  • 保证多进程或多实例间的互斥访问。
Python 示例
import timelock_key = "resource_lock"# 获取锁
if redis_client.set(lock_key, "locked", ex=10, nx=True):print("成功获取锁!")time.sleep(5)  # 模拟资源访问redis_client.delete(lock_key)  # 释放锁print("锁已释放")
else:print("未能获取锁,资源已被占用。")

4.3 持久化

Redis 提供两种持久化方式:

  1. RDB(快照):将内存数据定期保存到磁盘。
  2. AOF(Append-Only File):将每次写操作记录到日志文件。

配置文件中可启用:

save 900 1
appendonly yes

5. 性能优化与最佳实践

  1. 缓存策略

    • 设置合适的过期时间(EX)。
    • 使用 maxmemory-policy 控制内存淘汰策略(如 LRU)。
  2. 避免缓存穿透、击穿和雪崩

    • 穿透:为不存在的数据设置空值缓存。
    • 击穿:使用锁机制防止大量并发请求直接访问数据库。
    • 雪崩:为缓存设置随机过期时间,避免同时失效。
  3. 使用 Pipeline

    • 批量操作以减少网络延迟。
 pipe = redis_client.pipeline()for i in range(1, 6):pipe.set(f"key{i}", f"value{i}")pipe.execute()

6. 总结

Redis 是一个功能强大且灵活的内存数据库,适用于多种场景,如缓存、队列、排行榜等。通过本文,你可以快速上手 Redis 的基本操作,并用 Python 实现其核心功能。未来,可以进一步探索 Redis 的集群模式、哨兵机制和高级功能,进一步优化你的系统。


如果你对 Redis 和 Python 的结合有更多兴趣,可以参考 Redis 官方文档 和 redis-py 库。

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

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

相关文章

【el-table】表格后端排序

在需要排序的列添加属性 sortable,后端排序,需将sortable设置为custom 如果需要自定义轮转添加 sort-orders 属性,数组中的元素需为以下三者之一:ascending 表示升序,descending 表示降序,null 表示还原为原…

Linux迁移gitlab容器

Linux迁移gitlab容器并配置 迁移gitlab容器本文分两部分,第一步在新服务器上安装相同版本的gitlab容器,可以在确定gitlab版本之后直接在docker上拉取,我这里直接从原服务器上将镜像打包加载到新服务器上。第二步从原服务器上操作备份文件&am…

3.建立本地仓库及常用命令

1.建立本地仓库 要使用Git对我们的代码进行版本控制,首先需要获得本地仓库 1)在电脑的任意位置创建一个空目录,作为我们的本地Git仓库 2)进入这个目录,右键点击Git Bash 窗口 3)执行命令git init 4) 如果创…

Narya.ai正在寻找iOS工程师!#Mixlab内推

如果你对AI技术和iOS开发充满热情,这里有一个绝佳的机会加入一家专注于AI应用创新的初创公司。Narya.ai正在招聘iOS工程师,帮助他们开发下一代效率工具,旨在提升用户的日常生活效率与幸福感。 关于Narya.ai: 专注于AI应用层创新&a…

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1:GAN是个啥? 生成式对抗网络(Generative Adversarial Networks, GAN),名字听着就有点“对抗”的意思,没错!它其实是两个神经网络互相斗智斗勇的游戏: 生成器(Gene…

网络安全攻击和防范措施

常见的有四种网络安全攻击方式. 第一种是XSS跨站脚本攻击,往网页中插入恶意脚本代码以攻击用户. 防范措施有三种. 第一种是输入过滤,对用户的所有输入数据进行检测,过滤掉可能导致脚本的字符. 第二种是输出编码,使用工具对用户输入进行编码,使其中可能含有的HTML脚本变成普通…

Redis服务配置文件 redis.conf 更新修改配置参数说明

场景: 在安装redis服务中,默认的配置项通常不能实际使用,需要修改一些配置参数 修改配置参数 1、拿到 redis.cnf 文件,此文件通常在 redis 项目源码的第一级目录下 2、修改配置内容,主要修改项如下 protect…

成功解决logs is not a directory [Op:CreateSummaryFileWriter] name

成功解决logs is not a directory [Op:CreateSummaryFileWriter] name 目录 解决问题 解决思路 解决方法 1、确保日志目录存在 2、权限问题 3、日志路径配置问题 解决问题 tensorflow.python.framework.errors_impl.FailedPreconditionError: {{function_node __wrapped…

数据集增强:提升深度学习模型泛化能力的关键技术

在深度学习中,数据是模型性能的基石。大规模、高质量的数据集通常能显著提高模型的泛化能力,帮助模型在真实场景中做出更准确的预测。然而,在很多实际应用中,数据收集困难、昂贵或者受限,尤其是当数据集相对较小或标注…

039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)

(来左边儿 跟我一起画个龙,在你右边儿 画一道彩虹 ~~~~~~~~~~~ ) 效果如下: 以下展示部分颜色源码: namespace AcTools {public class Class1{public Wform.Timer timer;//定时器需建在类下面public s…

第1章:CSS简介 --[CSS零基础入门]

1. 什么是CSS CSS(层叠样式表,Cascading Style Sheets)是一种用于描述HTML或XML(包括各种XML方言如SVG、XHTML等)文档表现的样式语言。CSS的主要目的是将网页的内容与它的表现形式分离,从而使得开发者能够…

Android 中绘制带箭头的线

在 Android 中绘制带箭头的线,可以使用 Canvas 和 Paint 类。以下是一个示例,展示了如何在自定义 View 中绘制一条带有箭头的线。 自定义 View 实现 你可以创建一个自定义的 View,并覆盖其 onDraw() 方法来实现这个功能。 java public clas…

面试题整理(二)

芯冰乐知识星球入口:芯冰乐

JS +CSS @keyframes fadeInUp 来定义载入动画

JSCSS 更完美展现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>跳动加载指示器</title>&l…

【SpringBoot】整合篇

1、log4j2 第一步&#xff0c;导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions><!-- 去掉springboot默认配置 --> <exclusion> <…

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…

web vue 滑动选择 n宫格选中 九宫格选中

页面动态布局经常性要交给客户来操作&#xff0c;他们按时他们的习惯在同一个屏幕内显示若干个子视图&#xff0c;尤其是在医学影像领域对于影像的同屏显示目视对比显的更为重要。 来看看如下的用户体验&#xff1a; 设计为最多支持5行6列页面展示后&#xff0c;右侧的布局则动…

解决idea使用maven打包时无法将本地lib库文件和resource目录中的资源文件打包进jar文件的问题!!!

一、问题复现 1&#xff09;项目结构如下 我们看到项目中手动添加了本地lib资源&#xff0c;同时bootspring的配置文件和mapper文件也放在了resouces目录中。 2&#xff09;上述结构的项目在使用maven打包时&#xff0c;最终生成的jar文件中将不包含lib库文件&#xff0c;甚…

React进阶面试题(四)

React 的 reconciliation&#xff08;协调&#xff09;算法 Reconciliation是React的diff算法&#xff0c;用于比较更新前后的虚拟DOM树差异&#xff0c;从而使用最小的代价将原始DOM按照新的状态、属性进行更新。其目的是找出两棵树的差异&#xff0c;原生方式直接比较复杂度…

【短视频矩阵系统==saas技术开发】

在数字媒体领域&#xff0c;短视频的崛起已不可忽视。对于商业实体而言&#xff0c;掌握如何通过短视频平台有效吸引潜在客户并提高转化率&#xff0c;已成为一项关键课题。本文旨在深入剖析短视频矩阵系统的构成与作用机制&#xff0c;以期为企业提供一套系统化的策略&#xf…