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.mzph.cn/pingmian/62723.shtml

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

相关文章

Electron + vue3 打包之后不能跳转路由

路由不跳转问题原因&#xff1a; 是因为electron需要将vue-router的mode调整为hash模式(两种写法) export default new Router({mode: hash, //这里history修改为hashscrollBehavior: () > ({y: 0}),routes: constantRouterMap, }) export default new createRouter({his…

React第十节组件之间传值之context

1、Context 使用creatContext() 和 useContext() Hook 实现多层级传值 概述&#xff1a; 在我们想要每个层级都需要某一属性&#xff0c;或者祖孙之间需要传值时&#xff0c;我们可以使用 props 一层一层的向下传递&#xff0c;或者我们使用更便捷的方案&#xff0c;用 creatC…

基于群晖搭建个人图书架-TaleBook based on Docker

前言 在群晖Container Manager中部署失败&#xff0c;转通过ssh部署。 一、准备工作 名称备注群晖SSH“终端机和SNMP”中启用SSH软件secureCRT等docker-compose.ymlGithub下载并修改 二、过程 2.1 创建本地文件夹 本地路径为&#xff1a; /docker/Calibre/data 2.2 下载d…

【JavaEE】JavaEE、web 开发、框架(Spring) 、Maven

文章目录 一、JavaEE 发展历程二、什么是 web 开发1、什么是 web 开发&#xff1f;2、web 网站的工作流程 三、框架1、什么是框架&#xff1f;2、为什么要学框架&#xff1f;3、框架的优点&#xff08;Spring Boot VS Servlet&#xff09; 四、Maven 一、JavaEE 发展历程 Java…

vue3项目中使用星火API

在node环境epxress中使用讯飞ai接口进行二次封装&#xff0c;通过ai对话回复提取&#xff0c;获得ai提取的文章摘要 本文章只是简单使用&#xff0c;更复杂功能比如调用星火API制作对话机器人可以查看文档&#xff0c;对于初次使用星火AI接口或许有帮助 讯飞星火大模型API-大模…

基于centos7.9容器编排Jumpserver堡垒机

Jum 基础环境容器化部署MySQL容器化部署Redis容器化部署Nginx容器化部署Koko容器化部署Guacamole容器化部署Core编排compose文件 基础环境 基于centos7.9容器化部署jumpserver tar -xf JumpServer.tar.gz导入centos7.9 docker镜像 docker load -i images/centos_7.9.2009.ta…

5G学习笔记之PRACH

即使是阴天&#xff0c;也要记得出门晒太阳哦 目录 1. 概述 2. PRACH Preamble 3. PRACH Preamble 类型 3.1 长前导码 3.2 短前导码 3.3 前导码格式与小区覆盖 4. PRACH时频资源 4.1 小区所有可用PRACH资源 4.2 SSB和RACH的关系 4.3 PRACH时频资源配置 1. 概述 随机接入…

14 - Java 面向对象(中级)

包&#xff08;package&#xff09; 声明 java的包&#xff0c;类似电脑系统中的文件夹&#xff0c;包里存放的是类文件。 当类文件很多的时候&#xff0c;通常会采用多个包进行存放管理&#xff0c;这种方式称为分包管理。 在项目中&#xff0c;我们将相同功能的类放到一个…

「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器

本篇将带你实现一个颜色选择器应用。用户可以从预设颜色中选择&#xff0c;或者通过输入颜色代码自定义颜色来动态更改界面背景。该应用展示了如何结合用户输入、状态管理和界面动态更新的功能。 关键词 UI互动应用颜色选择器状态管理用户输入界面动态更新 一、功能说明 颜色…

【Maven】依赖冲突如何解决?

准备工作 1、创建一个空工程 maven_dependency_conflict_demo&#xff0c;在 maven_dependency_conflict_demo 创建不同的 Maven 工程模块&#xff0c;用于演示本文的一些点。 什么是依赖冲突&#xff1f; 当引入同一个依赖的多个不同版本时&#xff0c;就会发生依赖冲突。…

【Vue3】从零开始创建一个VUE项目

【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接&#xff1a; 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&…

Pytorch-GPU版本离线安装

最近在复现一项深度学习的工作&#xff0c;发现自己的pytorch是装的cpu版的(好像当时是直接加清华源&#xff0c;默认是cpu版本&#xff09;。从官网在线下载速度太慢&#xff0c;还时不时断开连接&#xff0c;我们可以配置conda的清华源去这个问题&#xff0c;但是考虑到是在用…

.NET周刊【11月第4期 2024-11-24】

国内文章 C# 入门深度学习&#xff1a;万字长文讲解微积分和梯度下降 https://www.cnblogs.com/whuanle/p/18551532 这篇文章主要介绍了使用 C# 进行深度学习的方法&#xff0c;特别是微积分在此领域的应用。作者简要讲解了极限、导数等基本概念&#xff0c;并展示了如何在 …

How to monitor Spring Boot apps with the AppDynamics Java Agent

本文介绍如何使用 AppDynamics Java 代理监视 Azure Spring Apps 中的 Spring Boot 应用程序。 使用 AppDynamics Java 代理可以&#xff1a; 监视应用程序使用环境变量配置 AppDynamics Java 代理 在 AppDynamics 仪表板中检查所有监视数据 How to monitor Spring Boot app…

使用ECharts创建带百分比标注的环形图

在数据可视化领域&#xff0c;环形图是一种非常有效的图表类型&#xff0c;它能够清晰地展示各部分与整体的关系。今天&#xff0c;我们将通过ECharts来创建一个带百分比标注的环形图&#xff0c;并详细解释如何实现这一效果。 1. 数据准备 首先&#xff0c;我们定义了一些基础…

基于LSTM的文本多分类任务

概述&#xff1a; LSTM&#xff08;Long Short-Term Memory&#xff0c;长短时记忆&#xff09;模型是一种特殊的循环神经网络&#xff08;RNN&#xff09;架构&#xff0c;由Hochreiter和Schmidhuber于1997年提出。LSTM被设计来解决标准RNN在处理序列数据时遇到的长期依赖问题…

frp软件实现网络穿透

1. 名词 1.1. 网络穿透 网络穿透是一种技术&#xff0c;用于解决内网设备或服务无法直接被外部网络访问的问题。通常&#xff0c;内网设备位于路由器后面&#xff0c;并没有公网 IP 地址&#xff0c;因此外部用户不能直接连接到这些设备。网络穿透通过一些特定的技术手段&…

leetcode3250. 单调数组对的数目 I,仅需1s

题目&#xff1a; https://leetcode.cn/problems/find-the-count-of-monotonic-pairs-i/description/ 不为别的&#xff0c;只是记录下这个超过100%&#xff0c;而且比原先最快的快了一个量级 不知道咋分析&#xff0c;反正得出结论就是&#xff0c;变大不变&#xff0c;变小…

使用docker-compose部署搜索引擎ElasticSearch6.8.10

背景 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索&#xff0c;并提供了强大的聚合功能&#xff0c;可以处理大规模的数据集并进行快速…

Zabbix 模板翻译自动化教程

在企业 IT 运维管理中&#xff0c;Zabbix 作为一款强大的开源监控平台被广泛应用。而 Zabbix 模板作为监控配置的重要组成部分&#xff0c;用来定义监控项、触发器、图形等。随着国际化的需求增加&#xff0c;Zabbix 模板的翻译工作变得日益重要&#xff0c;特别是在需要为不同…