ASP.NET Core 使用 Redis 实现分布式缓存:Docker

ASP.NET Core 使用 Redis 实现分布式缓存:Docker、IDistributedCache、StackExchangeRedis

前提:一台 Linux 服务器、已安装 Docker。

一,Docker 中运行 Redis

拉取 Redis 镜像

docker pull redis

查询镜像列表

docker imgaes

运行 Redis的几种方法

①运行并且设置 Redis 端口

docker run -p 6379:6379 -d redis:latest redis-server

docker run -p 6379:6379 -d {镜像id} redis-server

③持久化

将 Docker 里的 Redis 数据持久化到物理机

docker run -p 6379:6379 -v {物理机路径}:/data  -d redis:latest redis-server –appendonly yes

下载 Windows 版的 Redis 管理器

Windows 版本的 Redis Desktop Manager 64位 2019.1(中文版) 下载地址 https://www.7down.com/soft/233274.html

官方正版最新版本下载地址 https://redisdesktop.com/download

另附 Redis 学习教程:

.NET 使用 Redis 学习 地址(貌似这个教程版本过时了) https://www.cnblogs.com/cang12138/p/8884362.html

使用 Redis Desktop Manager 连接 Redis

二,ASP.NET Core 使用分布式缓存

ASP.NET Core 中,支持使用多种数据库进行缓存,ASP.NET Core 提供了统一的接口给开发者使用。

IDistributedCache

ASP.NET Core 中,使用 IDistributedCache 为开发者提供统一的缓存使用接口,而不必关注使用的是何种数据库。

IDistributedCache]接口提供了以下方法操作的分布式的缓存实现中的项:

byte[]byte[]

IDistributedCache 提供的常用方法如下:

方法 说明
获取Key(键)的值
异步获取键的值
刷新缓存
Refreshes a value in the cache based on its key, resetting its sliding expiration timeout (if any).
移除某个值
Removes the value with the given key.
Sets a value with the given key.
Sets the value with the given key.

官方文档很详细https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.caching.distributed.idistributedcache?view=aspnetcore-2.2

ASP.NET Core 中配置缓存

新建一个 ASP.NET Core WebApi 项目

Nuget 管理器安装

Microsoft.Extensions.Caching.StackExchangeRedis

ConfigureServices 中使用服务

services.AddDistributedMemoryCache();

配置 Redis 服务器

            services.AddStackExchangeRedisCache(options =>

        {<br/>
            options.Configuration = &#34;localhost:6379&#34;;<br/>
            options.InstanceName = &#34;mvc&#34;;<br/>
        });<br/>

InstanceName 是你自定义的实例名称,创建缓存时会以此名称开头。

这样就配置好了。

使用缓存

修改默认生成的 ValuesController.cs。

注入缓存服务

        private readonly IDistributedCache _cache;

    public ValuesController(IDistributedCache cache)<br/>
    {<br/>
        _cache = cache;<br/>
    }<br/>

设置缓存和使用缓存:

await _cache.GetAsync(“{键名}”);
_cache.SetAsync(“键名”, {值}, {设置});

删除原来的方法,添加以下代码:

        [HttpGet(“Set”)]

    public async Task&lt;JsonResult&gt; SetCache(string setkey, string setvalue)<br/>
    {

string key = “key1”;

        if (!string.IsNullOrEmpty(setkey))<br/>
            key = setkey;<br/>
        string value = DateTime.Now.ToLongTimeString();<br/>
        if (!string.IsNullOrEmpty(setvalue))<br/>
            value = setvalue;<br/>
        await _cache.SetStringAsync(key, value);<br/>
        return new JsonResult(new { Code = 200, Message = &#34;设置缓存成功&#34;, Data = &#34;key=&#34; + key + &#34;    value=&#34; + value });<br/>
    }

[HttpGet(“Get”)]

    public async Task&lt;JsonResult&gt; GetCache(string setkey)<br/>
    {<br/>
        string key = &#34;key1&#34;;<br/>
        if (!string.IsNullOrEmpty(setkey))<br/>
            key = setkey;<br/>
        var value = await _cache.GetStringAsync(key);<br/>
        return new JsonResult(new { Code = 200, Message = &#34;设置缓存成功&#34;, Data = &#34;key=&#34; + key + &#34;    value=&#34; + value });<br/>
    }<br/>

在 URL 添加 QueryString 可以设置缓存内容,如果没有带参数的话,就使用默认的值。

打开 https://localhost:5001/api/values/set 可以看到设置了默认值。

自定义设置缓存值。

可以获取缓存值。

设置缓存过期时间

使用 DistributedCacheEntryOptions 可以设置缓存过期时间

DistributedCacheEntryOptions 有三个属性,表示相对时间、绝对时间。

使用方法

        [HttpGet(“Set”)]

    public async Task&lt;JsonResult&gt; SetCache(string setkey, string setvalue)<br/>
    {

string key = “key1”;

        if (!string.IsNullOrEmpty(setkey))<br/>
            key = setkey;<br/>
        string value = DateTime.Now.ToLongTimeString();<br/>
        if (!string.IsNullOrEmpty(setvalue))<br/>
            value = setvalue;

var options = new DistributedCacheEntryOptions()

        .SetSlidingExpiration(TimeSpan.FromSeconds(20));

await _cache.SetStringAsync(key, value, options);

        return new JsonResult(new { Code = 200, Message = &#34;设置缓存成功&#34;, Data = &#34;key=&#34; + key + &#34;    value=&#34; + value });<br/>
    }<br/>

缓存 20 秒,20秒过后此缓存将被清除。