主要用处: 对接口访问次数的限制 这里是利用缓存而不是利用限流中间件 案例逻辑: 1-访问过三次就不可访问了 否则访问次数加一次 并添加到缓存 2- 如果缓存当前压根没有该key的缓存就默认为第一次访问,并添加到缓存 代码如下:
public class MemoryCacheController : Controller
{
public static MemoryCache _memoryCache=new MemoryCache(new MemoryCacheOptions());
#region 对接口访问次数的限制 这例子是访问过三次就不可访问了 否则访问次数加一次 并添加到缓存
[HttpPost("Limit")]
public bool Limit(string key)
{
if (MemoryCacheController.Exists(key))
{
int value = int.Parse(MemoryCacheController.GetCache(key).ToString());
if (value >= 3)
{
return false;
}
else
{
value = value + 1;
MemoryCacheController.AddCache(key, value);
}
}
else
{
MemoryCacheController.AddCache(key, 1);
}
return true;
}
#endregion
[HttpPost("Exists")]
public static bool Exists(string key)
{
if (key==null)
{
return false;
}
return _memoryCache.TryGetValue(key, out _);
}
[HttpPost("GetCache")]
public static object GetCache(string key)
{
if (key==null)
{
throw new ArgumentNullException(nameof(key));
}
if (!Exists(key))
{
throw new ArgumentNullException(nameof(key));
}
return _memoryCache.Get(key);
}
[HttpPost("AddCache")]
public static bool AddCache(string key,object value)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
if (value == null)
{
throw new ArgumentNullException(nameof(value));
}
DateTime dateTime =Convert.ToDateTime(DateTime.Now.AddDays(1).ToString("D")).AddSeconds(-1);
_memoryCache.Set(key,value, dateTime);
return Exists(key);
}
}
我这里为了方便就都写在控制器里了,实际按照开发场景把缓存相关的类抽出来
测试结果: 这是我调用了第四次的返回结果,因为这里限制访问次数为三次,所以前三次接口返回true代表成功调用并且添加到缓存中,第四次为false,代表无法访问了
|