Redis开发05:使用stackexchange.redis库对redis进行增删改查

一、安装第三方库

二、官网

StackExchange.Redis |通用型 redis 客户端

三、连接示例

 private static string redisConnectionString = "localhost:6379,password=yourpassword,defaultDatabase=0,allowAdmin=true,asyncTimeout=10000";private static string redisConnectionString = "localhost:6379,defaultDatabase=0,allowAdmin=true,asyncTimeout=10000";

四、封装:增删改查

using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp2
{public class RedisData{/// <summary>/// 键(包含冒号前的内容)/// </summary>public string Key { get; set; }/// <summary>/// 键尾/// </summary>public string KeyTail { get; set; }/// <summary>/// 值/// </summary>public string Value { get; set; }/// <summary>/// 剩余过期时间(天)/// </summary>public int? TTLDays { get; set; }/// <summary>/// 剩余过期时间(分钟)/// </summary>public int? TTLMins { get; set; }/// <summary>/// 剩余过期时间(秒)/// </summary>public int? TTLSecs { get; set; }/// <summary>/// 到期时间/// </summary>public DateTime? ExpirationTime { get; set; }/// <summary>/// 查询时间/// </summary>public DateTime QueryTime { get; set; }}public static class RedisExtension{// 默认的 Redis 连接字符串private static string redisConnectionString = "localhost:6379,defaultDatabase=0,allowAdmin=true,asyncTimeout=10000";// 使用 Lazy 实例化连接,只会在第一次使用时连接 Redisprivate static Lazy<ConnectionMultiplexer> redis = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(redisConnectionString));// 通过连接获取 Redis 数据库private static IDatabase db => redis.Value.GetDatabase();/// <summary>/// 尝试连接/// </summary>/// <param name="conn"></param>/// <returns></returns>public static async Task<bool> TryConnectAsync(string conn = null){// 如果传入了新的连接字符串,更新 Redis 连接if (!string.IsNullOrWhiteSpace(conn)){redisConnectionString = conn;// 清理现有连接,强制重新连接redis = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(redisConnectionString));}try{// 通过插入 测试 Redis 连接string testKey = Guid.NewGuid().ToString();await InsertAsync(testKey, testKey);await DeleteAsync(testKey);return true; // 连接成功}catch (Exception ex){return false; // 连接失败}}/// <summary>/// 【增加】设置一个键值对/// </summary>/// <param name="key">第一个入参示例“NewYork:School:John”(文件夹形式);第三个入参可以传递形如TimeSpan.FromSeconds(30),传null则表明永不过期</param>/// <param name="value"></param>/// <param name="expiration"></param>public static async Task<bool> InsertAsync(string key, string value, TimeSpan? expiration = null){if (await GetRedisDataByKeyAsync(key) != null){return false;}if (await db.KeyExistsAsync(key)){return false;}if (expiration == null) // 不设置超时时间{await db.StringSetAsync(key, value);}else // 设置超时时间{await db.StringSetAsync(key, value, expiration);}return true;}/// <summary>/// 【更新】设置一个键值对/// </summary>/// <param name="key">第一个入参示例“NewYork:School:John”(文件夹形式);第三个入参可以传递形如TimeSpan.FromSeconds(30),传null则表明永不过期</param>/// <param name="value"></param>/// <param name="expiration"></param>public static async Task<bool> UpdateAsync(string key, string value, TimeSpan? expiration = null){if (await GetRedisDataByKeyAsync(key) == null){return false;}if (expiration == null) // 不设置超时时间{await db.StringSetAsync(key, value);}else // 设置超时时间{await db.StringSetAsync(key, value, expiration);}return true;}/// <summary>/// 【查询】键值对信息/// </summary>/// <param name="key"></param>/// <returns></returns>public static async Task<RedisData> GetRedisDataByKeyAsync(string key){if (await db.KeyExistsAsync(key)) // 键存在{RedisData data = new RedisData(){Key = key,Value = await db.StringGetAsync(key),KeyTail = key.Split(':').LastOrDefault(),QueryTime = DateTime.Now};var ttl = await db.KeyTimeToLiveAsync(key);if (ttl != null){data.ExpirationTime = DateTime.Now.Add(ttl.Value);data.TTLDays = Convert.ToInt32(ttl.Value.TotalDays);data.TTLMins = Convert.ToInt32(ttl.Value.TotalMinutes);data.TTLSecs = Convert.ToInt32(ttl.Value.TotalSeconds);}return data;}return null;}/// <summary>/// 【删除】指定键,只有在键存在时才删除/// </summary>/// <param name="key"></param>/// <returns></returns>public static async Task<bool> DeleteAsync(string key){if (await db.KeyExistsAsync(key)) // 判断键是否存在{return await db.KeyDeleteAsync(key); // 如果存在,删除键}return false; // 如果键不存在,返回 false}/// <summary>/// 【自定义指令(仅支持简单的)】/// </summary>/// 示例输入:PING INFO(查看配置信息) FLUSHDB(删除当前数据库所有键值对)  FLUSHALL(删除所有数据库键值对)/// <returns></returns>public static async Task<string> SendCommandAsync(string command){string result = "";try{result = (await db.ExecuteAsync(command)).ToString();return result; // 返回响应}catch (Exception ex){return ex.Message.ToString();}}/// <summary>/// 【获取INFO配置信息】/// </summary>/// <returns></returns>public static async Task<Dictionary<string, string>> GetInfo(){var splitlabel = ":";var infos = await SendCommandAsync("INFO");var infosList = infos.Split().Where(x => x.Contains(splitlabel));var showdict = new Dictionary<string, string>();foreach (var item in infosList){var key = item.Split(splitlabel)[0].Trim();var value = item.Split(splitlabel)[1].Trim();switch (key){case "redis_version":showdict["版本号"] = value;break;case "redis_mode":showdict["模式"] = value;break;case "role":showdict["角色"] = value;break;case "process_id":showdict["进程PID"] = value;break;case "tcp_port":showdict["TCP端口"] = value;break;case "uptime_in_days":showdict["服务已运行天数"] = value;break;case "hz":showdict["每秒执行操作数"] = value;break;case "executable":showdict["执行文件路径"] = value;break;case "config_file":showdict["配置文件路径"] = value;//executablebreak;case "connected_clients":showdict["当前连接数"] = value;break;case "blocked_clients":showdict["阻塞数量"] = value;break;case "used_memory_human":showdict["总使用内存"] = value;break;case "used_memory_rss_human":showdict["物理内存"] = value;break;case "used_memory_peak_human":showdict["峰值使用内存"] = value;break;case "maxmemory_policy":showdict["内存回收策略"] = value;break;case "mem_fragmentation_ratio":showdict["碎片比例"] = value;break;case "mem_allocator":showdict["内存分配器"] = value;break;case "rdb_last_save_time":showdict["RDB上次成功保存的时间"] = DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt32(value)).LocalDateTime.ToString("yyyy年MM月dd日 HH时mm分ss秒"); break;case "rdb_last_bgsave_status":showdict["RDB上次保存的状态"] = value;break;case "aof_enabled":showdict["是否启用 AOF 持久化"] = value;break;case "expired_keys":showdict["过期的键数量"] = value;break;case "pubsub_channels":showdict["当前的订阅频道数"] = value;break;case "pubsub_patterns":showdict["当前的订阅模式数"] = value;break;case "latest_fork_usec":showdict["最近一次 fork 操作的耗时(秒)"] = Math.Round(Convert.ToDouble(value)/1000,2).ToString();break;case "cluster_enabled":showdict["是否启用集群模式"] = value;break;default:break;}}return showdict;}}}

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

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

相关文章

【golang】单元测试,以及出现undefined时的解决方案

单元测试 要对某一方法进行测试时&#xff0c;例如如下这一简单减法函数&#xff0c;选中函数名后右键->转到->测试 1&#xff09;Empty test file 就是一个空文件&#xff0c;我们可以自己写测试的逻辑 但是直接点绿色箭头运行会出问题&#xff1a; 找不到包。我们要在…

火语言RPA流程组件介绍--键盘按键

&#x1f6a9;【组件功能】&#xff1a;模拟键盘按键 配置预览 配置说明 按键 点击后,在弹出的软键盘上选择需要的按键 执行后等待时间(ms) 默认值300,执行该组件后等待300毫秒后执行下一个组件. 输入输出 输入类型 万能对象类型(System.Object)输出类型 万能对象类型…

护航开源大赛,赋能数字未来

近日&#xff0c;在2024世界互联网大会乌镇峰会互联网公益慈善论坛上&#xff0c;2024中国互联网发展创新与投资大赛&#xff08;开源&#xff09;圆满落幕。作为大赛的技术支持单位&#xff0c;棱镜七彩支撑了大赛的分析评估&#xff0c;定量化、科学化、体系化、专业化的对参…

Profinet转EtherNet/IP网关是如何解决西门子S7-1500PLC与AB PLC的通讯问题的

一、 案例背景 在一个工业现场&#xff0c;一端是AB的PLC&#xff0c;IP地址192.168.1.20;另一端西门子是S7-1500系列&#xff0c;IP地址192.168.2.248。AB的PLC内有 B3、N7、F8 三个寄存器文件涉及到通讯&#xff0c;分别对应西门子PLC的M、DB1、DB2三个存储区域。通过捷米特…

GateWay使用手册

好的&#xff0c;下面是优化后的版本。为了提高可读性和规范性&#xff0c;我对内容进行了结构化、简化了部分代码&#xff0c;同时增加了注释说明&#xff0c;便于理解。 1. 引入依赖 在 pom.xml 中添加以下依赖&#xff1a; <dependencies><!-- Spring Cloud Gate…

SpringBoot+Flowable快速实现工流_动态选择审批人员

前言 OA系统中的工作流不仅是企业日常运营的重要组成部分&#xff0c;也是实现企业数字化转型、提高工作效率和执行力的重要工具。 在国内大部分的工作流系统使用Activiti框架实现。 其实flowable也可以轻松实现工作流业务。在线体验JeecgFlow flowable简介 Flowable是一个使用…

【ONE·基础算法 || 动态规划(三)】

总言 主要内容&#xff1a;编程题举例&#xff0c;熟悉理解动态规划类题型&#xff08;回文串问题、两个数组的 dp问题&#xff09;。                文章目录 总言7、回文串问题7.1、 回文子串&#xff08;medium&#xff09;7.1.1、题解 7.2、 最长回文子串&#…

Python 3 教程第33篇(MySQL - mysql-connector 驱动)

Python MySQL - mysql-connector 驱动 MySQL 是最流行的关系型数据库管理系统&#xff0c;如果你不熟悉 MySQL&#xff0c;可以阅读我们的 MySQL 教程。 本章节我们为大家介绍使用 mysql-connector 来连接使用 MySQL&#xff0c; mysql-connector 是 MySQL 官方提供的驱动器。…

LLM*:路径规划的大型语言模型增强增量启发式搜索

路径规划是机器人技术和自主导航中的一个基本科学问题&#xff0c;需要从起点到目的地推导出有效的路线&#xff0c;同时避开障碍物。A* 及其变体等传统算法能够确保路径有效性&#xff0c;但随着状态空间的增长&#xff0c;计算和内存效率会严重降低。相反&#xff0c;大型语言…

【Db First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

企业品牌曝光的新策略:短视频矩阵系统

企业品牌曝光的新策略&#xff1a;短视频矩阵系统 在当今数字化时代&#xff0c;短视频已经渗透到我们的日常生活之中&#xff0c;成为连接品牌与消费者的关键渠道。然而&#xff0c;随着平台于7月20日全面下线了短视频矩阵的官方接口&#xff0c;许多依赖于此接口的小公司和内…

006 MATLAB编程基础

01 M文件 MATLAB输入命令有两种方法&#xff1a; 一是在MATLAB主窗口逐行输入命令&#xff0c;每个命令之间用分号或逗号分隔&#xff0c;每行可包含多个命令。 二是将命令组织成一个命令语句文集&#xff0c;使用扩展名“.m”&#xff0c;称为M文件。它由一系列的命令和语句…

Java基于SpringBoot+Vue的IT技术交流和分享平台(附源码+lw+部署)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【计算机网络】实验3:集线器和交换器的区别及交换器的自学习算法

实验 3&#xff1a;集线器和交换器的区别及交换器的自学习算法 一、 实验目的 加深对集线器和交换器的区别的理解。 了解交换器的自学习算法。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、熟悉集线器和交换器的区别 (1) 第一步&#xff1a;构建网络…

UICollectionView在xcode16编译闪退问题

使用xcode15运行工程&#xff0c;控制台会出现如下提示&#xff1a; Expected dequeued view to be returned to the collection view in preparation for display. When the collection views data source is asked to provide a view for a given index path, ensure that a …

Proteus8.17下载安装教程

Proteus是一款嵌入式系统仿真开发软件&#xff0c;实现了从原理图设计、单片机编程、系统仿真到PCB设计&#xff0c;真正实现了从概念到产品的完整设计&#xff0c;其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等&#xff0c;能够帮助用…

Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架

一、项目构建环境准备 在构建Vue项目之前&#xff0c;需要搭建Node环境以及Vue-CLI脚手架&#xff0c;由于本篇文章为上一篇文章的补充&#xff0c;也是为了给大家分享更为完整的搭建vue项目方式&#xff0c;所以环境准备部分采用Vue教程&#xff5c;搭建vue项目&#xff5c;V…

一款支持80+语言,包括:拉丁文、中文、阿拉伯文、梵文等开源OCR库

大家好&#xff0c;今天给大家分享一个基于PyTorch的OCR库EasyOCR&#xff0c;它允许开发者通过简单的API调用来读取图片中的文本&#xff0c;无需复杂的模型训练过程。 项目介绍 EasyOCR 是一个基于Python的开源项目&#xff0c;它提供了一个简单易用的光学字符识别&#xff…

cocotb pytest

打印python中的print &#xff0c; 应该使用 pytest -s

【C++】STL——map和set

目录 1、序列式容器和关联式容器前 2、set 2.1 set类的介绍 2.2 set的构造和迭代器 2.3 set的增删查 set 的插入 set的查找 set的删除 2.4 multiset和set的差异 3、map 3 .1 pair类型 3.2 map的构造 3.3 map的增删查 map的构造遍历 map的插入 map的删除 map的查…