网易首页 > 网易号 > 正文 申请入驻

Redis订阅发布你会用了吗?

0
分享至

点击下方“JavaEdge”,选择“设为星标”

第一时间关注技术干货!


免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」; 不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人。 怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」

Redis实现多级缓存时的数据一致性保证

在实际应用中,为了提高数据访问的效率和减轻数据库的压力,通常会在系统中使用多级缓存策略。Redis作为一个常用的分布式缓存系统,可以通过多级缓存来保证数据的一致性。本文将介绍两种主要措施来保证本地缓存和Redis缓存数据的一致性:

  1. 主动措施:通过Redis的订阅发布模型来实现。当Redis中的数据发生变更时,所有订阅者会收到通知,从而更新本地缓存。

  2. 被动措施:本地缓存设置失效时间,当缓存失效后,主动从Redis中获取最新的数据。

本文主要通过代码示例展示如何在Spring Boot项目中实现Redis的订阅发布机制和本地缓存的使用。

1. Redis的订阅发布 1.1 添加依赖

首先,在项目的pom.xml文件中添加Spring Boot Data Redis和Guava的依赖:


     

 org.springframework.boot groupId>     

 spring-boot-starter-data-redis artifactId> dependency> 

     

 com.google.guava groupId>     

 guava artifactId>     

 27.0.1-jre version> dependency>






1.2 订阅者配置

Redis使用list结构实现订阅发布。订阅者和发布者可以在不同的项目中,但必须使用同一个Redis实例。

下图展示了Redis的订阅发布模型:

在代码中使用了Guava的Cache来实现本地缓存,并设置了失效时间。当监听到Redis修改时,主动修改本地缓存。同时,缓存失效后也会去Redis中获取数据并更新本地缓存。

package com.javagpt.back.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

@Component
public class FuseInterceptor implements HandlerInterceptor {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

     // 设置超时时间的Guava Cache 
    public static Cache
         
  moduleCache = CacheBuilder.newBuilder()              // 写入缓存后,10秒后过期             .expireAfterWrite( 10, TimeUnit.SECONDS)             .build();      @Override      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ExecutionException {          // 先在本地缓存中获取内容,若获取不到,直接查询Redis并放入本地缓存(线程安全)         String moduleStatus = (String) moduleCache.get( "topic:service_xx:module", () -> {              // 若本地缓存获取不到,那么去Redis查询数据并放入缓存。             String value = stringRedisTemplate.opsForValue().get( "service_xx:module");              return StringUtils.isBlank(value) ?  "close" : value;         });          // 拦截器处理          return  true;     }      /**      * 订阅发布获取到最新的Redis内容      *      * @param type    监听队列的名      * @param message 监听到的信息      */      public void refreshCache(String type, String message) {          if ( "topic:service_xx".equals(type)) {              // 若是这个队列的消息,那么将其转换为Set 结构,并放入缓存中             Set  patterns = JSONObject.parseObject(message,                      new TypeReference >() {}.getType());             moduleCache.put(type, patterns);         }  else {             moduleCache.put(type, message);         }     } }
1.3 消息发布者配置

在需要发布消息的地方,使用以下代码进行消息发布:

// 发布消息 
stringRedisTemplate.convertAndSend("topic:service_xx:module","发送的消息");
 // 将消息存储到Redis中,以便本地缓存失效后查询Redis缓存 
stringRedisTemplate.opsForValue().set("service_xx:module","发送的消息");

通过上述代码配置,当Redis中的数据发生变更时,订阅者可以及时收到通知并更新本地缓存,从而保证数据的一致性。同时,当本地缓存失效后,会主动查询Redis获取最新数据,以保证数据的一致性。

2. 总结

通过本文的介绍,我们了解了如何使用Redis的订阅发布机制以及本地缓存设置失效时间的方法来保证数据的一致性。通过这些措施,可以有效地提高系统的数据访问效率,减轻数据库的压力,同时保证数据的一致性。欢迎在评论区留言讨论。

编程严选网:http://www.javaedge.cn/ 专注分享软件开发全生态相关技术文章、视频教程资源、热点资讯等,全站资源免费学习,快来看看吧~

欢迎长按图片加好友,我会第一时间和你分享软件行业趋势面试资源学习方法等等。

添加好友备注【技术群交流】拉你进技术交流群

关注公众号后,在后台私信:

  • 更多教程资源应有尽有,欢迎关注并加技术交流群,慢慢获取


特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
别人送你这些东西,多半瞧不起你,别傻傻收下还当好人

别人送你这些东西,多半瞧不起你,别傻傻收下还当好人

娱乐洞察点点
2026-08-12 08:59:38
深度长文:人类,或许真的就是宇宙中等级最高的文明!

深度长文:人类,或许真的就是宇宙中等级最高的文明!

宇宙时空
2026-08-20 13:55:13
为何中国宁愿把电力输向越南,让越南夜晚灯火辉煌,却对朝鲜几乎绝不供电?这事看着奇怪,其实道理很简单!

为何中国宁愿把电力输向越南,让越南夜晚灯火辉煌,却对朝鲜几乎绝不供电?这事看着奇怪,其实道理很简单!

磊子讲史
2026-08-10 15:13:10
饭后 30 分钟决定寿命,医生:饭后别做这 3 件事否则是慢性自杀

饭后 30 分钟决定寿命,医生:饭后别做这 3 件事否则是慢性自杀

宝哥精彩赛事
2026-08-17 03:55:40
我跟女友说我爸是小干部,她扭头嫁给局长儿子,婚宴上局长却拉着我爸说:来,认识下,这是我的老领导,女友的脸都白了

我跟女友说我爸是小干部,她扭头嫁给局长儿子,婚宴上局长却拉着我爸说:来,认识下,这是我的老领导,女友的脸都白了

晓艾故事汇
2026-08-20 11:14:20
陈伟霆资源大降级!从赵丽颖到赵露思,陈伟霆的“霸总”搭档降级了

陈伟霆资源大降级!从赵丽颖到赵露思,陈伟霆的“霸总”搭档降级了

扒星人
2026-08-21 15:39:31
太可惜!斯科拉里曾主动来华自荐执教国足:只要750万美元

太可惜!斯科拉里曾主动来华自荐执教国足:只要750万美元

邱泽云
2026-08-21 18:49:06
国防部发出明确要求:如果马德雷山号再不拖走,就将依法处置!

国防部发出明确要求:如果马德雷山号再不拖走,就将依法处置!

荷兰豆爱健康
2026-08-22 00:12:30
1967年,那位打了彭老总两个耳光的开国少将,后来结局如何?

1967年,那位打了彭老总两个耳光的开国少将,后来结局如何?

狂热历史
2026-07-30 06:00:11
打破身份养老特权!工龄与抚恤一视同仁,才是社保最该有的公平

打破身份养老特权!工龄与抚恤一视同仁,才是社保最该有的公平

你在偷看谁
2026-08-18 20:50:27
央视不直播!女篮冲欧洲开门红!张子宇23+12无解,三大底牌稳赢

央视不直播!女篮冲欧洲开门红!张子宇23+12无解,三大底牌稳赢

海阔山遥YAO
2026-08-21 12:47:17
41只股成交活跃,筹码大换手(附股)

41只股成交活跃,筹码大换手(附股)

证券时报
2026-08-21 23:06:02
北京大学、清华大学2026年新生数据曝光!

北京大学、清华大学2026年新生数据曝光!

创作者_1494406553502
2026-08-19 17:49:41
又一家!江苏一20年光伏企业破产

又一家!江苏一20年光伏企业破产

新浪财经
2026-08-21 22:44:38
老百姓要提前做准备:药房、诊所出现3大怪象,正在蔓延,需深思

老百姓要提前做准备:药房、诊所出现3大怪象,正在蔓延,需深思

民生格物
2026-08-20 15:31:08
1963年,王光美的项链断了,珍珠全掉大海,一个连的士兵打捞未果

1963年,王光美的项链断了,珍珠全掉大海,一个连的士兵打捞未果

覃仕勇说史
2026-08-21 15:28:52
前防长费多罗夫正在成为乌克兰的“头号敌人”

前防长费多罗夫正在成为乌克兰的“头号敌人”

名人苟或
2026-08-21 07:03:23
公安局副局长遭迫害入狱,检察官被逼作伪证,出狱申冤5年无人管

公安局副局长遭迫害入狱,检察官被逼作伪证,出狱申冤5年无人管

易玄
2026-08-21 00:33:09
中国准备打大仗的战略决心,让美军深刻的明白了一个道理

中国准备打大仗的战略决心,让美军深刻的明白了一个道理

小马姨
2026-08-21 11:28:11
曝iPhone 18 Pro芯片提速18%功耗降30% 起售价或涨至1399美元

曝iPhone 18 Pro芯片提速18%功耗降30% 起售价或涨至1399美元

报错免疫体
2026-08-20 18:34:54
2026-08-22 05:19:00
JavaEdge incentive-icons
JavaEdge
Java 技术
500文章数 458关注度
往期回顾 全部

科技要闻

阿里AI的两面:云赚56亿,千问烧掉138亿

头条要闻

30岁女干部突遇洪水不幸牺牲 更多细节公布

头条要闻

30岁女干部突遇洪水不幸牺牲 更多细节公布

体育要闻

续哈登+招沃特森=骑士赌了

娱乐要闻

冯绍峰七夕带儿子游玩!次日聚会

财经要闻

蔡昉解读经济:扩大消费需求的政策思考

汽车要闻

2026成都车展:小鹏全阵容亮相 三款新车套件上新

态度原创

本地
亲子
艺术
公开课
军事航空

本地新闻

《牛来》的一声“妈妈”,到底多少人被精神污染了

亲子要闻

不要让一群有梦想的孩子,输给现实。

艺术要闻

警告:画面极度危险!你的瞳孔即将被这场视觉核爆炸成烟花!

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

俄在争议岛屿附近进行导弹训练 日本:无法接受

无障碍浏览 进入关怀版