这篇文章让我们来说下 StackExchange.Redis的使用及帮助类
首先在windows上安装redis 在上边连接中有教程
1.创建net core项目
2.在包管理器中安装StackExchange.Redis的Nuget包,如下图:
4.在appsettings.json中添加connection连接字符串:(redis连接字符串)
5.然后新建一个RedisClient.cs 帮助类,简单封装了一下redis的读写操作
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Core.Common
{
/// <summary>
/// RedisClient.cs 帮助类
/// </summary>
public static class RedisClient
{
static ConnectionMultiplexer redis = null;
static IDatabase db = null;
public static void InitConnect(IConfiguration Configuration)
{
try
{
var RedisConnection = Configuration.GetConnectionString("RedisConnectionString");
redis = ConnectionMultiplexer.Connect(RedisConnection);
db = redis.GetDatabase();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
redis = null;
db = null;
}
}
#region String
/// <summary>
/// 保存单个key value
/// </summary>
/// <param name="value">保存的值</param>
/// <param name="expiry">过期时间</param>
public static bool SetStringKey(string key, string value, TimeSpan? expiry = default(TimeSpan?))
{
return db.StringSet(key, value, expiry);
}
/// <summary>
/// 获取单个key的值
/// </summary>
public static RedisValue GetStringKey(string key)
{
return db.StringGet(key);
}
/// <summary>
/// 获取一个key的对象
/// </summary>
public static T GetStringKey<T>(string key)
{
if (db == null)
{
return default;
}
var value = db.StringGet(key);
if (value.IsNullOrEmpty)
{
return default;
}
return JsonConvert.DeserializeObject<T>(value);
}
/// <summary>
/// 保存一个对象
/// </summary>
/// <param name="obj"></param>
public static bool SetStringKey<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
{
if (db == null)
{
return false;
}
string json = JsonConvert.SerializeObject(obj);
return db.StringSet(key, json, expiry);
}
#endregion
/// <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 static bool addList<T>(string listkey, List<T> list, int db_index = 0)
{
if (db == null)
{
return false;
}
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 static List<T> getList<T>(string listkey, int db_index = 0)
{
//var db = redis.GetDatabase(db_index);
if (db == null)
{
return new List<T>();
}
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>();
}
}
public static bool getKeyExists(string listkey, int db_index = 0)
{
if (db == null)
{
return false;
}
if (db.KeyExists(listkey))
{
return true;
}
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 static bool delListByLambda<T>(string listkey, Func<T, bool> func, int db_index = 0)
{
if (db == null)
{
return false;
}
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 static List<T> getListByLambda<T>(string listkey, Func<T, bool> func, int db_index = 0)
{
if (db == null)
{
return new List<T>();
}
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>();
}
}
}
}
6.在Startup.cs入口中 初始化RedisClient 的连接:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace CoreWebApiService
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
//初始化redis
RedisClient.InitConnect(Configuration);//*******
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseMvc();
}
}
}
7.最后,在Controller.cs中调用
using Core.Common;
using Core.Contract;
using Core.ViewEntity;
namespace CoreWebApiService.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class RedisDemoController : Controller
{
private readonly IAccessService _iAccess;
public RedisDemoController(IAccessService iAccess)
{
_iAccess = iAccess;
}
/// <summary>
///若redis没有数据,则取数据并设置redis
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
public ActionResult<string> Get(int id)
{
var redisResult = RedisClient.GetStringKey<int>("key1");
//若redis没有数据,则取数据并设置redis
if (redisResult == null || redisResult == 0)
{
Console.WriteLine("redisResult is empty");
RedisClient.SetStringKey("key1", id.ToString(),TimeSpan.FromDays(1)); //30秒过期
return id.ToString();
}
return redisResult.ToString();//有则直接返回
}
/// <summary>
/// 缓存中如果存在这个key返回查出的数据 如果不存在则写入缓存 查出数据后进行条件筛选和分页
/// </summary>
/// <param name="name">简称</param>
/// <param name="startIndex">开始索引</param>
/// <param name="limitedQuantity">限定数量</param>
/// <returns></returns>
[HttpPost]
public ActionResult GetList(string name, int startIndex, int limitedQuantity)
{
try
{
//缓存中如果存在这个key返回查出的数据 如果不存在则写入缓存 查出数据后进行条件筛选和分页
List<ContentUserViewEntity> list = null;
if (RedisClient.getKeyExists("listKey"))
{
list = RedisClient.getList<ContentUserViewEntity>("listKey")
}
else
{
Dictionary<string, string> paramers = new Dictionary<string, string>();
RedisClient.addList("listKey", GetContentUserByWhere(paramers));//插入key 和集合
list = RedisClient.getList<ContentUserViewEntity>("listKey");
}
if (!string.IsNullOrEmpty(name))
{
list = list.Where(x => x.Name.Contains(name)).ToList();
}
if (list.Count < limitedQuantity)
{
return Json(new { ok = true, msg = "sucess", data = list.GetRange(startIndex, list.Count) });
}
return Json(new { ok = true, msg = "sucess", data = list.GetRange(startIndex, limitedQuantity) });
}
catch (Exception ex)
{
return Json(new { ok = false, msg = ex.Message, data = "" });
}
}
private List<ContentUserViewEntity> GetContentUserByWhere(Dictionary<string, string> paramers)
{
try
{
#region 方法二
var entity = _iAccess.GetContentUserByWhere(paramers);
#endregion
return entity;
}
catch (Exception exp)
{
return null;
}
}
}
}
F5运行,输入:https://localhost:5001/api/values/100
返回100,此时redis中的数据库已经存入了 key1,100.
再次访问https://localhost:5001/api/values/99,还是会返回100,因为已经从redis中取数据了