前言
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
最近项目中需要使用Redis,这里简单记录一下Redis的安装,以及如何在.NET中使用Redis。
安装redis
这里我是使用window安装redis,具体安装过程可以参考这个链接https://www.runoob.com/redis/redis-install.html
里面也有各种环境下的安装教程。
选择适用的第三方客户端
官网主要推荐的是# ServiceStack.Redis与StackExchange.Redis,不过 ServiceStack.Redis是收费的。所以当然选择免费的。
开始写个简单的项目
为了快速搭建,我选择简单建个winfrom项目来测试我要的
WinFrom创建一个redis项目
这里我使用的VS2015版本,.net Framework版本我选择4.5(ps:版本越高支持的第三方客户端StackExchange.Redis版本越高)
Nuget管理添加StackExchange.Redis
因为项目框架是4.5,所以这里选择1.2.6版本安装
写个RedisHelper.cs 帮助类
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Threading.Tasks;
/// <summary>
/// Redis读写帮助类
/// </summary>
public class RedisHelper
{
private string RedisConnectionStr = ConfigurationManager.AppSettings["RedisConnectionStr"];
private ConnectionMultiplexer redis { get; set; }
private IDatabase db { get; set; }
public RedisHelper()
{
redis = ConnectionMultiplexer.Connect(RedisConnectionStr);
db = redis.GetDatabase();
}
#region string类型操作
/// <summary>
/// set or update the value for string key
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool SetStringValue(string key, string value)
{
return db.StringSet(key, value);
}
/// <summary>
/// 保存单个key value
/// </summary>
/// <param name="key">Redis Key</param>
/// <param name="value">保存的值</param>
/// <param name="expireMinutes">过期时间</param>
/// <returns></returns>
public bool SetStringKey(string key, string value,int expireMinutes =0)
{
if (expireMinutes > 0)
{
return db.StringSet(key, value, TimeSpan.FromMinutes(expireMinutes));
}
else
return db.StringSet(key, value);
}
/// <summary>
/// 保存一个对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <returns></returns>
public bool SetStringKey<T>(string key, T obj, int expireMinutes = 0)
{
string json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
if (expireMinutes > 0)
{
return db.StringSet(key, json, TimeSpan.FromMinutes(expireMinutes));
}
else
return db.StringSet(key, json);
}
/// <summary>
/// 获取一个key的对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T GetStringKey<T>(string key) where T : class
{
var result = db.StringGet(key);
if (string.IsNullOrEmpty(result))
{
return null;
}
try
{
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(result);
}
catch
{
return null;
}
}
/// <summary>
/// get the value for string key
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public string GetStringValue(string key)
{
return db.StringGet(key);
}
/// <summary>
/// Delete the value for string key
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool DeleteStringKey(string key)
{
return db.KeyDelete(key);
}
#endregion
#region 哈希类型操作
/// <summary>
/// set or update the HashValue for string key
/// </summary>
/// <param name="key"></param>
/// <param name="hashkey"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool SetHashValue(string key, string hashkey, string value)
{
return db.HashSet(key, hashkey, value);
}
/// <summary>
/// set or update the HashValue for string key
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="hashkey"></param>
/// <param name="t">defined class</param>
/// <returns></returns>
public bool SetHashValue<T>(String key, string hashkey, T t) where T : class
{
var json = Newtonsoft.Json.JsonConvert.SerializeObject(t);
return db.HashSet(key, hashkey, json);
}
/// <summary>
/// 保存一个集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key">Redis Key</param>
/// <param name="list">数据集合</param>
/// <param name="getModelId"></param>
public void HashSet<T>(string key, List<T> list, Func<T, string> getModelId)
{
List<HashEntry> listHashEntry = new List<HashEntry>();
foreach (var item in list)
{
string json = Newtonsoft.Json.JsonConvert.SerializeObject(item);
listHashEntry.Add(new HashEntry(getModelId(item), json));
}
db.HashSet(key, listHashEntry.ToArray());
}
/// <summary>
/// 获取hashkey所有的值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public List<T> HashGetAll<T>(string key) where T : class
{
List<T> result = new List<T>();
HashEntry[] arr = db.HashGetAll(key);
foreach (var item in arr)
{
if (!item.Value.IsNullOrEmpty)
{
result.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<T>(item.Value));
}
}
return result;
}
/// <summary>
/// get the HashValue for string key and hashkey
/// </summary>
/// <param name="key">Represents a key that can be stored in redis</param>
/// <param name="hashkey"></param>
/// <returns></returns>
public RedisValue GetHashValue(string key, string hashkey)
{
RedisValue result = db.HashGet(key, hashkey);
return result;
}
/// <summary>
/// get the HashValue for string key and hashkey
/// </summary>
/// <param name="key">Represents a key that can be stored in redis</param>
/// <param name="hashkey"></param>
/// <returns></returns>
public T GetHashValue<T>(string key, string hashkey) where T : class
{
RedisValue result = db.HashGet(key, hashkey);
if (string.IsNullOrEmpty(result))
{
return null;
}
T t = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(result);
return null;
}
/// <summary>
/// delete the HashValue for string key and hashkey
/// </summary>
/// <param name="key"></param>
/// <param name="hashkey"></param>
/// <returns></returns>
public bool DeleteHashValue(string key, string hashkey)
{
return db.HashDelete(key, hashkey);
}
#endregion
}
redis的地址配置放app.config文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="RedisConnectionStr" value="localhost:6379,DefaultDatabase=0"/>
</appSettings>
</configuration>
测试
我这边简单展示了获取、设置、删除的功能
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text))
{
textBox1.Text = "请填写键";
return;
}
if (string.IsNullOrEmpty(textBox2.Text))
{
textBox2.Text = "请填写值";
return;
}
if (string.IsNullOrEmpty(textBox3.Text))
{
textBox3.Text = "请填写过期时间";
return;
}
//设置
RedisHelper redis = new RedisHelper();
redis.SetStringKey(textBox1.Text, textBox2.Text, int.Parse(textBox3.Text));
textBox4.Text = "添加成功";
}
private void button2_Click(object sender, EventArgs e)
{
RedisHelper redis = new RedisHelper();
if (!string.IsNullOrEmpty(textBox1.Text))
{
var val = redis.GetStringValue(textBox1.Text);
if (!string.IsNullOrEmpty(val))
{
//读取
textBox2.Text = val;
}
else
{
textBox4.Text = "已过期或不存在";
}
}
else
{
textBox1.Text = "请填写键";
}
}
private void button3_Click(object sender, EventArgs e)
{
RedisHelper redis = new RedisHelper();
if (!string.IsNullOrEmpty(textBox1.Text))
{
if (redis.DeleteStringKey(textBox1.Text))
{
//读取
textBox4.Text = "删除成功!";
}
else
{
textBox4.Text = "删除失败!";
}
}
else
{
textBox1.Text = "请填写键";
}
}
1、设置
2、获取
3、删除
我这里都只是简单展示string的操作,其他数据类型的大家也都可以试试。