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

news2024/11/28 9:43:53

一、安装第三方库

二、官网

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";

四、封装:增删改查

namespace ConsoleApp2
{
    public class RedisData
    {
        public string Key { get; set; }
        public string KeyTail { get; set; }
        public string Value { get; set; }

        public int? TTLDays { get; set; }
        public int? TTLMins { get; set; }
        public int? TTLSecs { get; set; }

        public DateTime? ExpirationTime { get; set; } 

        public DateTime QueryTime { get; set; }
    }

    public static class RedisExtension
    {
        // 默认的 Redis 连接字符串
        private static string redisConnectionString = "localhost:6379,defaultDatabase=0,allowAdmin=true,asyncTimeout=10000";

        // 使用 Lazy 实例化连接,只会在第一次使用时连接 Redis
        private 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
        /// <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(); 
            }
            
        }
    }
}

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

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

相关文章

2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现

目录 第一题握手&#xff0c;这个直接从49累加到7即可&#xff0c;没啥难度&#xff0c;后面7个不握手就好了&#xff0c;没啥讲的&#xff0c;(然后第二个题填空好难&#xff0c;嘻嘻不会&#xff09; 第三题.好数​编辑 第四题0R格式 宝石组合 数字接龙 最后一题:拔河 第…

Django基础之路由

一.前言 前面我们说了django的安装于基础配置&#xff0c;基础知识点我就细分下来&#xff0c;每天和大家讲一点&#xff0c;今天就要和大家说django的基础知识点了&#xff0c;我们今天先来讲路由&#xff0c;内容不多&#xff0c;希望大家记住 二.传统路由 路由就是前面一个…

gitlab ssh-key 绑定

windows环境下配置 gitlab的ssh key&#xff1a; 1.打开本地git bash,使用如下命令生成ssh公钥和私钥对: ssh-keygen -t rsa -C xxxxxx.com 2.一直回车&#xff1b; 3.然后打开公钥文件&#xff1a;C:/Users/Administrator/.ssh/id_rsa.pub文件&#xff0c;复制其中的内容; 4…

26.100ASK_T113-PRO 测试摄像头 输出信息

1.测试代码 读到摄象头参数 输出 video_test.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <linux/type…

【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程

在当今人工智能迅猛发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域涌现出许多强大的模型&#xff0c;其中GPT、BERT与Transformer无疑是最受关注的三大巨头。这些模型不仅在学术界引起了广泛讨论&#xff0c;也在工业界得到了广泛应用。那么&#xff0c;G…

【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序

DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 1. 窗口的划分 1.1 窗口分为&#xff1a;基于时间的窗口 和 基于数量的窗口 基于时间的窗口&#xff1a;基于起始时间戳 和终止时间戳来决定窗口的大小 基于数量的窗口&#xff1a;根据固定的数量定义窗口 的大小 这…

虚拟地址空间与物理内存(Linux系统)

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 问题引入 一、什么是虚拟内存 二、虚拟内存的描述与组织 三、页表的优势 四、虚拟内存区域划分 问题引入 为引入今天的话题&#xff0c;我们先来看下面…

docker-compose搭建xxl-job、mysql

docker-compose搭建xxl-job、mysql 1、搭建docker以及docker-compose2、下载xxl-job需要数据库脚本3、创建文件夹以及docker-compose文件4、坑来了5、正确配置6、验证-运行成功 1、搭建docker以及docker-compose 略 2、下载xxl-job需要数据库脚本 下载地址&#xff1a;https…

【ArcGIS Pro实操第11期】经纬度数据转化成平面坐标数据

经纬度数据转化成平面坐标数据 数据准备ArcGIS操作步骤-投影转换为 Sinusoidal1 投影2 计算几何Python 示例 另&#xff1a;Sinusoidal (World) 和 Sinusoidal (Sphere) 的主要区别参考 数据准备 数据投影&#xff1a; 目标投影&#xff1a;与MODIS数据相同&#xff08;Sinu…

【模型学习之路】PyG的使用+基于点的任务

这一篇是关于PyG的基本使用 目录 前言 PyG的数据结构 演示 图的可视化 基于点的任务 任务分析 MLP GCN 前言 对图结构感兴趣的朋友可以学一下常用的有关图结构的库&#xff1a;networkx详细介绍 networkx 库&#xff0c;探讨它的基本功能、如何创建图、操作图以及其常…

如何监控Elasticsearch集群状态?

大家好&#xff0c;我是锋哥。今天分享关于【如何监控Elasticsearch集群状态&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何监控Elasticsearch集群状态&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 监控 Elasticsearch 集群的状态对于确保…

Edify 3D: Scalable High-Quality 3D Asset Generation

Deep Imagination Research | NVIDIA 目录 一、Abstract 二、核心内容 1、多视图扩散模型 3、重建模型&#xff1a; 4、数据处理模块&#xff1a; 三、结果 1、文本到 3D 生成结果 2、图像到 3D 生成结果 3、四边形网格拓扑结构 一、Abstract NVIDIA 开发的用于高质量…

QUAD-MxFE平台

QUAD-MxFE平台 16Tx/16Rx直接L/S/C频段采样相控阵/雷达/电子战/卫星通信开发平台 概览 优势和特点 四通道MxFE数字化处理卡 使用MxFE的多通道、宽带系统开发平台 与Xilinx VCU118评估板&#xff08;不包括&#xff09;搭配使用 16个RF接收(Rx)通道&#xff08;32个数字Rx通道…

操作系统 锁——针对实习面试

目录 操作系统 锁什么是死锁&#xff1f;说说死锁产生的条件&#xff1f;死锁如何预防&#xff1f;死锁如何避免&#xff1f;银行家算法具体怎么操作&#xff1f;死锁如何解决&#xff1f;死锁会产生什么影响&#xff1f;乐观锁与悲观锁有什么区别&#xff1f; 操作系统 锁 什么…

UI设计-色彩、层级、字体、边距(一)

一.色彩&#xff1a;色彩可以影响人的心理与行动&#xff0c;具有不同的象征意义&#xff1b;有冷暖&#xff0c;轻重&#xff0c;软硬等等。 1.色彩情绪&#xff1a;最直观的视觉感受 一个活动的页面所用的颜色必须要与其内容相适应&#xff0c;让人看起来舒服。有时我们会不…

从入门到精通数据结构----四大排序(上)

目录 首言&#xff1a; 1. 插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 3. 交换排序 3.1 冒泡排序 3.2 快排 结尾&#xff1a; 首言&#xff1a; 本篇文章主要介绍常见的四大排序&#xff1a;交换排序、选择排序、插入排序、归并排…

【C++第三方库】Muduo库结合ProtoBuf库搭建服务端和客户端的过程和源码

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章我将结合之前的这俩个第三方库快速上手protobuf序列化和反序列化框架和muduo网络&#xff0c;来去实现muduo库在protocol协议搭建服务端和客户端。…

Scala—Map用法详解

Scala—Map用法详解 在 Scala 中&#xff0c;Map 是一种键值对的集合&#xff0c;其中每个键都是唯一的。Scala 提供了两种类型的 Map&#xff1a;不可变 Map 和可变 Map。 1. 不可变集合&#xff08;Map&#xff09; 不可变 Map 是默认的 Map 实现&#xff0c;位于 scala.co…

文本处理之sed

1、概述 sed是文本编辑器&#xff0c;作用是对文本的内容进行增删改查。 和vim不一样&#xff0c;sed是按行进行处理。 sed一次处理一行内容&#xff0c;处理完一行之后紧接着处理下一行&#xff0c;一直到文件的末尾 模式空间&#xff1a;临时储存&#xff0c;修改的结果临…

了解网络威胁情报:全面概述

网络威胁情报 CTI 是指系统地收集和分析与威胁相关的数据&#xff0c;以提供可操作的见解&#xff0c;从而增强组织的网络安全防御和决策过程。 在数字威胁不断演变的时代&#xff0c;了解网络威胁情报对于组织来说至关重要。复杂网络攻击的兴起凸显了制定强有力的策略以保护敏…