分析C#使用Redis的写法和用法
导读:关于“分析C#使用Redis的写法和用法”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“分析C#使用Redis的写法...
关于“分析C#使用Redis的写法和用法”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“分析C#使用Redis的写法和用法”吧。
在我们日常的开发中,Redis是很常用的,常用的语言都有Redis的API,现在就来分享一下Redis的.NET C#写法和用法,下面开始介绍Redis在C#中的使用。在使用之前一点要安装和添加NuGet包 StackExchange.Redis (.net framework的环境最少是4.5),否则会报错。
安装好后我们在项目中添加一个helper类
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
namespace Redis
{
public static class RedisHelper
{
private static string Constr = "";
private static object _locker = new Object();
private static ConnectionMultiplexer _instance = null;
/// 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);
}
}
}
//注册如下事件
_instance.ConnectionFailed = MuxerConnectionFailed;
_instance.ConnectionRestored = MuxerConnectionRestored;
_instance.ErrorMessage = MuxerErrorMessage;
_instance.ConfigurationChanged = MuxerConfigurationChanged;
_instance.HashSlotMoved = MuxerHashSlotMoved;
_instance.InternalError = MuxerInternalError;
return _instance;
}
}
static RedisHelper()
{
}
public static void SetCon(string config)
{
Constr = config;
}
/// summary>
///
/// /summary>
/// returns>
/returns>
public static IDatabase GetDatabase()
{
return Instance.GetDatabase();
}
/// summary>
/// 这里的 MergeKey 用来拼接 Key 的前缀,具体不同的业务模块使用不同的前缀。
/// /summary>
/// param name="key">
/param>
/// returns>
/returns>
private static string MergeKey(string key)
{
return key;
//return BaseSystemInfo.SystemCode key;
}
/// summary>
/// 根据key获取缓存对象
/// /summary>
/// typeparam name="T">
/typeparam>
/// param name="key">
/param>
/// returns>
/returns>
public static T GetT>
(string key)
{
key = MergeKey(key);
return DeserializeT>
(GetDatabase().StringGet(key));
}
/// summary>
/// 根据key获取缓存对象
/// /summary>
/// param name="key">
/param>
/// returns>
/returns>
public static object Get(string key)
{
key = MergeKey(key);
return Deserializeobject>
(GetDatabase().StringGet(key));
}
/// summary>
/// 设置缓存
/// /summary>
/// param name="key">
/param>
/// param name="value">
/param>
/// param name="expireMinutes">
/param>
public static void Set(string key, object value, int expireMinutes = 0)
{
key = MergeKey(key);
if (expireMinutes >
0)
{
GetDatabase().StringSet(key, Serialize(value), TimeSpan.FromMinutes(expireMinutes));
}
else
{
GetDatabase().StringSet(key, Serialize(value));
}
}
/// summary>
/// 判断在缓存中是否存在该key的缓存数据
/// /summary>
/// param name="key">
/param>
/// returns>
/returns>
public static bool Exists(string key)
{
key = MergeKey(key);
return GetDatabase().KeyExists(key);
//可直接调用
}
/// summary>
/// 移除指定key的缓存
/// /summary>
/// param name="key">
/param>
/// returns>
/returns>
public static bool Remove(string key)
{
key = MergeKey(key);
return GetDatabase().KeyDelete(key);
}
/// summary>
/// 异步设置
/// /summary>
/// param name="key">
/param>
/// param name="value">
/param>
public static async Task SetAsync(string key, object value)
{
key = MergeKey(key);
await GetDatabase().StringSetAsync(key, Serialize(value));
}
/// summary>
/// 根据key获取缓存对象
/// /summary>
/// param name="key">
/param>
/// returns>
/returns>
public static async Taskobject>
GetAsync(string key)
{
key = MergeKey(key);
object value = await GetDatabase().StringGetAsync(key);
return value;
}
/// summary>
/// 实现递增
/// /summary>
/// param name="key">
/param>
/// returns>
/returns>
public static long Increment(string key)
{
key = MergeKey(key);
//三种命令模式
//Sync,同步模式会直接阻塞调用者,但是显然不会阻塞其他线程。
//Async,异步模式直接走的是Task模型。
//Fire - and - Forget,就是发送命令,然后完全不关心最终什么时候完成命令操作。
//即发即弃:通过配置 CommandFlags 来实现即发即弃功能,在该实例中该方法会立即返回,如果是string则返回null 如果是int则返回0.这个操作将会继续在后台运行,一个典型的用法页面计数器的实现:
return GetDatabase().StringIncrement(key, flags: CommandFlags.FireAndForget);
}
/// summary>
/// 实现递减
/// /summary>
/// param name="key">
/param>
/// param name="value">
/param>
/// returns>
/returns>
public static long Decrement(string key, string value)
{
key = MergeKey(key);
return GetDatabase().HashDecrement(key, value, flags: CommandFlags.FireAndForget);
}
/// summary>
/// 序列化对象
/// /summary>
/// param name="o">
/param>
/// returns>
/returns>
private static byte[] Serialize(object o)
{
if (o == null)
{
return null;
}
BinaryFormatter binaryFormatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream())
{
binaryFormatter.Serialize(memoryStream, o);
byte[] objectDataAsStream = memoryStream.ToArray();
return objectDataAsStream;
}
}
/// summary>
/// 反序列化对象
/// /summary>
/// typeparam name="T">
/typeparam>
/// param name="stream">
/param>
/// returns>
/returns>
private static T DeserializeT>
(byte[] stream)
{
if (stream == null)
{
return default(T);
}
BinaryFormatter binaryFormatter = new BinaryFormatter();
using (MemoryStream memoryStream = new MemoryStream(stream))
{
T result = (T)binaryFormatter.Deserialize(memoryStream);
return result;
}
}
/// summary>
/// 配置更改时
/// /summary>
/// param name="sender">
/param>
/// param name="e">
/param>
private static void MuxerConfigurationChanged(object sender, EndPointEventArgs e)
{
//LogHelper.SafeLogMessage("Configuration changed: " e.EndPoint);
}
/// summary>
/// 发生错误时
/// /summary>
/// param name="sender">
/param>
/// param name="e">
/param>
private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e)
{
//LogHelper.SafeLogMessage("ErrorMessage: " e.Message);
}
/// summary>
/// 重新建立连接之前的错误
/// /summary>
/// param name="sender">
/param>
/// param name="e">
/param>
private static void MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e)
{
//LogHelper.SafeLogMessage("ConnectionRestored: " e.EndPoint);
}
/// summary>
/// 连接失败 , 如果重新连接成功你将不会收到这个通知
/// /summary>
/// param name="sender">
/param>
/// param name="e">
/param>
private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)
{
//LogHelper.SafeLogMessage("重新连接:Endpoint failed: " e.EndPoint ", " e.FailureType (e.Exception == null ? "" : (", " e.Exception.Message)));
}
/// summary>
/// 更改集群
/// /summary>
/// param name="sender">
/param>
/// param name="e">
/param>
private static void MuxerHashSlotMoved(object sender, HashSlotMovedEventArgs e)
{
//LogHelper.SafeLogMessage("HashSlotMoved:NewEndPoint" e.NewEndPoint ", OldEndPoint" e.OldEndPoint);
}
/// summary>
/// redis类库错误
/// /summary>
/// param name="sender">
/param>
/// param name="e">
/param>
private static void MuxerInternalError(object sender, InternalErrorEventArgs e)
{
//LogHelper.SafeLogMessage("InternalError:Message" e.Exception.Message);
}
//场景不一样,选择的模式便会不一样,大家可以按照自己系统架构情况合理选择长连接还是Lazy。
//建立连接后,通过调用ConnectionMultiplexer.GetDatabase 方法返回对 Redis Cache 数据库的引用。从 GetDatabase 方法返回的对象是一个轻量级直通对象,不需要进行存储。
/// summary>
/// 使用的是Lazy,在真正需要连接时创建连接。
/// 延迟加载技术
/// 微软azure中的配置 连接模板
/// /summary>
//private static LazyConnectionMultiplexer>
lazyConnection = new LazyConnectionMultiplexer>
(() =>
//{
// //var options = ConfigurationOptions.Parse(constr);
// ////options.ClientName = GetAppName();
// only known at runtime
// //options.AllowAdmin = true;
// //return ConnectionMultiplexer.Connect(options);
// ConnectionMultiplexer muxer = ConnectionMultiplexer.Connect(Coonstr);
// muxer.ConnectionFailed = MuxerConnectionFailed;
// muxer.ConnectionRestored = MuxerConnectionRestored;
// muxer.ErrorMessage = MuxerErrorMessage;
// muxer.ConfigurationChanged = MuxerConfigurationChanged;
// muxer.HashSlotMoved = MuxerHashSlotMoved;
// muxer.InternalError = MuxerInternalError;
// return muxer;
//}
);
#region 当作消息代理中间件使用 一般使用更专业的消息队列来处理这种业务场景
/// summary>
/// 当作消息代理中间件使用
/// 消息组建中,重要的概念便是生产者,消费者,消息中间件。
/// /summary>
/// param name="channel">
/param>
/// param name="message">
/param>
/// returns>
/returns>
public static long Publish(string channel, string message)
{
ISubscriber sub = Instance.GetSubscriber();
//return sub.Publish("messages", "hello");
return sub.Publish(channel, message);
}
/// summary>
/// 在消费者端得到该消息并输出
/// /summary>
/// param name="channelFrom">
/param>
/// returns>
/returns>
public static void Subscribe(string channelFrom)
{
ISubscriber sub = Instance.GetSubscriber();
sub.Subscribe(channelFrom, (channel, message) =>
{
Console.WriteLine((string)message);
}
);
}
#endregion
/// summary>
/// GetServer方法会接收一个EndPoint类或者一个唯一标识一台服务器的键值对
/// 有时候需要为单个服务器指定特定的命令
/// 使用IServer可以使用所有的shell命令,比如:
/// DateTime lastSave = server.LastSave();
/// ClientInfo[] clients = server.ClientList();
/// 如果报错在连接字符串后加 ,allowAdmin=true;
/// /summary>
/// returns>
/returns>
public static IServer GetServer(string host, int port)
{
IServer server = Instance.GetServer(host, port);
return server;
}
/// summary>
/// 获取全部终结点
/// /summary>
/// returns>
/returns>
public static EndPoint[] GetEndPoints()
{
EndPoint[] endpoints = Instance.GetEndPoints();
return endpoints;
}
}
}
以上就是Redis的工具类,然后使用也很简单,这里就不多说了,自己贴代码
string redisconf = "127.0.0.1:6379,password=123456,DefaultDatabase=0";
RedisHelper.SetCon(redisconf);
//设置
RedisHelper.Set("RedisKey", "RedisValue", 30);
//键,值,过期时间
//删除
RedisHelper.Remove(textBox2.Text).ToString();
//读取
RedisHelper.Get("RedisKey").ToString();
到此,基本的运行结果就已经得到了!这里附上官网文档。
地址:https://stackexchange.github.io/StackExchange.Redis/Basics
但是 StackExchange.Redis 的操作远不止这些,大家可以看看官方文档然后发现更多新功能!
到此这篇关于“分析C#使用Redis的写法和用法”的文章就介绍到这了,感谢各位的阅读,更多相关分析C#使用Redis的写法和用法内容,欢迎关注网络资讯频道,小编将为大家输出更多高质量的实用文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 分析C#使用Redis的写法和用法
本文地址: https://pptw.com/jishu/655018.html
