当前位置: 首页 > article >正文

Redis在.NET平台中的各种应用场景

关键点总结

  1. 连接管理:所有示例都使用ConnectionMultiplexer来管理Redis连接,它是线程安全的,应该在整个应用程序中重用。

  2. 键设计:良好的键命名规范很重要,通常使用冒号分隔的层次结构(如page:home:pv)。

  3. 数据序列化:Redis存储的是二进制数据,.NET客户端会自动处理基本类型的序列化。

  4. 原子操作:Redis命令是原子性的,适合实现计数器、排行榜等需要原子更新的场景。

  5. 过期策略:合理设置过期时间可以防止数据无限增长,特别是用于缓存和限流的场景。

  6. 错误处理:生产代码中应该添加适当的错误处理和重试逻辑,特别是网络操作。

  7. 性能考虑:Redis虽然是内存数据库,但不当使用(如大键、复杂操作)仍可能影响性能。

1. 缓存系统

// 在Startup.cs中配置Redis作为分布式缓存
services.AddStackExchangeRedisCache(options =>
{options.Configuration = "localhost:6379"; // Redis服务器地址和端口options.InstanceName = "SampleInstance_"; // 键前缀,用于区分不同应用实例
});// 在控制器中使用缓存
public class HomeController : Controller
{private readonly IDistributedCache _cache; // 依赖注入分布式缓存接口public HomeController(IDistributedCache cache){_cache = cache;}public IActionResult Index(){// 尝试从缓存获取数据var cachedData = _cache.GetString("CachedTime");// 如果缓存中没有数据(缓存未命中)if (cachedData == null){// 生成新数据(这里用当前时间模拟)cachedData = DateTime.Now.ToString();// 将数据存入缓存,设置5分钟绝对过期时间_cache.SetString("CachedTime", cachedData, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5) });}// 返回视图,传入缓存数据作为模型return View(model: cachedData);}
}

2. 会话存储(Session Storage)

// 配置会话服务
services.AddSession(options =>
{options.IdleTimeout = TimeSpan.FromMinutes(20); // 会话20分钟无活动后过期options.Cookie.HttpOnly = true; // 设置HttpOnly标志增强安全性
});// 配置Redis作为分布式缓存用于会话存储
services.AddDistributedRedisCache(options =>
{options.Configuration = "localhost:6379"; // Redis连接字符串options.InstanceName = "Session_"; // 键前缀,区分会话数据
});// 在控制器中会自动通过HttpContext.Session访问会话

3. 消息队列(发布/订阅模式)

// 发布者代码
var redis = ConnectionMultiplexer.Connect("localhost:6379"); // 创建Redis连接
var sub = redis.GetSubscriber(); // 获取发布/订阅对象
sub.Publish("messages", "Hello from .NET!"); // 向"messages"频道发布消息// 订阅者代码
var redis = ConnectionMultiplexer.Connect("localhost:6379"); // 创建Redis连接
var sub = redis.GetSubscriber(); // 获取发布/订阅对象// 订阅"messages"频道,定义收到消息时的回调
sub.Subscribe("messages", (channel, message) => {Console.WriteLine($"收到消息: {message}"); // 处理收到的消息
});// 注意:在实际应用中,订阅者通常是长期运行的后台服务

4. 排行榜系统

var redis = ConnectionMultiplexer.Connect("localhost:6379"); // 创建Redis连接
var db = redis.GetDatabase(); // 获取数据库对象// 向有序集合"leaderboard"添加玩家分数
// SortedSetAdd方法参数:键名、成员、分数
db.SortedSetAdd("leaderboard", "player1", 100);
db.SortedSetAdd("leaderboard", "player2", 200);// 获取排行榜前10名(带分数)
// 参数:键名、起始排名、结束排名、排序方式(降序)
var topPlayers = db.SortedSetRangeByRankWithScores("leaderboard", 0, 9, Order.Descending);// topPlayers是SortedSetEntry数组,包含成员和分数
foreach (var player in topPlayers)
{Console.WriteLine($"{player.Element}: {player.Score}");
}

5. 分布式锁

var redis = ConnectionMultiplexer.Connect("localhost:6379"); // 创建Redis连接
var db = redis.GetDatabase(); // 获取数据库对象var lockKey = "resource_lock"; // 锁的键名
var lockToken = Guid.NewGuid().ToString(); // 唯一标识符,确保只有锁的持有者能释放// 尝试获取锁
// 参数:键名、唯一令牌、锁的持有时间
bool acquired = db.LockTake(lockKey, lockToken, TimeSpan.FromSeconds(10));try
{if (acquired){// 成功获取锁后执行临界区代码Console.WriteLine("执行需要互斥访问的操作...");// 这里可以访问共享资源或执行需要同步的操作}else{Console.WriteLine("获取锁失败,可能有其他实例正在操作");}
}
finally
{// 确保锁被释放if (acquired){// 释放锁,需要验证令牌匹配// 参数:键名、获取锁时使用的令牌bool released = db.LockRelease(lockKey, lockToken);if (!released){Console.WriteLine("释放锁失败");}}
}

6. 实时分析

var db = redis.GetDatabase(); // 获取数据库对象// 使用HyperLogLog统计独立访客数(UV)
// HyperLogLog是一种概率数据结构,用于高效统计唯一值
db.HyperLogLogAdd("page:home:uv", "user1"); // 添加用户1
db.HyperLogLogAdd("page:home:uv", "user2"); // 添加用户2
// 获取估计的唯一访客数
long uvCount = db.HyperLogLogLength("page:home:uv");
Console.WriteLine($"独立访客数: {uvCount}");// 使用INCR命令统计页面浏览量(PV)
// 每次访问增加计数器
db.StringIncrement("page:home:pv");
// 获取当前PV值
var pv = db.StringGet("page:home:pv");
Console.WriteLine($"页面浏览量: {pv}");

7. 限流控制

public bool IsRateLimited(string apiKey, int limit, TimeSpan period)
{var key = $"rate_limit:{apiKey}"; // 为每个API键创建唯一的Redis键var db = redis.GetDatabase();// 原子性增加计数器并获取新值var current = db.StringIncrement(key);// 如果当前值是1(第一次调用),设置过期时间if (current == 1){db.KeyExpire(key, period); // 设置键的生存时间(限流周期)}// 如果当前值超过限制,返回true(需要限流)return current > limit;// 使用示例:// if(IsRateLimited("user123", 100, TimeSpan.FromMinutes(1)))// {//     return new StatusCodeResult(429); // 返回"Too Many Requests"// }
}

相关文章:

Redis在.NET平台中的各种应用场景

关键点总结 连接管理:所有示例都使用ConnectionMultiplexer来管理Redis连接,它是线程安全的,应该在整个应用程序中重用。 键设计:良好的键命名规范很重要,通常使用冒号分隔的层次结构(如page:home:pv)。 数据序列化&…...

近几年字节测开部分面试题整理

文章目录 前言一、面试问题1. 在浏览器url上写一个地址,请描述一下网络方面有哪些变化2. 堆栈数据存储位置3. HTTP POST请求支持的数据格式4. 缩容要注意些什么?5. Python中元组、数组、list和数组的区别6. Python中is和的区别7. HTTP与HTTPS8. 已知两个…...

艾蒙顿桌面app下载-Emotn UI下载安装-emotn ui官方tv版安卓固件

在智能电视桌面应用的领域里,Emotn UI 凭借其简洁无广告、可自定义等特点,赢得了不少用户的关注。然而,小编深入了解后发现了一款更好用的电视桌面——乐看家桌面在诸多方面更具优势,能为你带来更优质的大屏体验。 乐看家桌面内置…...

3、ArkTS语言介绍

目录 基础知识函数函数声明可选参数Rest参数返回类型箭头函数(又名Lambda函数)闭包 类字段字段初始化getter和setter继承父类访问方法重写方法重载签名可见性修饰符(Public、Private、protected) 基础知识 ArkTS是一种为构建高性…...

修改了Element UI中组件的样式,打包后样式丢失

修改了Element UI中组件的样式,在本地运行没有问题,但是打包到线上发现样式丢失(样式全部不生效、或者有一部分生效,一部分不生效),问题在于css的加载顺序导致代码编译后样式被覆盖了, 解决办法…...

Linux GPIO驱动开发实战:Poll与异步通知双机制详解

1. 引言 在嵌入式Linux开发中,GPIO按键驱动是最基础也最典型的案例之一。本文将基于一个支持poll和异步通知双机制的GPIO驱动框架,深入剖析以下核心内容: GPIO中断与防抖处理环形缓冲区设计Poll机制实现异步通知(SIGIO)实现应用层交互方式 …...

【springsecurity oauth2授权中心】jwt令牌更换成自省令牌 OpaqueToken P4

前言 前面实现了授权中心授权,客户端拿到access_token后就能请求资源服务器接口 权限的校验都是在资源服务器上进行的,授权服务器颁发的access_token有限期是2小时,也就是说在2小时之内,不管授权服务器那边用户的权限如何变更都…...

诱骗协议芯片支持PD2.0/3.0/3.1/PPS协议,支持使用一个Type-C与电脑传输数据和快充取电功能

快充是由充电器端的充电协议和设备端的取电协议进行握手通讯进行协议识别来完成的,当充电器端的充电协议和设备端的取电协议握手成功后,设备会向充电器发送电压请求,充电器会根据设备的需求发送合适的电压给设备快速供电。 设备如何选择快充…...

变量在template里不好使,在setup好使?

问题: 自定义的一个函数 ,import导入后 setup里面使用正常 ,在template里面说未定义 作用域问题 在 Vue 的模板语法中,模板(template )里能直接访问的是组件实例上暴露的属性和方法。从代码看&#xff0c…...

OpenCV 图形API(53)颜色空间转换-----将 RGB 图像转换为灰度图像函数RGB2Gray()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 RGB 色彩空间转换为灰度。 R、G 和 B 通道值的常规范围是 0 到 255。生成的灰度值计算方式如下: dst ( I ) 0.299 ∗ src…...

Trae+DeepSeek学习Python开发MVC框架程序笔记(四):使用sqlite存储查询并验证用户名和密码

继续通过Trae向DeepSeek发问并修改程序,实现程序运行时生成数据库,用户在系统登录页面输入用户名和密码后,控制器通过模型查询用户数据库表来验证用户名和密码,验证通过后显示登录成功页面,验证失败则显示登录失败页面…...

超详细mac上用nvm安装node环境,配置npm

一、安装NVM 打开终端,运行以下命令来安装NVM: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash 然后就会出现如下代码: > Profile not found. Tried ~/.bashrc, ~/.bash_profile, ~/.zprofile, ~/.…...

STM32 串口通信

引言 在嵌入式系统开发中,串口通信是最基础且重要的通信方式之一。无论是设备调试、模块对接还是远程通信,串口都扮演着关键角色。本文将从通信协议原理出发,结合STM32F4系列MCU,深入讲解串口通信的硬件实现和软件配置&#xff0…...

hi3516cv610构建音频sample工程代码步骤

hi3516cv610构建音频sample工程代码步骤 sdk版本:Hi3516CV610_SDK_V1.0.1.0 硬件:非es8388 工程代码: 通过网盘分享的文件:audio_easy.zip 链接: https://pan.baidu.com/s/1gx61S_F3-pf6hPyfbGaRXg 提取码: 4gbg --来自百度网盘…...

12.QT-Combo Box|Spin Box|模拟点餐|从文件中加载选项|调整点餐份数(C++)

Combo Box QComboBox 表⽰下拉框 核⼼属性 属性说明currentText当前选中的⽂本currentIndex当前选中的条⽬下标.从0开始计算.如果当前没有条⽬被选中,值为-1editable是否允许修改设为true时, QComboBox 的⾏为就⾮常接近 QLineEdit ,也可以 设置 validatoriconSize下拉框图标…...

UML 顺序图:电子图书馆管理系统的交互之道

目录 一、初识 UML 顺序图 二、电子图书馆管理系统顺序图解析 (一)借阅流程 (二)归还流程 三、顺序图绘画 四、顺序图的优势与价值 五、总结 UML 顺序图是描绘系统组件交互的有力工具。顺序图直观展示消息传递顺序与对象协…...

分布式架构设计与应用:从理论到实践

在云计算、大数据与高并发场景的驱动下,分布式架构已成为现代软件系统的核心技术。它通过将计算、存储与业务逻辑分散到多台机器上,解决了单体架构的扩展性瓶颈与单点故障问题。本文将从设计原则、核心组件到典型应用场景,深入剖析分布式架构…...

Uniapp:view容器(容器布局)

目录 一、基本概述二、属性说明三、常用布局3.1 横向布局3.2 纵向布局3.3 更多布局3.3.1 纵向布局-自动宽度3.3.2 纵向布局-固定宽度3.3.3 横向布局-自动宽度3.3.4 横向布局-居中3.3.5 横向布局-居右3.3.6 横向布局-平均分布3.3.7 横向布局-两端对齐3.3.8 横向布局-自动填充3.3…...

访问者模式:分离数据结构与操作的设计模式

访问者模式:分离数据结构与操作的设计模式 一、模式核心:将操作从数据结构中分离,支持动态添加新操作 在软件开发中,当数据结构(如树、集合)中的元素类型固定,但需要频繁添加新的操作&#xf…...

【AI训练环境搭建】在IDE(Pycharm或VSCode)上使用WSL2+Ubuntu22.04+Conda+Tensorflow+GPU进行机器学习训练

本次实践将在IDE(Pycharm或VSCode)上使用WSL2Ubuntu22.04TensorflowGPU进行机器学习训练。基本原理是在IDE中拉起WSL2中的Python解释器,并运行Python程序。要运行CondaTensorflowGPU你可能需要进行以下准备工作。 1. 此示例中将使用一个mnis…...

Leetcode19(亚马逊真题):删除链表的倒是第N个节点

题目分析 删除节点关键:找到被删节点的前一个节点,指针指向 虚拟头节点,方便删除头结点,形成统一操作 为啥要让快指针先行? 我认为更好懂的一种解释:快指针先行n步,这样快慢指针之间形成了一…...

Hadoop+Spark 笔记 2025/4/21

读书笔记 定义 1. 大数据(Big Data) - 指传统数据处理工具难以处理的海量、高速、多样的数据集合,通常具备3V特性(Volume体量大、Velocity速度快、Variety多样性)。扩展后还包括Veracity(真实性&#x…...

千问2.5-VL-7B的推理、微调、部署_笔记2

接上篇:部署千问2.5-VL-7B_笔记1-CSDN博客 这里主要记录微调过程 一、模型微调 这里也使用ms-swift对qwen2.5和qwen2-vl进行自我认知微调和图像OCR微调,并对微调后的模型进行推理。ms-swift是魔搭社区官方提供的LLM工具箱,支持300大语言模…...

Redis从入门到实战基础篇

前言:Redis的安装包含在Redis从入门到实战先导篇中,需要的可移步至此节 目录 1.Redis简单介绍 2.初始Redis 2.1.认识NoSQL 2.2.认识Redis 2.3.安装Redis 3.Redis常见命令 3.1 Redis数据结构 3.2 通用命令 3.3 String命令 3.4 Key的层级结构 3…...

【Docker】在Ubuntu平台上的安装部署

写在前面 docker作为一种部署项目的辅助工具,真是太好用了需要魔法,不然无法正常运行笔者环境:ubuntu22.04 具体步骤 更新系统包索引 sudo apt update安装必要依赖包 sudo apt install -y apt-transport-https ca-certificates curl softwa…...

Java虚拟机(JVM)家族发展史及版本对比

Java虚拟机(JVM)家族发展史及版本对比 一、JVM家族发展史 1. 早期阶段(1996-2000) Classic VM(Java 1.0-1.1): 厂商:Sun Microsystems(Oracle前身)。特点&…...

【学习笔记】Cadence电子设计全流程(三)Capture CIS 原理图绘制(下)

【学习笔记】Cadence电子设计全流程(三)Capture CIS 原理图绘制(下) 3.16 原理图中元件的编辑与更新3.17 原理图元件跳转与查找3.18 原理图常见错误设置于编译检查3.19 低版本原理图文件输出3.20 原理图文件的锁定与解锁3.21 Orca…...

数据库对象与权限管理-Oracle数据字典详解

1. 数据字典概念讲解 Oracle数据字典是数据库的核心组件,它存储了关于数据库结构、用户信息、权限设置和系统性能等重要的元数据信息。这些信息对于数据库的日常管理和维护至关重要。数据字典在数据库创建时自动生成,并随着数据库的运行不断更新。 数据…...

计算机图形学实践:结合Qt和OpenGL实现绘制彩色三角形

在Qt项目中结合OpenGL与CMake需要配置正确的依赖关系、链接库以及代码结构设计。以下是具体实现步骤和关键要点: 一、环境准备 安装Qt 确保安装包含OpenGL模块的Qt版本(如Qt OpenGL、Qt OpenGLWidgets组件)。安装CMake 使用3.10及以上版本&a…...

OpenCV 图形API(54)颜色空间转换-----将图像从 RGB 色彩空间转换到 HSV色彩空间RGB2HSV()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 RGB 色彩空间转换为 HSV。该函数将输入图像从 RGB 色彩空间转换到 HSV。R、G 和 B 通道值的常规范围是 0 到 255。 输出图像必须是 8 位…...