Redis学习笔记:Redis在C#中的使用

database

    1、新建一个WinForm窗体,命名为Main:

    2、在NuGet中安装StackExchange.Redis。

    3、添加一个类,命名为RedisHelper。

publicstaticclass RedisHelper

{

privatestaticstring Constr = "";

privatestaticreadonlyobject _locker = newobject();

privatestatic ConnectionMultiplexer _instance = null;

///<summary>

/// 使用一个静态属性来返回已连接的实例,如下列中所示。这样,一旦 ConnectionMultiplexer 断开连接,便可以初始化新的连接实例。

///</summary>

publicstatic ConnectionMultiplexer Instance

{

get

{

if (Constr.Length == 0)

{

thrownew 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()

{

}

publicstaticvoid SetCon(string config)

{

Constr = config;

}

publicstatic IDatabase GetDatabase()

{

return Instance.GetDatabase();

}

///<summary>

/// 这里的 MergeKey 用来拼接 Key 的前缀,具体不同的业务模块使用不同的前缀。

///</summary>

///<param name="key"></param>

///<returns></returns>

privatestaticstring MergeKey(string key)

{

return key;

//return BaseSystemInfo.SystemCode + key;

}

///<summary>

/// 根据key获取缓存对象

///</summary>

///<typeparam name="T"></typeparam>

///<param name="key"></param>

///<returns></returns>

publicstatic T Get<T>(string key)

{

key = MergeKey(key);

return Deserialize<T>(GetDatabase().StringGet(key));

}

///<summary>

/// 根据key获取缓存对象

///</summary>

///<param name="key"></param>

///<returns></returns>

publicstaticobject Get(string key)

{

key = MergeKey(key);

return Deserialize<object>(GetDatabase().StringGet(key));

}

///<summary>

/// 设置缓存

///</summary>

///<param name="key"></param>

///<param name="value"></param>

///<param name="expireMinutes"></param>

publicstaticvoid 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>

publicstaticbool Exists(string key)

{

key = MergeKey(key);

return GetDatabase().KeyExists(key); //可直接调用

}

///<summary>

/// 移除指定key的缓存

///</summary>

///<param name="key"></param>

///<returns></returns>

publicstaticbool Remove(string key)

{

key = MergeKey(key);

return GetDatabase().KeyDelete(key);

}

///<summary>

/// 异步设置

///</summary>

///<param name="key"></param>

///<param name="value"></param>

publicstaticasync Task SetAsync(string key, object value)

{

key = MergeKey(key);

await GetDatabase().StringSetAsync(key, Serialize(value));

}

///<summary>

/// 根据key获取缓存对象

///</summary>

///<param name="key"></param>

///<returns></returns>

publicstaticasync Task<object> GetAsync(string key)

{

key = MergeKey(key);

object value = await GetDatabase().StringGetAsync(key);

return value;

}

///<summary>

/// 实现递增

///</summary>

///<param name="key"></param>

///<returns></returns>

publicstaticlong 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>

publicstaticlong Decrement(string key, string value)

{

key = MergeKey(key);

return GetDatabase().HashDecrement(key, value, flags: CommandFlags.FireAndForget);

}

///<summary>

/// 序列化对象

///</summary>

///<param name="o"></param>

///<returns></returns>

privatestaticbyte[] Serialize(object o)

{

if (o == null)

{

returnnull;

}

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>

privatestatic T Deserialize<T>(byte[] stream)

{

if (stream == null)

{

returndefault(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>

privatestaticvoid MuxerConfigurationChanged(object sender, EndPointEventArgs e)

{

//LogHelper.SafeLogMessage("Configuration changed: " + e.EndPoint);

}

///<summary>

/// 发生错误时

///</summary>

///<param name="sender"></param>

///<param name="e"></param>

privatestaticvoid MuxerErrorMessage(object sender, RedisErrorEventArgs e)

{

//LogHelper.SafeLogMessage("ErrorMessage: " + e.Message);

}

///<summary>

/// 重新建立连接之前的错误

///</summary>

///<param name="sender"></param>

///<param name="e"></param>

privatestaticvoid MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e)

{

//LogHelper.SafeLogMessage("ConnectionRestored: " + e.EndPoint);

}

///<summary>

/// 连接失败,如果重新连接成功你将不会收到这个通知。

///</summary>

///<param name="sender"></param>

///<param name="e"></param>

privatestaticvoid 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>

privatestaticvoid 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>

privatestaticvoid MuxerInternalError(object sender, InternalErrorEventArgs e)

{

//LogHelper.SafeLogMessage("InternalError:Message" + e.Exception.Message);

}

//场景不一样,选择的模式便会不一样,大家可以按照自己系统架构情况合理选择长连接还是Lazy。

//建立连接后,通过调用ConnectionMultiplexer.GetDatabase 方法返回对 Redis Cache 数据库的引用。从 GetDatabase 方法返回的对象是一个轻量级直通对象,不需要进行存储。

///<summary>

/// 使用的是Lazy,在真正需要连接时创建连接。

/// 延迟加载技术

/// 微软azure中的配置 连接模板

///</summary>

//private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>

//{

////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>

publicstaticlong 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>

publicstaticvoid Subscribe(string channelFrom)

{

ISubscriber sub = Instance.GetSubscriber();

sub.Subscribe(channelFrom, (channel, message) =>

{

Console.WriteLine(message);

});

}

#endregion

///<summary>

/// GetServer方法会接收一个EndPoint类或者一个唯一标识一台服务器的键值对

/// 有时候需要为单个服务器指定特定的命令

/// 使用IServer可以使用所有的shell命令,比如:

/// DateTime lastSave = server.LastSave();

/// ClientInfo[] clients = server.ClientList();

/// 如果报错在连接字符串后加 ,allowAdmin=true;

///</summary>

///<returns></returns>

publicstatic IServer GetServer(string host, int port)

{

IServer server = Instance.GetServer(host, port);

return server;

}

///<summary>

/// 获取全部终结点

///</summary>

///<returns></returns>

publicstatic EndPoint[] GetEndPoints()

{

EndPoint[] endpoints = Instance.GetEndPoints();

return endpoints;

}

}

View Code

    4、Main窗体代码:

publicpartialclass Main : Form

{

public Main()

{

InitializeComponent();

try

{

string redisconf = "127.0.0.1:6379,password=12345,DefaultDatabase=0";

RedisHelper.SetCon(redisconf);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}

///<summary>

/// 设置

///</summary>

///<param name="sender"></param>

///<param name="e"></param>

privatevoid button1_Click(object sender, EventArgs e)

{

if (string.IsNullOrEmpty(textBox1.Text))

{

textBox4.Text = "请填写键";

return;

}

if (string.IsNullOrEmpty(textBox2.Text))

{

textBox4.Text = "请填写值";

return;

}

if (string.IsNullOrEmpty(textBox3.Text))

{

textBox4.Text = "请填写过期时间";

return;

}

//键、值、过期时间

RedisHelper.Set(textBox1.Text, textBox2.Text, int.Parse(textBox3.Text));

textBox4.Text = "添加成功";

}

///<summary>

/// 删除

///</summary>

///<param name="sender"></param>

///<param name="e"></param>

privatevoid button2_Click(object sender, EventArgs e)

{

if (!string.IsNullOrEmpty(textBox1.Text))

{

if (RedisHelper.Exists(textBox1.Text))

{

RedisHelper.Remove(textBox1.Text).ToString();

textBox4.Text = "删除成功";

}

else

{

textBox4.Text = "已过期或不存在";

}

}

else

{

textBox4.Text = "请填写键";

}

}

///<summary>

/// 获取

///</summary>

///<param name="sender"></param>

///<param name="e"></param>

privatevoid button3_Click(object sender, EventArgs e)

{

if (!string.IsNullOrEmpty(textBox1.Text))

{

if (RedisHelper.Exists(textBox1.Text))

{

textBox4.Text = RedisHelper.Get(textBox1.Text).ToString();

}

else

{

textBox4.Text = "已过期或不存在";

}

}

else

{

textBox4.Text = "请填写键";

}

}

///<summary>

/// 分钟数--非Backspace键或数字时处理

///</summary>

///<param name="sender"></param>

///<param name="e"></param>

privatevoid TextBox3_KeyPress(object sender, KeyPressEventArgs e)

{

if (e.KeyChar != 8 && !char.IsDigit(e.KeyChar))

{

e.Handled = true;

}

}

}

View Code

    5、运行结果:

 

    参考自:

    https://blog.csdn.net/wu_zongwen/article/details/80318916

以上是 Redis学习笔记:Redis在C#中的使用 的全部内容, 来源链接: utcz.com/z/532466.html

回到顶部