Java电商秒杀系统性能优化(四)——查询优化缓存之多级优化-接触高性能缓存方案

本文探讨了电商系统中商品详情页的性能优化,通过引入Redis集中式缓存、本地Guava Cache和Nginx Lua缓存实现多级缓存策略。详细介绍了Redis Sentinel和Cluster模式,以及Guava Cache的实现与性能验证,最后分析了Nginx Lua的协程机制和在缓存中的应用。
摘要由CSDN通过智能技术生成


概览

本章的核心目标是优化商品详情页对应的动态请求的性能。通过多级缓存:redisguava cachenginx lua缓存实现了一套削峰的多级缓存方案,优雅的依靠不同的热点分类使用不同类型的多级缓存并设置不同的失效策略,解决动态请求的性能问题。

1、缓存设计原则

  • 能够使用快速存取的设备,一般采用内存作为缓存设计的基本设备(内存具备快速存取,速度是磁盘的几千倍,弊端:断电即丢失);
  • 采用分布式就能扩展对应的节点,缓存离用户越近,用户访问数据走的链路就越少,查询效率就越高;
  • 脏缓存清理,缓存具有丢失性。如果缓存不更新到磁盘上,不能算是更新成功,因此关键的数据一定要存储在不能丢失的设备上,一旦数据库中的数据发生了变更,那么缓存中的数据都变成了脏数据,例如一个商品的变价;

2、多级缓存方案

  • redis缓存,有集中式管理缓存的特点;
  • 热点内存本地缓存
  • nginx proxy cache缓存
  • nginx lua缓存

一、Redis集中式缓存

redis是缓存的数据库中间件,对应的是一个NoSQL数据库,仅仅支持key-value的方式来进行不同的数据结构之间的访问操作。redis可以配置将数据刷新到磁盘地一些策略。架构图如下图所示:
架构图

1.1 Redis sentinal哨兵模式

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这种方式不可取,因此需要采用sentinal哨兵模式

Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel哨兵模式已经被集成在redis2.4之后的版本中。sentinel是redis高可用的解决方案,sentinel系统可以监视一个或者多个redis master服务,以及这些master服务的所有从服务;当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。

sentinel可以让redis实现主从复制,当一个集群中的master失效之后,sentinel可以选举出一个新的master用于自动接替master的工作,集群中的其他redis服务器自动指向新的master同步数据。一般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换。结构图如下所示:
哨兵模式
Sentinel作用:
1)Master状态检测
2)如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave。
3)Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。

Redis Sentinel的主从切换方案
Redis 2.8版开始正式提供名为Sentinel的主从切换方案,通俗的来讲,Sentinel可以用来管理多个Redis服务器实例,可以实现一个功能上实现HA的集群,Sentinel主要负责三个方面的任务:
1)监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
2)提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
3)自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

1.2 Redis cluster模式

一般情况下,使用主从模式加Sentinal监控就可以满足基本需求了,但是当数据量过大一个主机放不下的时候,就需要对数据进行分区,将key按照一定的规则进行计算,并将key对应的value分配到指定的Redis实例上,这样的模式简称Redis集群。

Redis集群提供了以下两个好处:

  • 将数据自动切分split到多个节点的能力。
  • 当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力
    redis架构图
  • 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;
  • 节点的fail是通过集群中超过半数的节点检测失效时才生效;
  • 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;
  • redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value;

Redis集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

投票
投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时**(cluster-node-timeout)**,认为当前master节点挂掉。

什么时候整个集群不可用(cluster_state:fail)?

1、如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态.。

	redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

2、如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态

1.3 Redis集中式缓存商品详情页接入

进行相关的redis的配置

打开ItemController

@Autowired
private RedisTemplate redistemplate;//封装了所有对于redis的key-value操作;

//商品详情页浏览
@RequestMapping(value 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值