广告
返回顶部
首页 > 资讯 > 数据库 >如何使用redis实现分布式缓存
  • 730
分享到

如何使用redis实现分布式缓存

2024-04-02 19:04:59 730人浏览 独家记忆
摘要

本文小编为大家详细介绍“如何使用Redis实现分布式缓存”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用redis实现分布式缓存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识

本文小编为大家详细介绍“如何使用Redis实现分布式缓存”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用redis实现分布式缓存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

如何使用redis实现分布式缓存

分布式缓存描述:

分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分布式开发,分布式部署,分布式、事物、系统 等有很多。使我们对分布式本身就有一个很明确的认识,分布式就是有多个应用程序组成,可能分布在不同的服务器上,最终都是在为WEB端提供服务。
分布式缓存有以下几点优点:

  1. 所有的Web服务器上的缓存数据都是相同的,不会因为应用程序不同,服务器的不同导致缓存数据的不一样。

  2. 缓存的是独立的不受Web服务器的重新启动或被删除添加的影响,也就是说这些Web的改变不到导致缓存数据的改变。

传统的单体应用架构因为用户的访问量的不高,缓存的存在大多数都是存储用户的信息,以及一些页面,大多数的操作都是直接和DB进行读写交互,这种架构简单,也称为简单架构,
传统的OA项目比如ERP,SCM,CRM等系统因为用户量不大也是因为大多数公司业务的原因,单体应用架构还是很常用的架构,但是有些系统随着用户量的增加,业务的扩张扩展,导致DB的瓶颈的出现。

以下我所了解到的关于这种情况的处理有以下两种

(1):当用户访问量不大,但是读写的数据量很大的时候,我们一般采取的是,对DB进行读写分离、一主多从、对硬件进行升级的方式来解决DB瓶颈的问题。
  这样的缺点也同样纯在:

1、用户量大的时候怎么办?,
2、对于性能的提升有限,
3、性价比不高。提升一点性能就需要花费很多代价,(打个比方,现在的I/O吞吐量是0.9的需要提升到1.0,我们在增加机器配置的情况下这个价格确实很可观的)

(2):当用户访问量也增加的时候,我们就需要引入缓存了来解决了,一张图描述缓存的大致的作用。

如何使用redis实现分布式缓存

缓存主要针对的是不经常发生改变的并且访问量很大的数据,DB数据库可以理解为只作为数据固化的或者只用来读取经常发生改变的数据,上图中我没有画SET的操作,就是想特意说明一下,缓存的存在可以作为一个临时的数据库,我们可以通过定时的任务的方式去同步缓存和数据库中的数据,这样做的好处是可以转移数据库的压力到缓存中。

缓存的出现解决了数据库压力的问题,但是当以下情况发生的时候,缓存就不在起到作用了,缓存穿透、缓存击穿、缓存雪崩这三种情况

缓存穿透:我们的程序中用缓存的时候一般采取的是先去缓存中查询我们想要的缓存数据,如果缓存中不存在我们想要的数据的话,缓存就失去了做用(缓存失效)我们就是需要伸手向DB库去要数据,这个时候这种动作过多数据库就崩溃了,这种情况需要我们去预防了。比如说:我们向缓存获取一个用户信息,但是故意去输入一个缓存中不存在的用户信息,这样就避过了缓存,把压力重新转移到数据上面了。对于这种问题我们可以采取,把第一次访问的数据进行缓存,因为缓存查不到用户信息,数据库也查询不到用户信息,这个时候避免重复的访问我们把这个请求缓存起来,把压力重新转向缓存中,有人会有疑问了,当访问的参数有上万个都是不重复的参数并且都是可以躲避缓存的怎么办,我们同样把数据存起来设置一个较短过期时间清理缓存。

缓存击穿:事情是这样的,对于一些设置了过期时间的缓存KEY,在过期的时候,程序被高并发的访问了(缓存失效),这个时候使用互斥锁来解决问题,

互斥锁原理:通俗的描述就是,一万个用户访问了,但是只有一个用户可以拿到访问数据库的权限,当这个用户拿到这个权限之后重新创建缓存,这个时候剩下的访问者因为没有拿到权限,就原地等待着去访问缓存。

永不过期:有人就会想了,我不设置过期时间不就行了吗?可以,但是这样做也是有缺点的,我们需要定期的取更新缓存,这个时候缓存中的数据比较延迟。

缓存雪崩:是指多种缓存设置了同一时间过期,这个时候大批量的数据访问来了,(缓存失效)数据库DB的压力又上来了。解决方法在设置过期时间的时候在过期时间的基础上增加一个随机数尽可能的保证缓存不会大面积的同事失效。

项目准备

1、首先安装Redis
2、然后下载安装:客户端工具:RedisDesktopManager(方便管理)
3、在我们的项目Nuget中 引用 Microsoft.Extensions.Caching.Redis

为此我们新建一个ASP.net core mvc项目,在项目Startup类的ConfigureServices方法中先注册Redis服务:

public void ConfigureServices(IServiceCollection services)
{
    //将Redis分布式缓存服务添加到服务中
    services.ADDDistributedRedisCache(options =>
    {
        //用于连接Redis的配置  Configuration.GetConnectionString("RedisConnectionString")读取配置信息的串
        options.Configuration = "localhost";// Configuration.GetConnectionString("RedisConnectionString");
        //Redis实例名DemoInstance
        options.InstanceName = "DemoInstance";
    });
    services.AddMvc();
}

也可以在上面注册Redis服务的时候,指定Redis服务器的IP地址、端口号和登录密码:

public void ConfigureServices(IServiceCollection services)
{
    //将Redis分布式缓存服务添加到服务中
    services.AddDistributedRedisCache(options =>
    {
        //用于连接Redis的配置  Configuration.GetConnectionString("RedisConnectionString")读取配置信息的串
        options.Configuration = "192.168.1.105:6380,passWord=1qaz@WSX3edc$RFV";//指定Redis服务器的IP地址、端口号和登录密码
        //Redis实例名DemoInstance
        options.InstanceName = "DemoInstance";
    });
    services.AddMvc();
}

后面我们会解释上面options.InstanceName设置的Redis实例名DemoInstance是用来做什么的

此外还可以在services.AddDistributedRedisCache方法中指定Redis服务器的超时时间,如果调用后面介绍的IDistributedCache接口中的方法,对Redis服务器进行的操作超时了,会抛出RedisConnectionException和RedisTimeoutException异常,所以下面我们在注册Redis服务的时候,指定了三个超时时间:

public void ConfigureServices(IServiceCollection services)
{
    //将Redis分布式缓存服务添加到服务中
    services.AddDistributedRedisCache(options =>
    {
        options.ConfigurationOptions = new StackExchange.Redis.ConfigurationOptions()
        {
            Password = "1qaz@WSX3edc$RFV",
            ConnectTimeout = 5000,//设置建立连接到Redis服务器的超时时间为5000毫秒
            SyncTimeout = 5000,//设置对Redis服务器进行同步操作的超时时间为5000毫秒
            ResponseTimeout = 5000//设置对Redis服务器进行操作的响应超时时间为5000毫秒
        };

        options.ConfigurationOptions.EndPoints.Add("192.168.1.105:6380");
        options.InstanceName = "DemoInstance";
    });
    services.AddMvc();
}

其中ConnectTimeout是建立连接到Redis服务器的超时时间,而SyncTimeout和ResponseTimeout是对Redis服务器进行数据操作的超时时间。注意上面我们使用了options.ConfigurationOptions属性来设置Redis服务器的IP地址、端口号和登录密码

IDistributedCache 接口

在项目中引用:using Microsoft.Extensions.Caching.Distributed; 使用IDistributedCache

IDistributedCache接口包含同步和异步方法。 接口允许在分布式缓存实现中添加、检索和删除项。 IDistributedCache接口包含以下方法:
Get、 GetAsync
采用字符串键并以byte[]形式检索缓存项(如果在缓存中找到)。
Set、SetAsync
使用字符串键向缓存添加或更改项(byte[]形式)。
Refresh、RefreshAsync
根据键刷新缓存中的项,并重置其可调过期超时值(如果有)。
Remove、RemoveAsync
根据键删除缓存项。如果传入Remove方法的键在Redis中不存在,Remove方法不会报错,只是什么都不会发生而已,但是如果传入Remove方法的参数为null,则会抛出异常。

如上所述,由于IDistributedCache接口的Set和Get方法,是通过byte[]字节数组来向Redis存取数据的,所以从某种意义上来说不是很方便,下面我封装了一个RedisCache类,可以向Redis中存取任何类型的数据。

其中用到了JSON.net Nuget包,来做json格式的序列化和反序列化:

using Microsoft.Extensions.Caching.Distributed;
using Newtonsoft.Json;
using System.Text;

namespace AspnetcoreRedis.Assembly
{
    /// <summary>
    /// RedisCache缓存操作类
    /// </summary>
    public class RedisCache
    {
        protected IDistributedCache cache;

        /// <summary>
        /// 通过IDistributedCache来构造RedisCache缓存操作类
        /// </summary>
        /// <param name="cache">IDistributedCache对象</param>
        public RedisCache(IDistributedCache cache)
        {
            this.cache = cache;
        }

        /// <summary>
        /// 添加或更改Redis的键值,并设置缓存的过期策略
        /// </summary>
        /// <param name="key">缓存键</param>
        /// <param name="value">缓存值</param>
        /// <param name="distributedCacheEntryOptions">设置Redis缓存的过期策略,可以用其设置缓存的绝对过期时间(AbsoluteExpiration或AbsoluteExpirationRelativeToNow),也可以设置缓存的滑动过期时间(SlidingExpiration)</param>
        public void Set(string key, object value, DistributedCacheEntryOptions distributedCacheEntryOptions)
        {
            //通过Json.NET序列化缓存对象为Json字符串
            //调用JsonConvert.SerializeObject方法时,设置ReferenceLoopHandling属性为ReferenceLoopHandling.Ignore,来避免Json.NET序列化对象时,因为对象的循环引用而抛出异常
            //设置TypeNameHandling属性为TypeNameHandling.All,这样Json.NET序列化对象后的Json字符串中,会包含序列化的类型,这样可以保证Json.NET在反序列化对象时,去读取Json字符串中的序列化类型,从而得到和序列化时相同的对象类型
            var strinGobject = JsonConvert.SerializeObject(value, new JsonSerializerSettings()
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                TypeNameHandling = TypeNameHandling.All
            });

            var bytesObject = Encoding.UTF8.GetBytes(stringObject);//将Json字符串通过UTF-8编码,序列化为字节数组

            cache.Set(key, bytesObject, distributedCacheEntryOptions);//将字节数组存入Redis
            Refresh(key);//刷新Redis
        }

        /// <summary>
        /// 查询键值是否在Redis中存在
        /// </summary>
        /// <param name="key">缓存键</param>
        /// <returns>true:存在,false:不存在</returns>
        public bool Exist(string key)
        {
            var bytesObject = cache.Get(key);//从Redis中获取键值key的字节数组,如果没获取到,那么会返回null

            if (bytesObject == null)
            {
                return false;
            }

            return true;
        }

        /// <summary>
        /// 从Redis中获取键值
        /// </summary>
        /// <typeparam name="T">缓存的类型</typeparam>
        /// <param name="key">缓存键</param>
        /// <param name="isExisted">是否获取到键值,true:获取到了,false:键值不存在</param>
        /// <returns>缓存的对象</returns>
        public T Get<T>(string key, out bool isExisted)
        {
            var bytesObject = cache.Get(key);//从Redis中获取键值key的字节数组,如果没获取到,那么会返回null

            if (bytesObject == null)
            {
                isExisted = false;
                return default(T);
            }

            var stringObject = Encoding.UTF8.GetString(bytesObject);//通过UTF-8编码,将字节数组反序列化为Json字符串

            isExisted = true;

            //通过Json.NET反序列化Json字符串为对象
            //调用JsonConvert.DeserializeObject方法时,也设置TypeNameHandling属性为TypeNameHandling.All,这样可以保证Json.NET在反序列化对象时,去读取Json字符串中的序列化类型,从而得到和序列化时相同的对象类型
            return JsonConvert.DeserializeObject<T>(stringObject, new JsonSerializerSettings()
            {
                TypeNameHandling = TypeNameHandling.All
            });
        }

        /// <summary>
        /// 从Redis中删除键值,如果键值在Redis中不存在,该方法不会报错,只是什么都不会发生
        /// </summary>
        /// <param name="key">缓存键</param>
        public void Remove(string key)
        {
            cache.Remove(key);//如果键值在Redis中不存在,IDistributedCache.Remove方法不会报错,但是如果传入的参数key为null,则会抛出异常
        }

        /// <summary>
        /// 从Redis中刷新键值
        /// </summary>
        /// <param name="key">缓存键</param>
        public void Refresh(string key)
        {
            cache.Refresh(key);
        }
    }
}

使用测试

然后我们在ASP.net core MVC项目中,新建一个CacheController,然后在其Index方法中来测试RedisCache类的相关方法:

public class CacheController : Controller
{
    protected RedisCache redisCache;

    //由于我们前面在Startup类的ConfigureServices方法中调用了services.AddDistributedRedisCache来注册Redis服务,所以asp.net Core MVC会自动依赖注入下面的IDistributedCache cache参数
    public CacheController(IDistributedCache cache)
    {
        redisCache = new RedisCache(cache);
    }

    public IActionResult Index()
    {
        bool isExisted;
        isExisted = redisCache.Exist("abc");//查询键值"abc"是否存在
        redisCache.Remove("abc");//删除不存在的键值"abc",不会报错

        string key = "Key01";//定义缓存键"Key01"
        string value = "This is a demo key !";//定义缓存值

        redisCache.Set(key, value, new DistributedCacheEntryOptions()
        {
            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
        });//设置键值"Key01"到Redis,使用绝对过期时间,AbsoluteExpirationRelativeToNow设置为当前系统时间10分钟后过期

        //也可以通过AbsoluteExpiration属性来设置绝对过期时间为一个具体的DateTimeOffset时间点
        //redisCache.Set(key, value, new DistributedCacheEntryOptions()
        //{
        //    AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(10)
        //});//设置键值"Key01"到Redis,使用绝对过期时间,AbsoluteExpiration设置为当前系统时间10分钟后过期

        var getVaue = redisCache.Get<string>(key, out isExisted);//从Redis获取键值"Key01",可以看到getVaue的值为"This is a demo key !"

        value = "This is a demo key again !";//更改缓存值

        redisCache.Set(key, value, new DistributedCacheEntryOptions()
        {
            SlidingExpiration = TimeSpan.FromMinutes(10)
        });//将更改后的键值"Key01"再次缓存到Redis,这次使用滑动过期时间,SlidingExpiration设置为10分钟

        getVaue = redisCache.Get<string>(key, out isExisted);//再次从Redis获取键值"Key01",可以看到getVaue的值为"This is a demo key again !"

        redisCache.Remove(key);//从Redis中删除键值"Key01"

        return View();
    }
}

前面我们在项目的Startup类ConfigureServices方法中,调用services.AddDistributedRedisCache注册Redis服务的时候,有设置options.InstanceName = "DemoInstance",那么这个InstanceName到底有什么用呢?

当我们在上面的CacheController中调用Index方法的下面代码后:

string key = "Key01";//定义缓存键"Key01"
string value = "This is a demo key !";//定义缓存值

redisCache.Set(key, value, new DistributedCacheEntryOptions()
{
    AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
});//设置键值"Key01"到Redis,使用绝对过期时间,AbsoluteExpirationRelativeToNow设置为当前系统时间10分钟后过期

我们使用redis-cli登录到Redis服务器中,使用Keys *指令查看当前Redis服务中存储的所有键时,可以看到结果如下:

如何使用redis实现分布式缓存

可以看到虽然我们代码中向Redis存入的键是"Key01",但是实际上在Redis服务中存储的键是"DemoInstanceKey01",所以实际上真正存入Redis服务中的键是“InstanceName+键”这种组合键,因此我们可以通过设置不同的InstanceName来为不同的Application在Redis中做数据隔离,这就是InstanceName的作用

读到这里,这篇“如何使用redis实现分布式缓存”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 如何使用redis实现分布式缓存

本文链接: https://www.lsjlt.com/news/73864.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用redis实现分布式缓存
    本文小编为大家详细介绍“如何使用redis实现分布式缓存”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用redis实现分布式缓存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识...
    99+
    2022-10-19
  • 如何实现redis分布式缓存
    摘要: 第一:Redis 是什么? Redis是基于内存、可持久化的日志型、Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越...
    99+
    2022-10-18
  • redis分布式缓存实现
    第一:Redis 是什么?Redis是基于内存、可持久化的日志型、Key-Value数据库 高性能存储系统,并提供多种语言的API.第二:出现背景数据结构(Data Structure)需求越来越多, 但memcache...
    99+
    2023-06-03
  • SpringBoot使用Redis实现分布式缓存
    目录springboot使用Redis实现分布式缓存Redis实现主从复制Redis集群的构建 springboot使用Redis实现分布式缓存 1、环境构建 ​ 1.1 ...
    99+
    2023-05-14
    Java Springboot使用Redis分布式缓存 Redis分布式缓存 Springboot分布式缓存
  • 如何使用Redis实现分布式缓存更新
    如何使用Redis实现分布式缓存更新在分布式系统中,缓存起到了重要的作用,可以大大提升系统的性能和可扩展性。而Redis作为一种高性能的内存数据库,常用于分布式缓存的实现。本文将为您介绍如何使用Redis实现分布式缓存的更新,并给出具体的代...
    99+
    2023-11-07
    分布式 redis 缓存更新
  • Redis如何实现分布式缓存功能
    Redis如何实现分布式缓存功能,需要具体代码示例摘要:Redis是一个高性能的数据缓存和存储系统,它具备分布式特性,可以支持分布式缓存的功能。本文将介绍Redis如何实现分布式缓存,并提供具体的代码示例来帮助读者理解。概述分布式缓存是一种...
    99+
    2023-11-07
    redis 实现 分布式缓存
  • Redis如何实现分布式缓存一致性
    Redis如何实现分布式缓存一致性,需要具体代码示例缓存是提高系统性能的重要手段之一,而分布式缓存则能够进一步提升系统的并发能力和扩展性。Redis作为一种常用的内存数据库,具有快速、高效的特点,广泛被用于分布式缓存的实现。在分布式缓存中,...
    99+
    2023-11-07
    缓存 分布式 redis
  • 利用Redis实现分布式缓存预热
    利用Redis实现分布式缓存预热的实践在现代大型应用程序中,缓存是提升性能和减少服务器负荷的常见方法之一。而分布式缓存预热则是在高并发场景下常用的优化技术之一。本文将介绍如何利用Redis实现分布式缓存预热,并给出具体的代码示例。什么是缓存...
    99+
    2023-11-07
    缓存 分布式 redis
  • 如何用Go语言和Redis实现分布式缓存
    如何用Go语言和Redis实现分布式缓存引言:随着互联网的发展和应用程序的复杂性增加,缓存已经成为了提高应用性能的重要手段之一。而分布式缓存则更加适用于大规模应用系统,能够提供高效的数据存储和访问。本文将介绍如何使用Go语言和Redis实现...
    99+
    2023-10-27
    Go语言 redis 分布式缓存
  • redis 分布式缓存实战-redis 事务
    redis 分布式缓存实战-redis 事务   1.描述    redis 事务单独的隔离操作:事务中的所有命令都会序列化、按顺序执行。事务在执行过程中,不会被其他客户端发送过来的命令请求所打断。   redis 事务没有隔离级...
    99+
    2017-03-11
    redis 分布式缓存实战-redis 事务
  • Redis如何实现分布式缓存的扩展性
    Redis是一款开源的内存数据库,具有高速读写、数据持久化等优势,是现在企业级应用中广泛使用的缓存服务。针对分布式缓存,Redis提供了多种扩展性方案,使其能够高效地满足企业高并发业务,本文将重点讨论Redis如何实现分布式缓存的扩展性。一...
    99+
    2023-11-07
    redis 分布式缓存 扩展性
  • 利用Redis实现分布式缓存一致性
    利用Redis实现分布式缓存一致性在现代分布式系统中,缓存起着非常重要的作用。它可以大大降低系统对数据库的访问频率,提高系统的性能和吞吐量。而在分布式系统中,为了保证缓存的一致性,我们需要解决多个节点之间的数据同步问题。在本文中,我们将介绍...
    99+
    2023-11-07
    缓存 分布式 redis
  • 如何利用Redis和C#实现分布式缓存功能
    如何利用Redis和C#实现分布式缓存功能简介:在分布式系统中,缓存是一个重要的组件,它可以减少数据库的负载,提高系统的性能和可伸缩性。Redis是一个流行的缓存服务器,它的简单性、高效性和可扩展性使其成为了一个理想的选择。本文将介绍如何使...
    99+
    2023-10-22
    缓存 分布式 redis
  • 如何利用Redis和Node.js实现分布式缓存功能
    如何利用Redis和Node.js实现分布式缓存功能Redis是一个开源的内存数据库,其提供了快速可扩展的键值存储,常用于缓存、消息队列和数据存储等场景。Node.js是一个基于Chrome V8引擎的JavaScript运行时,适用于高并...
    99+
    2023-10-22
    redis nodejs 分布式缓存
  • 基于Redis缓存怎么实现分布式锁
    本篇内容介绍了“基于Redis缓存怎么实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是分布式锁首先我们先来简单了解一下什么是...
    99+
    2023-06-19
  • Redis分布式缓存与秒杀怎么实现
    本篇内容介绍了“Redis分布式缓存与秒杀怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、单点Redis的问题数据丢失问题Redi...
    99+
    2023-07-05
  • ASP 缓存和 JavaScript:如何实现分布式缓存?
    ASP缓存和JavaScript:如何实现分布式缓存? 在现代Web应用程序中,缓存是一个关键的组成部分,可以大大提高应用程序的性能。常见的缓存类型包括内存缓存、磁盘缓存和分布式缓存。本文将重点介绍ASP缓存和JavaScript如何实现分...
    99+
    2023-07-10
    缓存 javascript 分布式
  • Redis分布式锁防止缓存击穿的实现
    缓存击穿 和缓存穿透不同的是,缓存击穿是指:缓存中没有,但是数据库中存在的热点数据。 例如:首页的热点新闻,并发访问量非常大的热点数据,如果缓存过期失效,服务器会去查询DB,这时候如...
    99+
    2022-11-13
  • 利用Redis实现分布式缓存穿透解决方案
    利用Redis实现分布式缓存穿透解决方案随着互联网业务的不断发展,数据访问量也在不断增加,为了提高系统的性能和用户体验,缓存技术逐渐成为了必不可少的一部分,其中Redis作为一种高效、可扩展的缓存中间件方案,备受开发者的青睐。在使用Redi...
    99+
    2023-11-07
    redis 分布式缓存 缓存穿透
  • 利用Redis实现分布式缓存失效解决方案
    利用Redis实现分布式缓存失效解决方案,需要具体代码示例在分布式系统中,缓存是提高性能和减轻数据库负载的重要组成部分。而缓存的失效是一个常见的问题,当缓存中的数据发生变化时,我们需要及时将缓存失效,保证数据的一致性。Redis是一个高性能...
    99+
    2023-11-08
    分布式 redis 缓存失效
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作