当前位置: 首页 > news >正文

做设计什么网站可以兼职西安seo霸屏

做设计什么网站可以兼职,西安seo霸屏,海淀网站建设联系方式,wp博客网站怎么做背景 业界第三方缓存框架一般为redis,本地缓地ehcache或guava,一般通过spring提供的restTemplate操作缓存 然而这样会存在以下问题: 与缓存中间件强耦合需手动整合多级缓存不支持注解数据更新时无法自动刷新缓存存在缓存穿透、缓存击穿、缓…

背景

业界第三方缓存框架一般为redis,本地缓地ehcache或guava,一般通过spring提供的restTemplate操作缓存

然而这样会存在以下问题:

  • 与缓存中间件强耦合
  • 需手动整合多级缓存
  • 不支持注解
  • 数据更新时无法自动刷新缓存
  • 存在缓存穿透、缓存击穿、缓存雪崩风险
  • 日志不足

改造方案

基于上述问题,针对每点问题提出修复/优化方案:

1、与缓存中间件强耦合

对外仅暴露一个接口cacheService操作缓存,调用方无需关心内部实现,但需要通过配置开启第三方缓存

2、需手动整合多级缓存

自动整合两级缓存,redis + guava

3、不支持注解

增加自定义注解

4、数据更新时无法自动刷新缓存(未实现)

使用阿里开源框架canal监听mysql的binlog日志,将变更通过MQ广播到消费端,由消费端实时更新缓存:

1)MQ划分两个组:集群组与机器组,分别用于处理第三方缓存刷新(只需一台机器处理)和本地缓存刷新(每台机器都要处理)

2)canal收到binlog变更后,发送一条消息到集群组

3)收到消息的机器先判断缓存是否开启了本地缓存,若是则向机器组发送一条消息,然后判断是否开启了第三方缓存,若有则刷新最新数据

4)收到本地缓存消息的机器刷新本地缓存最新数据

5、存在缓存穿透、缓存击穿、缓存雪崩风险

缓存穿透:增加NULL值,缓存较短的时间

缓存击穿:增加锁同步数据获取过程

缓存雪崩:增加预警参数提前异步刷新,热点缓存监控

6、日志不足

增加统一日志,方便排查问题

详细设计

模块组成:

类图:

配置类

支持两级缓存:一级为本地缓存,使用guava实现;二级为分布式缓存,使用redis + redisson实现

二级缓存需要添加分布式服务配置,而一级缓存在缓存单位中配置即可,实时更新依赖MQ服务

1、服务配置

redisson配置类:RedissonConfiguration,用于redis相关配置

详细配置项参考附录

2、缓存单位配置

同一前缀为一个缓存单位,新增配置文件cache-config.yml(参考cache-config-demo.yml)对缓存参数进行定义,服务启动后会解析该文件,将配置保存到CacheConfiguration中

注意:支持依赖jar内配置cache-config.yml,若key冲突则在启动时报错

caches:# 业务空间,非必填application: mc# L1并发级别,即同时支持多少个线程,非必填l1ConcurrencyLevel: 10# 单个缓存配置cache:# 前缀,必填,唯一prefix: user_# 版本,非必填,用于缓存结构改变后升级reload最新内容version: v1# 缓存时间,必填,支持d/h/m/s,默认sexpired: 5m# 预警时间,非必填,支持d/h/m/s,默认s,用于提前更新alarm: 2m# 序列化方式,非必填,支持hessian/jdk,默认hessianserializer: hessian# 开启一级缓存,非必填,一二级至少开启其一L1:# 初始容量,非必填,Guava扩容代价大,尽量指定所需容量initialCapacity: 100# 最大容量,必填maximumSize: 1000# 并发级别,非必填,优先级高于l1ConcurrencyLevelconcurrencyLevel: 10# 开启二级缓存,非必填,一二级至少开启其一L2:# 指定配置名称,必填(否则无法解析为对象),用于多分布式缓存源,为空使用默认配置ref: xxxConfig# 实时更新配置,非必填(未实现)reload:# 订阅的表,必填,多个用逗号分隔table: user, lesson# reload操作,非必填,UPDATE(更新)/DELETE(删除,默认)/RELOAD(重新刷新)operation: UPDATE# key拼接方式,非必填,数据库记录用小括号作动态替换key: _(id)

模块服务类

1、存储实体

实体字段如下:

public class CacheEntity implements Serializable {private static final long serialVersionUID = 1L;// 真实内容,通过hession/jdk进行序列化/反序列化private String value;// 缓存时间private long cacheTime;// 预警时间private long alarmTime;
}

2、缓存操作

包括常规的get()、set()、add()、del()外,增加带LoadingCache功能的get方法,提供分布式锁方法DLock()、unDLock(),由redisson实现

public  <T> T get(String prefix, String key, LoadingCache loader, Object ... params) {CacheEntity entity = null;T value = null;// 获取缓存单位配置Config config = CacheConfiguration.getConfig(prefix);if (config.hasL1() != null) {// 获取L1结果entity = getL1();}if (entity == null) {if (config.hasL2() != null) {// 获取L2结果entity = getL2();}}if (entity == null && loader != null) {// 获取数据value = loader.load(params);if (value != null) {// 设置缓存set(prefix, key, value);} else {// 设置NULL值setNull(prefix, key);}return value;}return serializer.deserialize(value);
}

3、提前更新

缓存未到expired但已到alarm时,在返回内容之前开启异步线程提前更新缓存内容

private void alarmUpdate(Config config, CacheEntity entity, LoadingCache loader) {long time = System.currentTimeMillis() + entity.getCacheTime();if (time > entity.getAlarmTime()) {T value = loader.load();if (value != null) {// 设置缓存set(prefix, key, value);}}
}

4、注解配置

支持在方法上增加自定义注解,在调用时自动走缓存

// 获取单个缓存
@MethodCache("user_")
public List getList(int id, String name) {// ...
}
// 获取批量缓存
// 注意第一个参数必须为key的list集合,返回以key分组
@MultipleMethodCache(CacheServiceTest.l1Prefix)
public Map<String, CacheTestB> getMultiAutoIncrement(List<String> keys, String value, int num) {// ...
}

注意:只能增强由spring管理的类方法

5、实时更新(未实现)

使用阿里开源框架canal监听mysql的binlog日志,将变更通过MQ广播到消费端,具体参考:Canal Kafka RocketMQ QuickStart

服务收到消息后,对消息进行解析处理

public boolean consumer(byte[] bytes) {Message message = JsonUtil.fromStr(bytes, Message.class);String table = message.getTable();// 获取reload配置ReloadConfig reloadConfig = CacheConfiguration.getReloadConfig(table);if (reloadConfig != null) {String key = reloadConfig.getKey();if (reloadConfig.getOperation() == DELETE) {// 删除缓存del(key);} else {// 更新缓存update(key, message);}}
}

6、其它

  • 增加debug级别日志打印
  • 增加是否使用缓存配置,用于测试用例

待实现功能

  • 目前仅支持byte数组存储,后期将开放redis其它类型的实现(部分redis独有的类型geo等如真有需求,是否考虑直接提供client?这样子就增加了耦合性)
  • 基于canal自动刷新缓存
  • 热点数据统计

附录

源码

基于spring boot通用多级缓件组件: 业界第三方缓存框架一般为redis,本地缓地ehcache或guava,一般通过spring提供的restTemplate操作缓存,然而这样会存在一些问题,期望通过此组件解决问题

redis配置

以redisson作为前缀,开启redis配置:redisson.open.flag=true

单机版redis

#单Redis节点模式

redisson.singleServerConfig.address=127.0.0.1:6379

集群模式

集群模式除了适用于Redis集群环境,也适用于任何云计算服务商提供的集群模式,例如AWS ElastiCache集群版、Azure Redis Cache和阿里云(Aliyun)的云数据库Redis版。

#集群模式

redisson.model=CLUSTER

#redis机器.一直累加下去

redisson.multiple-server-config.node-addresses[0]=127.0.0.1:6379

redisson.multiple-server-config.node-addresses[1]=127.0.0.1:6380

redisson.multiple-server-config.node-addresses[2]=127.0.0.1:6381

云托管模式

云托管模式适用于任何由云计算运营商提供的Redis云服务,包括亚马逊云的AWS ElastiCache、微软云的Azure Redis 缓存和阿里云(Aliyun)的云数据库Redis版

#云托管模式

redisson.model=REPLICATED

#redis机器.一直累加下去

redisson.multiple-server-config.node-addresses[0]=127.0.0.1:6379

redisson.multiple-server-config.node-addresses[1]=127.0.0.1:6380

redisson.multiple-server-config.node-addresses[2]=127.0.0.1:6381

哨兵模式

redisson.model=SENTINEL

#主服务器的名称是哨兵进程中用来监测主从服务切换情况的。

redisson.multiple-server-config.master-name="mymaster"

#redis机器.一直累加下去

redisson.multiple-server-config.node-addresses[0]=127.0.0.1:6379

redisson.multiple-server-config.node-addresses[1]=127.0.0.1:6380

redisson.multiple-server-config.node-addresses[2]=127.0.0.1:6381

主从模式

redisson.model=MASTERSLAVE

#第一台机器就是主库.其他的为从库

redisson.multiple-server-config.node-addresses[0]=127.0.0.1:6379

redisson.multiple-server-config.node-addresses[1]=127.0.0.1:6380

redisson.multiple-server-config.node-addresses[2]=127.0.0.1:6381

属性列表

基本都是官方参数.我将参数整合了下.分为 公共参数,单例模式参数,集群模式参数

1.公共参数

属性名

默认值

备注

redisson.name

default

配置名称,必须保证唯一,否则配置将被覆盖

redisson.password

用于节点身份验证的密码。

redisson.attemptTimeout

10000L

等待获取锁超时时间,-1则是一直等待

redisson.lockModel

单个key默认可重入锁

多个key默认联锁

锁的模式.如果不设置, REENTRANT(可重入锁),FAIR(公平锁),MULTIPLE(联锁),REDLOCK(红锁),READ(读锁), WRITE(写锁)

redisson.model

SINGLE

集群模式:SINGLE(单例),SENTINEL(哨兵),MASTERSLAVE(主从),CLUSTER(集群),REPLICATED(云托管)

redisson.codec

org.redisson.codec.JsonJacksonCodec

Redisson的对象编码类是用于将对象进行序列化和反序列化,以实现对该对象在Redis里的读取和存储

redisson.threads

当前处理核数量 * 2

这个线程池数量被所有RTopic对象监听器,RRemoteService调用者和RExecutorService任务共同共享。

redisson.nettyThreads

当前处理核数量 * 2

这个线程池数量是在一个Redisson实例内,被其创建的所有分布式数据类型和服务,以及底层客户端所一同共享的线程池里保存的线程数量。

redisson.transportMode

NIO

TransportMode.NIO,TransportMode.EPOLL - 需要依赖里有netty-transport-native-epoll包(Linux) TransportMode.KQUEUE - 需要依赖里有 netty-transport-native-kqueue包(macOS)

redisson.idleConnectionTimeout

10000

如果当前连接池里的连接数量超过了最小空闲连接数,而同时有连接空闲时间超过了该数值,那么这些连接将会自动被关闭,并从连接池里去掉。时间单位是毫秒

redisson.connectTimeout

10000

同任何节点建立连接时的等待超时。时间单位是毫秒。

redisson.timeout

3000

等待节点回复命令的时间。该时间从命令发送成功时开始计时。

redisson.retryAttempts

3

如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。

redisson.retryInterval

1500

在一条命令发送失败以后,等待重试发送的时间间隔。时间单位是毫秒。

redisson.subscriptionsPerConnection

5

每个连接的最大订阅数量。

redisson.clientName

在Redis节点里显示的客户端名称。

redisson.sslEnableEndpointIdentification

true

开启SSL终端识别能力。

redisson.sslProvider

JDK

确定采用哪种方式(JDK或OPENSSL)来实现SSL连接。

redisson.sslTruststore

指定SSL信任证书库的路径。

redisson.sslTruststorePassword

指定SSL信任证书库的密码。

redisson.sslKeystore

指定SSL钥匙库的路径。

redisson.sslKeystorePassword

指定SSL钥匙库的密码。

redisson.lockWatchdogTimeout

30000

监控锁的看门狗超时时间单位为毫秒。该参数只适用于分布式锁的加锁请求中未明确使用leaseTimeout参数的情况。如果该看门口未使用lockWatchdogTimeout去重新调整一个分布式锁的lockWatchdogTimeout超时,那么这个锁将变为失效状态。这个参数可以用来避免由Redisson客户端节点宕机或其他原因造成死锁的情况。

redisson.keepPubSubOrder

true

通过该参数来修改是否按订阅发布消息的接收顺序出来消息,如果选否将对消息实行并行处理,该参数只适用于订阅发布消息的情况。

单例模式参数

属性名

默认值

备注

redisson.singleServerConfig.address

服务器地址,必填ip:port

redisson.singleServerConfig.database

0

尝试连接的数据库编号。

redisson.singleServerConfig.subscriptionConnectionMinimumIdleSize

1

用于发布和订阅连接的最小保持连接数(长连接)。Redisson内部经常通过发布和订阅来实现许多功能。长期保持一定数量的发布订阅连接是必须的。

redisson.singleServerConfig.subscriptionConnectionPoolSize

50

用于发布和订阅连接的连接池最大容量。连接池的连接数量自动弹性伸缩。

redisson.singleServerConfig.connectionMinimumIdleSize

32

最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时写入反应速度。

redisson.singleServerConfig.connectionPoolSize

64

连接池最大容量。连接池的连接数量自动弹性伸缩。

redisson.singleServerConfig.dnsMonitoringInterval

5000

用来指定检查节点DNS变化的时间间隔。使用的时候应该确保JVM里的DNS数据的缓存时间保持在足够低的范围才有意义。用-1来禁用该功能。

集群模式

属性名

默认值

备注

redisson.multiple-server-config.node-addresses

服务器节点地址.必填
redisson.multiple-server-config.node-addresses[0]=127.0.0.1:6379
redisson.multiple-server-config.node-addresses[1]=127.0.0.1:6380
redisson.multiple-server-config.node-addresses[2]=127.0.0.1:6381

redisson.multiple-server-config.loadBalancer

org.redisson.connection.balancer.RoundRobinLoadBalancer

在多Redis服务节点的环境里,可以选用以下几种负载均衡方式选择一个节点:
org.redisson.connection.balancer.WeightedRoundRobinBalancer - 权重轮询调度算法
org.redisson.connection.balancer.RoundRobinLoadBalancer - 轮询调度算法
org.redisson.connection.balancer.RandomLoadBalancer - 随机调度算法

redisson.multiple-server-config.slaveConnectionMinimumIdleSize

32

多从节点的环境里,每个 从服务节点里用于普通操作(非 发布和订阅)的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时读取反映速度。

redisson.multiple-server-config.slaveConnectionPoolSize

64

多从节点的环境里,每个 从服务节点里用于普通操作(非 发布和订阅)连接的连接池最大容量。连接池的连接数量自动弹性伸缩。

redisson.multiple-server-config.masterConnectionMinimumIdleSize

32

多节点的环境里,每个 主节点的最小保持连接数(长连接)。长期保持一定数量的连接有利于提高瞬时写入反应速度。

redisson.multiple-server-config.masterConnectionPoolSize

64

多主节点的环境里,每个 主节点的连接池最大容量。连接池的连接数量自动弹性伸缩。

redisson.multiple-server-config.readMode

SLAVE

设置读取操作选择节点的模式。 可用值为: SLAVE - 只在从服务节点里读取。 MASTER - 只在主服务节点里读取。 MASTER_SLAVE - 在主从服务节点里都可以读取。

redisson.multiple-server-config.subscriptionMode

SLAVE

设置订阅操作选择节点的模式。 可用值为: SLAVE - 只在从服务节点里订阅。 MASTER - 只在主服务节点里订阅。

redisson.multiple-server-config.subscriptionConnectionMinimumIdleSize

1

用于发布和订阅连接的最小保持连接数(长连接)。Redisson内部经常通过发布和订阅来实现许多功能。长期保持一定数量的发布订阅连接是必须的。 redisson.multiple-server-config.subscriptionConnectionPoolSize

redisson.multiple-server-config.dnsMonitoringInterval

5000

监测DNS的变化情况的时间间隔。

redisson.multiple-server-config.scanInterval

1000

(集群,哨兵,云托管模特特有) 对Redis集群节点状态扫描的时间间隔。单位是毫秒。

redisson.multiple-server-config.database

0

(哨兵模式,云托管,主从模式特有)尝试连接的数据库编号。

redisson.multiple-server-config.masterName

(哨兵模式特有)主服务器的名称是哨兵进程中用来监测主从服务切换情况的。

多redis源配置

以multiple.redisson为前缀,sources为多源,以key/value配置,value与上面的配置一致(去掉redission)

例:

multiple.redisson.sources.test2.singleServerConfig.address=10.8.104.71:6379

multiple.redisson.sources.test2.threads=1

即ref=test2时使用上述配置

http://www.zhongyajixie.com/news/14554.html

相关文章:

  • 北京做网站公司哪家好2021拉新推广佣金排行榜
  • wordpress网页制作深圳关键词优化软件
  • 无锡网站制作8服装品牌营销策划方案
  • 网站模板如何使用 如何修改吗浏览器打开是2345网址导航
  • css里网站颜色营销网站建设选择原则
  • 酒店网站素材活动软文怎么写
  • 泉州网站建设seo推广教学
  • 鉴定手表网站网站优化查询代码
  • 金华专业做网站怎么投放网络广告
  • 网页制作工具中优化推广方案
  • 苏州建站公司优搜苏州聚尚网络网站和网页的区别
  • 辅助wordpress 页面编辑seo北京公司
  • 焦作会计做继续教育在哪个网站谷歌seo查询
  • 做网站 备案sem推广软件
  • 公司宣传单页模板seo职位要求
  • 湘潭整站优化网络推广费用高吗
  • 备案空壳网站什么是seo?
  • 个人网站类型网络营销效果评估
  • 福州高端网站建设服务网络公司seo独立站
  • 政治工作网站管理建设央视新闻
  • 有没有接单做加工的网站小学生班级优化大师
  • 深圳外贸营销型网站建设长沙靠谱的关键词优化
  • 大连能做网站的公司有seo技术培训唐山
  • 网站开发设计工程师职责简介阿里巴巴指数查询
  • 重庆网站策划网站优化排名
  • 用狐狸做logo的网站网站页面关键词优化
  • wordpress朗读句子插件百度网站优化排名
  • 北京公司建设网站2021最火关键词
  • 江北网站建设价格网络营销的概念
  • 简书 wordpress深圳高端seo外包公司