C# Redis使用及帮助类
环境准备
目前官网已经没有window版本的安装文件了,window环境需要到github下载,地址如下:https://github.com/microsoftarchive/redis/tags
下载安装文件安装完成后,切换到安装目录,运行如下命令启动redis服务:
redis-server.exe redis.windows.conf
提示服务启动成功后,进行简单的测试
读取写入及删除都正常,环境准备已经完成。
C#操纵Redis
首先VS通过nuget安装StackExchange.Redis
然后我们尝试通过StackExchange.Redis对Redis缓存数据库做一些基本的操作。
首先需要引用命名空间
using StackExchange.Redis;
然后建立连接并且选择数据库,注意每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库,可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库。
//不传端口号时为默认端口号6379
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();//不传参的情况下选择0号数据库
然后就可以调用API设置读取Redis缓存了,例如我们尝试写入并去读一个字符串
string value = "abcdefg";
db.StringSet("mykey", value);
...
string value = db.StringGet("mykey");
Console.WriteLine(value); // writes: "abcdefg"
C# Redis帮助类
基本配置使用我们已经会了,然后尝试封装一个帮助类可以进行一些常用的操作,例如下面我们封装了四个方法,分别可以将一个泛型List添加到缓存,从缓存中获取指定泛型List,通过Lambda表达式删除指定List中满足条件的元素,通过Lambda表达式获取指定List中满足条件的集合。更多的方法如果有兴趣可以自己尝试封装
public class RedisHelper
{
static ConnectionMultiplexer redis = null;
public RedisHelper(string connstr)
{
redis = ConnectionMultiplexer.Connect(connstr);
}
/// <summary>
/// 将一个泛型List添加到缓存中
/// </summary>
/// <typeparam name="T">泛型T</typeparam>
/// <param name="listkey">Key</param>
/// <param name="list">list</param>
/// <param name="db_index">数据库序号,不传默认为0</param>
/// <returns></returns>
public bool addList<T>(string listkey,List<T> list,int db_index=0)
{
var db = redis.GetDatabase(db_index);
var value = JsonConvert.SerializeObject(list);
return db.StringSet(listkey, value);
}
/// <summary>
/// 通过指定Key值获取泛型List
/// </summary>
/// <typeparam name="T">泛型T</typeparam>
/// <param name="listkey">Key</param>
/// <param name="db_index">数据库序号,不传默认为0</param>
/// <returns></returns>
public List<T> getList<T>(string listkey,int db_index = 0)
{
var db = redis.GetDatabase(db_index);
if (db.KeyExists(listkey))
{
var value = db.StringGet(listkey);
if (!string.IsNullOrEmpty(value))
{
var list = JsonConvert.DeserializeObject<List<T>>(value);
return list;
}
else
{
return new List<T>();
}
}
else
{
return new List<T>();
}
}
/// <summary>
/// 删除指定List<T>中满足条件的元素
/// </summary>
/// <param name="listkey">Key</param>
/// <param name="func">lamdba表达式</param>
/// <param name="db_index">数据库序号,不传默认为0</param>
/// <returns></returns>
public bool delListByLambda<T>(string listkey, Func<T, bool> func,int db_index = 0)
{
var db = redis.GetDatabase(db_index);
if (db.KeyExists(listkey))
{
var value = db.StringGet(listkey);
if (!string.IsNullOrEmpty(value))
{
var list = JsonConvert.DeserializeObject<List<T>>(value);
if (list.Count>0)
{
list = list.SkipWhile<T>(func).ToList();
value = JsonConvert.SerializeObject(list);
return db.StringSet(listkey, value);
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
return false;
}
}
/// <summary>
/// 获取指定List<T>中满足条件的元素
/// </summary>
/// <param name="listkey">Key</param>
/// <param name="func">lamdba表达式</param>
/// <param name="db_index">数据库序号,不传默认为0</param>
/// <returns></returns>
public List<T> getListByLambda<T>(string listkey, Func<T, bool> func, int db_index = 0)
{
var db = redis.GetDatabase(db_index);
if (db.KeyExists(listkey))
{
var value = db.StringGet(listkey);
if (!string.IsNullOrEmpty(value))
{
var list = JsonConvert.DeserializeObject<List<T>>(value);
if (list.Count > 0)
{
list = list.Where(func).ToList();
return list;
}
else
{
return new List<T>();
}
}
else
{
return new List<T>();
}
}
else
{
return new List<T>();
}
}
}
在本篇中我们介绍了Redis的安装配置及如何使用C#操纵Redis缓存并且简单封装了一个帮助类,在下篇将通过一个爬虫的案例分享Redis在实际项目中的应用。
下一篇:C#爬取代理IP并存入Redis缓存