Files

764 lines
27 KiB
C#
Raw Permalink Normal View History

2025-11-26 11:32:30 +08:00
using Newtonsoft.Json;
using ServiceStack.Redis;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Data.Entity.Migrations.Model;
using System.Linq;
using System.Web;
namespace MQTTServerSideAPI
{
public class RedisDBHelper
{
private static object locker = new object();
public static ConnectionMultiplexer instance = null;
// private static string strConn = "127.0.0.1:6379,password=auth";
//public static IDatabase db=null;
static RedisDBHelper()//静态构造函数1、在类实例被初始化的时候执行2、在类的静态成员被调用的时候执行3.静态构造函数只会被执行一次4.静态构造函数不能含有参数
{
//string strConn = "127.0.0.1:6379,password=123456";//reids缓存数据库连接字符串 <!--本地环境-->
string strConn = "127.0.0.1:7555,password=cw_oy_lsh"; /* <!--云端环境-->*/
if (strConn.Length == 0)
{
throw new Exception("连接字符串未设置!");
}
if (instance == null)//单例模式
{
lock (locker)
{
if (instance == null || instance.IsConnected)
{
instance = ConnectionMultiplexer.Connect(strConn);
}
}
}
}
/// <summary>
/// 使用一个静态属性来返回已连接的实例如下列中所示这样一旦ConnectionMultiplexer断开连接便可以初始化新的连接实例
/// </summary>
//public static ConnectionMultiplexer instance
//{
// get
// {
// if(Constr.Length==0)
// {
// throw new Exception("连接字符串未设置!");
// }
// if(_instance==null)
// {
// lock(locker)
// {
// if(_instance==null||!_instance.IsConnected)
// {
// _instance = ConnectionMultiplexer.Connect(Constr);
// }
// }
// }
// return _instance;
// }
//}
/// <summary>
/// 将指定键移动到指定数据库
/// </summary>
/// <param name="key"></param>
/// <param name="movedb">将数据库num的键移动到movedb数据库</param>
/// <param name="num"></param>
/// <returns></returns>
public static bool KeyMove(string key, int movedb, int num = 0)
{
return instance.GetDatabase(num).KeyMove(key, movedb);
}
/// <summary>
/// 获取指定键的类型
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static RedisType KeyType(string key, int num = 0)
{
return instance.GetDatabase(num).KeyType(key);
}
/// <summary>
/// 指定键重命名
/// </summary>
/// <param name="oldkey">旧键</param>
/// <param name="newkey">新键</param>
/// <param name="num"></param>
/// <returns></returns>
public static bool KeyRename(string oldkey, string newkey, int num = 0)
{
return instance.GetDatabase(num).KeyRename(oldkey, newkey);
}
/// <summary>
/// 指定键是否存在
/// </summary>
/// <param name="key">指定键</param>
/// <param name="num">选择指定数据库</param>
/// <returns></returns>
public static bool KeyExists(string key, int num = 0)
{
return instance.GetDatabase(num).KeyExists(key);
}
/// <summary>
/// 删除指定键
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static bool KeyDelete(string key, int num = 0)
{
return instance.GetDatabase(num).KeyDelete(key);
}
/// <summary>
/// 将键的值转换为byte数组类型
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static byte[] KeyDump(string key, int num = 0)
{
return instance.GetDatabase(num).KeyDump(key);
}
#region redis字符串操作
/// <summary>
/// 设置指定键的值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="expire">默认为null设置键过期时间</param>
/// <param name="num">选择指定的数据库</param>
/// <returns></returns>
public static bool StringSet(string key, object value, TimeSpan? expire = null, int num = 0)
{
return instance.GetDatabase(num).StringSet(key, ConvertJson(value), expire);
}
private static string ConvertJson<T>(T value)
{
return value is string ? value.ToString() : JsonConvert.SerializeObject(value, new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
Formatting = Formatting.None
});
}
/// <summary>
/// 获取指定键的值
/// </summary>
/// <param name="key"></param>
/// <param name="num">选择指定的数据库</param>
/// <returns></returns>
public static string StringGet(string key, int num = 0)
{
return instance.GetDatabase(num).StringGet(key);
}
/// <summary>
/// 反序列化
/// </summary>
/// <typeparam name="T">泛型T</typeparam>
/// <param name="value">反序列化 字符串</param>
/// <returns>返回 泛型T 实例</returns>
public static T ConvertObj<T>(string value)
{
if (typeof(T).Name.ToLower().Equals("string"))
{
return (T)(Object)value;
}
return JsonConvert.DeserializeObject<T>(value);
}
/// <summary>
/// key-value同时为多个键设置值若给定键已经存在将用新值覆盖旧值
/// </summary>
/// <param name="keyvaluepair"></param>
/// <param name="num"></param>
/// <returns></returns>
public static bool StringSet(KeyValuePair<RedisKey, RedisValue>[] keyvaluepair, int num = 0)
{
return instance.GetDatabase(num).StringSet(keyvaluepair);
}
/// <summary>
/// 为多个键分别设置它们的值,仅当键不存在时
/// </summary>
/// <param name="keyvaluepair"></param>
/// <param name="num"></param>
public static void StringSet1(KeyValuePair<RedisKey, RedisValue>[] keyvaluepair, int num = 0)
{
foreach (KeyValuePair<RedisKey, RedisValue> key in keyvaluepair)
{
if (instance.GetDatabase(num).StringGet(key.Key) == RedisValue.Null)
{
instance.GetDatabase(num).StringSet(key.Key, key.Value);
}
}
}
/// <summary>
/// 获取多个键的值
/// </summary>
/// <param name="keys"></param>
/// <param name="num"></param>
/// <returns></returns>
public static RedisValue[] StringGet(RedisKey[] keys, int num = 0)
{
return instance.GetDatabase(0).StringGet(keys);
}
/// <summary>
/// 在指定偏移处开始的键处覆盖字符串的一部分
/// </summary>
/// <param name="key"></param>
/// <param name="offset">偏移量</param>
/// <param name="overstr"></param>
/// <param name="num"></param>
/// <returns></returns>
public static string StringSet(string key, long offset, string overstr, int num = 0)
{
return instance.GetDatabase(num).StringSetRange(key, offset, overstr);
}
/// <summary>
/// 获得键的指定部分的值
/// </summary>
/// <param name="key"></param>
/// <param name="start"></param>
/// <param name="end"></param>
/// <param name="num"></param>
/// <returns></returns>
public static string StringGet(string key, int start, int end, int num)
{
return instance.GetDatabase(num).StringGetRange(key, start, end);
}
/// <summary>
/// 获取指定键的值字符串长度
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns>返回键值字符串长度</returns>
public static long StringLength(string key, int num = 0)
{
return instance.GetDatabase(num).StringLength(key);
}
/// <summary>
/// 指定键的值追加字符串
/// </summary>
/// <param name="key"></param>
/// <param name="appendstr"></param>
/// <param name="num"></param>
/// <returns>返回追加字符串后键值的长度</returns>
public static long StringAppend(string key, string appendstr, int num = 0)
{
return instance.GetDatabase(num).StringAppend(key, appendstr);
}
/// <summary>
/// 为值为整数的指定键增加一个整数默认加1
/// </summary>
/// <param name="intkey"></param>
/// <param name="incr"></param>
/// <param name="num"></param>
/// <returns>增加一个整数值后的键的值</returns>
public static long StringIncrement(string key, int incr, int num = 0)
{
return instance.GetDatabase(num).StringIncrement(key, incr);
}
/// <summary>
/// 为值为整数的指定键增加一个实数
/// </summary>
/// <param name="key"></param>
/// <param name="incr"></param>
/// <param name="num"></param>
/// <returns>增加一个整数值后的键的值</returns>
public static double StringIncrement(string key, double incr, int num = 0)
{
return instance.GetDatabase(num).StringIncrement(key, incr);
}
/// <summary>
/// 数值键减少一个整数
/// </summary>
/// <param name="key"></param>
/// <param name="decre"></param>
/// <param name="num"></param>
/// <returns>减少后的值</returns>
public static long StringDecrement(string key, int decre, int num = 0)
{
return instance.GetDatabase(num).StringDecrement(key, decre);
}
/// <summary>
/// 数值键减少一个实数
/// </summary>
/// <param name="key"></param>
/// <param name="decre"></param>
/// <param name="num"></param>
/// <returns>减少后的值</returns>
public static double StringDecrement(string key, double decre, int num = 0)
{
return instance.GetDatabase(num).StringDecrement(key, decre);
}
/// <summary>
/// 修改键的值
/// </summary>
/// <param name="key"></param>
/// <param name="newvalue"></param>
/// <param name="num"></param>
/// <returns>返回旧值</returns>
public static string StringGetSet(string key, string newvalue, int num = 0)
{
return instance.GetDatabase(num).StringGetSet(key, newvalue);
}
#endregion
#region hash type operation
/// <summary>
/// 判断键中的field是否存在
/// </summary>
/// <param name="key"></param>
/// <param name="hashfield"></param>
/// <param name="num"></param>
/// <returns></returns>
public static bool HashExists(string key, string hashfield, int num)
{
return instance.GetDatabase(num).HashExists(key, hashfield);
}
/// <summary>
/// 设置散列字段的字符串值
/// </summary>
/// <param name="key"></param>
/// <param name="field"></param>
/// <param name="value"></param>
/// <param name="num"></param>
public static void HashSet(string key, string field, string value, int num = 0)
{
if (!HashExists(key, field, num))//仅当字段不存在时,才设置散列字段的值
{
instance.GetDatabase(num).HashSet(key, field, value);
}
}
/// <summary>
/// 获取存储在指定键的哈希字段的值
/// </summary>
/// <param name="key"></param>
/// <param name="hashfield"></param>
/// <param name="num"></param>
/// <returns></returns>
public static object HashGet(string key, string hashfield, int num = 0)
{
return instance.GetDatabase(num).HashGet(key, hashfield);
}
/// <summary>
/// 为多个哈希字段分别设置它们的值
/// </summary>
/// <param name="key"></param>
/// <param name="hashFields"></param>
public static void HashSet(string key, HashEntry[] hashFields, int num = 0)
{
instance.GetDatabase(num).HashSet(key, hashFields);
}
/// <summary>
/// 为多个哈希字段分别设置它们的值
/// </summary>
/// <param name="key"></param>
/// <param name="dic"></param>
public static void HashPutAll(string key, Dictionary<string, string> dic, int num = 2)
{
List<HashEntry> list = new List<HashEntry>();
for (int i = 0; i < dic.Count; i++)
{
KeyValuePair<string, string> param = dic.ElementAt(i);
list.Add(new HashEntry(param.Key, param.Value));
instance.GetDatabase(num).HashSet(key, list.ToArray());
}
}
/// <summary>
/// 获取指定键的所有哈希字段和值
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static Dictionary<string, object> HashGetAll(string key, int num = 0)
{
Dictionary<string, object> dic = new Dictionary<string, object>();
var collection = instance.GetDatabase(num).HashGetAll(key);
foreach (var item in collection)
{
dic.Add(item.Name, item.Value);
}
return dic;
}
/// <summary>
/// 删除指定键的哈希字段
/// </summary>
/// <param name="key"></param>
/// <param name="field"></param>
/// <param name="num"></param>
/// <returns></returns>
public static bool HashDelete(string key, string field, int num)
{
return instance.GetDatabase(num).HashDelete(key, field);
}
/// <summary>
/// 将哈希字段的浮点值按给定数值增加(整数将类型改变即可)
/// </summary>
/// <param name="key"></param>
/// <param name="field"></param>
/// <param name="value"></param>
/// <param name="num"></param>
/// <returns></returns>
public static double HashIncrement(string key, string field, double value, int num = 0)
{
return instance.GetDatabase(num).HashIncrement(key, field, value);
}
/// <summary>
/// 将哈希字段的浮点值按给定数值减少(整数将类型改变即可)
/// </summary>
/// <param name="key"></param>
/// <param name="field"></param>
/// <param name="value"></param>
/// <param name="num"></param>
/// <returns></returns>
public static double HashDecrement(string key, string field, double value, int num = 0)
{
return instance.GetDatabase(num).HashDecrement(key, field, value);
}
/// <summary>
/// 获取哈希中的所有字段fields
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static string[] HashKeys(string key, int num = 0)
{
return instance.GetDatabase(num).HashKeys(key).ToStringArray();
}
/// <summary>
/// 获取哈希中的所有值
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static string[] HashValues(string key, int num = 0)
{
return instance.GetDatabase(num).HashValues(key).ToStringArray();
}
/// <summary>
/// 获取散列中的字段数量
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static long HashSize(string key, int num = 0)
{
return instance.GetDatabase(num).HashLength(key);
}
#endregion
#region list operation
/// <summary>
/// 从左向右压栈(从右往左同理)
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="num"></param>
/// <returns></returns>
public static long ListLeftPush(string key, string value, int num = 0)
{
return instance.GetDatabase(num).ListLeftPush(key, value);
}
/// <summary>
/// 多个值压栈(从右往左同理)
/// </summary>
/// <param name="key"></param>
/// <param name="values"></param>
/// <param name="num"></param>
/// <returns></returns>
public static long ListLeftPush(string key, RedisValue[] values, int num = 0)
{
return instance.GetDatabase(num).ListLeftPush(key, values);
}
/// <summary>
/// 出栈
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns>返回从左到右的第一个元素</returns>
public static object ListLeftPop(string key, int num)
{
return instance.GetDatabase(num).ListLeftPop(key);
}
/// <summary>
/// 获取list长度
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static long ListSize(string key, int num)
{
return instance.GetDatabase(num).ListLength(key);
}
/// <summary>
/// 范围检索
/// </summary>
/// <param name="key"></param>
/// <param name="start"></param>
/// <param name="stop"></param>
/// <param name="num"></param>
/// <returns>返回list</returns>
public static RedisValue[] ListRange(string key, long start = 0, long stop = -1, int num = 0)
{
return instance.GetDatabase(num).ListRange(key, start, stop);
}
/// <summary>
/// 根据索引获得值
/// </summary>
/// <param name="key"></param>
/// <param name="index"></param>
/// <param name="num"></param>
/// <returns>返回索引对应的值</returns>
public static RedisValue ListGetByIndex(string key, long index, int num = 0)
{
return instance.GetDatabase(num).ListGetByIndex(key, index);
}
/// <summary>
/// 通过索引赋值
/// </summary>
/// <param name="key"></param>
/// <param name="index"></param>
/// <param name="value"></param>
/// <param name="num"></param>
public static void ListSet(string key, int index, string value, int num = 0)
{
instance.GetDatabase(num).ListSetByIndex(key, index, value);
}
/// <summary>
/// 移除key中值为value的i个返回删除的个数如果没有这个元素则返回0
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="num"></param>
/// <returns></returns>
public static long ListRemove(string key, string value, int num = 0)
{
return instance.GetDatabase(num).ListRemove(key, value);
}
/// <summary>
/// 删除除了[start,end]以外的所有元素
/// </summary>
/// <param name="key"></param>
/// <param name="start"></param>
/// <param name="end"></param>
/// <param name="num"></param>
public static void ListTrim(string key, int start, int end, int num = 0)
{
instance.GetDatabase(num).ListTrim(key, start, end);
}
/// <summary>
/// 将源key的队列的右边的一个值删除然后塞入目标key的队列的左边返回这个值
/// </summary>
/// <param name="sourceKey"></param>
/// <param name="destinationKey"></param>
/// <param name="num"></param>
/// <returns></returns>
public static object ListRightPopAndLeftPush(string sourceKey, string destinationKey, int num = 0)
{
return instance.GetDatabase(num).ListRightPopLeftPush(sourceKey, destinationKey);
}
/// <summary>
/// 在key队列中pivot值后插入value值
/// </summary>
/// <param name="key"></param>
/// <param name="pivot"></param>
/// <param name="value"></param>
/// <param name="num"></param>
/// <returns></returns>
public static long ListInsertAfter(string key, string pivot, string value, int num = 0)
{
return instance.GetDatabase(num).ListInsertAfter(key, pivot, value);
}
/// <summary>
/// 在key队列中pivot值前插入value值
/// </summary>
/// <param name="key"></param>
/// <param name="pivot"></param>
/// <param name="value"></param>
/// <param name="num"></param>
/// <returns></returns>
public static long ListInsertBefore(string key, string pivot, string value, int num = 0)
{
return instance.GetDatabase(num).ListInsertBefore(key, pivot, value);
}
#endregion
#region set opetation
/// <summary>
/// 集合添加元素
/// </summary>
/// <param name="key">缓存的键</param>
/// <param name="value">值</param>
/// <param name="num">键</param>
public static void SetAdd(string key, string value, int num = 0)
{
instance.GetDatabase(num).SetAdd(key, value);
}
public static void SetAdd(string key, RedisValue[] values, int num)
{
instance.GetDatabase(num).SetAdd(key, values);
}
/// <summary>
/// 集合中是否包含value值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="num"></param>
/// <returns></returns>
public static bool SetContains(string key, string value, int num = 0)
{
return instance.GetDatabase(num).SetContains(key, value);
}
/// <summary>
/// 获得集合的长度
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static long SetSize(string key, int num = 0)
{
return instance.GetDatabase(num).SetLength(key);
}
/// <summary>
/// 根据键值返回集合所有的value
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static RedisValue[] GetSetMembers(string key, int num = 0)
{
return instance.GetDatabase(num).SetMembers(key);
}
/// <summary>
/// 将成员从源集合移动到目标集合
/// </summary>
/// <param name="sourceKey"></param>
/// <param name="destinationKey"></param>
/// <param name="value"></param>
/// <param name="num"></param>
/// <returns></returns>
public static bool SetMove(string sourceKey, string destinationKey, string value, int num = 0)
{
return instance.GetDatabase(num).SetMove(sourceKey, destinationKey, value);
}
/// <summary>
/// 移除集合中指定键值随机元素
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static string SetPop(string key, int num = 0)
{
return instance.GetDatabase(num).SetPop(key);
}
/// <summary>
/// 返回集合中指定键值随机元素
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
/// <returns></returns>
public static string SetRandomMember(string key, int num = 0)
{
return instance.GetDatabase(num).SetRandomMember(key);
}
/// <summary>
/// 返回集合中指定键值随机的count个元素形成数组
/// </summary>
/// <param name="key"></param>
/// <param name="count"></param>
/// <param name="num"></param>
/// <returns></returns>
public static string[] setRandomMembers(string key, long count, int num = 0)
{
return instance.GetDatabase(num).SetRandomMembers(key, count).ToStringArray();
}
/// <summary>
/// 移除集合中指定key和value
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="num"></param>
public static void SetRemove(string key, string value, int num = 0)
{
instance.GetDatabase(num).SetRemove(key, value);
}
/// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <param name="num"></param>
public static void SetScan(String key, int num = 0)
{
instance.GetDatabase(num).SetScan(key);
}
/// <summary>
/// 返回对给定集合进行指定操作产生的集合成员
/// </summary>
/// <param name="operation"></param>
/// <param name="first"></param>
/// <param name="second"></param>
/// <param name="num"></param>
/// <returns></returns>
public static RedisValue[] SetCombine(SetOperation operation, string first, string second, int num = 0)
{
return instance.GetDatabase(num).SetCombine(operation, first, second);
}
#endregion
}
}