Redis 本地缓存+远程缓存方案

使用纯java的ehcache作为本地缓存

Reids 作为远程分布式缓存

解决redis缓存压力过大,提高缓存速度,以及缓存性能。

Redis和ehcache缓存的区别

如果是单个应用或者对缓存访问要求很高的应用,用ehcache。
如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。

缓存更新策略

1、广播更新策略

使用redis的发布与订阅来实现缓存更新广播,本地缓存存放更新频率低,但请求量很高的数据,对于更新频率很高的数据应该由redis缓存来承担。

当某台服务器的本地缓存更新的时候,通过redis发布与订阅机制发布该key的更新信息,其他服务器监听到key的更新信息则更新本地缓存的key

具体实现

通过注解方式标明该方法时候使用缓存,缓存的超时时间,是否开启本地缓存,如果开启本地缓存则当更新缓存时,先更新本地缓存和redis缓存,然后通过redis发布更新广播,其他服务器接收到该key的更新信息则更新本地缓存

如果添加类型的更新则本地缓存新建key然后查询redis的key将value同步到本地缓存

如果修改类型的更新则查询redis缓存然后将value同步到本地缓存。

如果删除类型的更新则删除本地缓存的key和value。

2、定时更新

考虑的本地缓存和服务器缓存要保证数据的一致性,防止因各种原因导致因广播信息没有接收到或者其他原因本地缓存没有更新特加入定时更新策略。

定时更新是在广播更新的基础上在本地缓存加入超时时间,如果超过多长时间没有接收到更新广播,则清除本地缓存的key(设置超时时间),来保证缓存的最终一致性。

缓存注意点

本地缓存必须设置超时时间,必须定时更更新本地缓存,防止因各种原因导致的本地缓存和redis缓存不一致,保证缓存的一致性。

redis缓存不应该设置永久缓存,防止因更新失败导致的缓存不一致,以及僵尸类型的key占用服务器内存(一些系统配置级别的可以设置永久缓存,如系统配置,基本上不会进行更新的或者更新频率很低的)

架构流程图

单节点架构图

多节点架构图

redis订阅发布消息操作本地缓存的更多相关文章

  1. Redis订阅广播实现多级缓存

    Redis应用场景很多,现在介绍一下它的几大特性之一   发布订阅(pub/sub) 特性介绍: 什么是redis的发布订阅(pub/sub)?   Pub/Sub功能(means Publish, ...

  2. 利用Azure Redis Cache构建百万量级缓存读写

    Redis是一个非常流行的基于内存的,低延迟,高吞吐量的key/value数据存储,被广泛用于数据库缓存,session的管理,热数据高速访问,甚至作为数据库方式提高应用程序可扩展性,吞吐量,和实施处 ...

  3. spring boot: 用redis的消息订阅功能更新应用内的caffeine本地缓存(spring boot 2.3.2)

    一,为什么要更新caffeine缓存? 1,caffeine缓存的优点和缺点 生产环境中,caffeine缓存是我们在应用中使用的本地缓存, 它的优势在于存在于应用内,访问速度最快,通常都不到1ms就 ...

  4. 本地缓存,Redis缓存,数据库DB查询(结合代码分析)

    问题背景 为什么要使用缓存?本地缓存/Redis缓存/数据库查询优先级? 一.为什么要使用缓存 原因:CPU的速度远远高于磁盘IO的速度问题:很多信息存在数据库当中的,每次查询数据库就是一次IO操作所 ...

  5. 缓存子系统如何设计(Cachable tag, Memcache/redis support, xml config support, LRU/LFU/本地缓存命中率)

    大家对这段代码肯定很熟悉吧: public List<UserInfo> SearchUsers(string userName) { string cacheKey=string.For ...

  6. Redis五大类型操作使用以及订阅发布功能

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  7. 同时使用Redis缓存和Google Guava本地缓存注意事项(深拷贝和浅拷贝)

    目录 1.问题场景及说明 2.Redis 缓存是深拷贝 3.Guava本地缓存直接获取则是浅拷贝 4.如何实现Guava获取本地缓存是深拷贝? 1.问题场景及说明 系统中同时使用 Redis 缓存和 ...

  8. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  9. 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式

    一. 背景 说起EF的增删改操作,相信很多人都会说,有两种方式:① 通过方法操作  和  ② 通过状态控制. 相信你在使用EF进行删除或修改操作的时候,可能会遇到以下错误:“ The object c ...

随机推荐

  1. python常见函数以及模块调用

    1.常用函数区别 print: 在python3.0中print是函数,这意味着需要编写print(A )而不是print A str()和repr()的区别 >>>print st ...

  2. ViewBag赋值Html格式值

    今天再给自己总结一下,关于ViewBag赋值Html格式值,但是在web页显示不正常; 例如,ViewBag.Content = "<p>你好,我现在测试一个东西.</p& ...

  3. 部署Qt应用时候报错0xc000007b

    情况: 在开发环境可以运行,部署到其他电脑无法运行: 排错:百度.谷歌了很多方法不行,后来发现添加了Qt\5.11.0\mingw53_32\bin环境变量,程序执行正常,去掉就报错:猜测估计是dll ...

  4. 测试计划的编写6要素(5W1H)

    Why --为什么要进行这些测试 WHat--测试哪些内容 When--测试不同阶段的起止时间 WHere--相应文档,缺陷的存放位置,测试环境 Who--项目有关人员组成 How--如何去做,使用哪 ...

  5. mac安装brew简单方法

    安装方法:命令行输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...

  6. 2017年java面试题库【归类篇】

    一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. 3.说说你知道的几个Java集合类:list.set.queue.map实现类咯... 4. ...

  7. ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:847)

    /******************************************************************************* * ssl.SSLError: [SS ...

  8. Matlab中的rectangle函数

    rectangle函数功能:创建二维矩形对象. rectangle('Position',[x,y,w,h])从点(x,y)开始绘制一个宽w高h的矩形,对坐标轴数据单元指定值.注意,按指定的比例显示矩 ...

  9. Python全栈之路----常用模块----序列化(json&pickle&shelve)模块详解

    把内存数据转成字符,叫序列化:把字符转成内存数据类型,叫反序列化. Json模块 Json模块提供了四个功能:序列化:dumps.dump:反序列化:loads.load. import json d ...

  10. 改变highCharts的X轴和Y轴的数据刻度

    xAxis:{ tickPixelInterval:10 //自行调整X轴刻度的间距}, yAxis:{ lineWidth:1, //Y轴默认不显示Y轴线,添加一个轴线的宽度就可以显示出来 tick ...