上一步我们做的秒杀虽然在操作上没问题,

但性能上能有很大的提升空间。

我们可以先把秒杀数据加载到内存中,考虑到以后服务集群化,

所以加载的数据不存放在JVM中,而存在放redis

首先,我们都知道,redis在数据存取方面远远大于mysql

所以我们第一步优化是:可以将秒杀数据加载至REDIS中,

然后我们在查询数据的时候,优先从redis里查找。

注意:这里redis和MySQL最好在同一个网端,不然,测试出来的效果不一样

因为不同的网端网络消耗是有很大差别的

1,配置REDIS,并配置redis缓存和设置序列化。相关代码和类

spring:redis:host: 127.0.0.1port: 6379database: 0lettuce:pool:# 最大活跃链接数 默认8max-active: 20# 最大空闲连接数 默认8max-idle: 20# 最小空闲连接数 默认0min-idle: 5
import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;@Configuration
//开启缓存
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{/*** @param redisConnectionFactory* @return*/@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 使用Jackson2JsonRedisSerialize 替换默认序列化Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);// 设置value的序列化规则和 key的序列化规则redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}/*** 这里主要配置redis缓存的序列化,注意和* @return*/@Beanpublic RedisCacheConfiguration redisCacheConfiguration(){FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofDays(1));return configuration;}
}
/*** 必须重写序列化器,放弃用jackjson来做value的序列化,使用FastJson来做。* 重写一些序列化器,并实现RedisSerializer接口*/
public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");private Class<T> clazz;public FastJsonRedisSerializer(Class<T> clazz) {super();this.clazz = clazz;}@Overridepublic byte[] serialize(T t) throws SerializationException {if (t == null) {return new byte[0];}return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);}@Overridepublic T deserialize(byte[] bytes) throws SerializationException {if (bytes == null || bytes.length <= 0) {return null;}String str = new String(bytes, DEFAULT_CHARSET);return (T) JSON.parseObject(str, clazz);}
}

第二步,启动预热数据至redis(可选)

@Component
@Slf4j
public class InitredisData implements CommandLineRunner {@Autowiredprivate ProductService productService;@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Overridepublic void run(String... args) throws Exception {log.info("预热redis数据");initRedis();}/*** 预热秒杀数据到redis*/public void initRedis(){List<JSONObject> list= productService.select();Map<String,JSONObject> map = new ConcurrentHashMap<String,JSONObject>();list.stream().forEach(jsonObject -> {System.out.println(jsonObject.toJSONString());redisTemplate.opsForValue().set("productcache::"+jsonObject.getString("seckillId"),jsonObject);});}
}

第三步,在查询商品的接口上加缓存配置

@Cacheable(value = "productcache", key = "#p0")public JSONObject findById(String seckillId){return  productDao.findById(seckillId);}

启动之后,redis会加载数据库的秒杀数据

OK,这个就是我们2.0版本的优化版,我们还是用上次的jmeter来压测一下

查询的QPS为245   秒杀的QPS为208,比之前调高了好几倍。

下一节继续优化。

springboot 秒杀系统(二)redis相关推荐

  1. 秒杀系统(二)——商品模块展示技术难点

    秒杀系统--商品模块展示技术难点 商品详情页 商品详情页是展示商品详细信息的一个页面,承载在网站的大部分流量和订单的入口.京东商城目前有通用版.全球购.闪购.易车.惠买车.服装.拼购.今日抄底等许多套 ...

  2. SpringBoot + 秒杀系统

    本书源码 https://github.com/huangwenyi10/spring-boot-book-v2 目录 创建 秒杀系统 雏形 小结 详情 高并发优化 流量削峰 创建 解决 Cannot ...

  3. SpringBoot秒杀系统

    秒杀系统库存 今天带来一套秒杀库存扣减 涉及到单体架构和集群架构 希望能给你们带来帮助 我也不想学 但是bgs不教 首先讲一下大致的扣减库存的思路 @RequestMapping("dedu ...

  4. springboot 秒杀系统(一)

    秒杀系统应该是很检验一个人的能力的项目.包括从前端 到运营商到nginx到后端等等,很多地方可以优化. 前端的页面控制,运营商的CDN加速,nginx的动静分离等 下面我来一步一步实现后端的秒杀功能的 ...

  5. Springboot秒杀系统(乐观锁+RateLimiter令牌+Redis缓存)

    本文主要是利用springboot,实现一个单机版秒杀demo,通过单机版实现,可以对基本并发秒杀的知识有一定的了解. 首先先提供秒杀业务实现类: /*** spring 注解加在实现类*/ @Ser ...

  6. redis分布式锁及秒杀系统实战

    本文分为两部分: 一.介绍redis分布式锁的原理和使用方法: 二.使用redis分布式锁实现一个简单的秒杀系统. 注意:本文使用java1.8,最后的例子为springboot项目. 目录 redi ...

  7. 【秒杀系统】从零开始打造简易秒杀系统(一):防止超卖

    前言 大家好,好久不发文章了.(快一个月了- -)最近有很多学习的新知识想和大家分享,但无奈最近项目蛮忙的,很多文章写了一半搁置在了笔记里,待以后慢慢补充发布. 本文主要是通过实际代码讲解,帮助你一步 ...

  8. java 超卖_Java生鲜电商平台-秒杀系统如何防止超买与超卖?(小程序/APP)

    本文主要是通过实际代码讲解,帮助你一步步搭建一个简易的秒杀系统.从而快速的了解生鲜电商秒杀系统的主要难点,并且迅速上手实际项目. 我对生鲜电商秒杀系统文章的规划: 从零开始打造简易秒杀系统:乐观锁防止 ...

  9. 秒杀系统如何防止超卖?

    前言 本文主要是通过实际代码讲解,帮助你一步步搭建一个简易的秒杀系统.从而快速的了解秒杀系统的主要难点,并且迅速上手实际项目. 我对秒杀系统文章的规划: 从零开始打造简易秒杀系统:乐观锁防止超卖 从零 ...

最新文章

  1. Lesson 7 (3) 深入理解PyTorch与PyTorch库架构
  2. 利用Fiddler模拟通过Dynamics 365的OAuth 2 Client Credentials认证后调用Web API
  3. 文献记录(part79)--光学影像序列中基于多视角聚类的群组行为分析
  4. SAP CRM One Order 根据联系人姓名搜索的实现原理
  5. 适用于Java开发人员的Elasticsearch教程
  6. java之歌_程序员之歌
  7. 2016年6月 之 《设计模式》
  8. xcode mysql库_Mac+MySQL+Xcode数据库配置
  9. 武田宣布美国FDA授予ALUNBRIG® (brigatinib)作为ALK+转移性非小细胞肺癌一线治疗的补充新药申请优先审理
  10. Office2016下Excel饼图和Visio饼图绘制的几个小技巧(饼图分离、颜色逐块编辑、扇形区起始角度指定等)
  11. Android 10.0在电话拨号盘(Dialer app中)通过暗码进入工厂测试模式
  12. STM32笔记-FM收音机
  13. MATLAB强化学习工具箱(十一)训练DDPG智能体控制飞行机器人
  14. 电子印章结构以及规范讲解
  15. 在MySQL中insert时生成UUID
  16. Qt源码分析--QImage(1)
  17. 黑马程序员--C# 定义全班学生成绩类
  18. 如何在实验室服务器上跑代码
  19. flutter 升级androidX的坑记录
  20. 计算机的未来发展趋势

热门文章

  1. 快手坐拥3亿用户,想成为平行世界里的Snapchat,然后呢
  2. mysql事物sql语句死锁,定时任务启动失败Lock wait timeout exceeded;try restarting transaction
  3. 笨鸟的生活(小白的学习日常)
  4. 软件项目管理【期末模拟卷】
  5. 中国联通联合openGauss开源社区启动数据库自主创新
  6. 死并不可怕,可怕的是华丽地去死
  7. 2020张宇1000题【好题收集】【第九章:级数】
  8. OpenStack物理资源虚拟化比率设置
  9. 中间件是什么?Linux常用中间件都有哪些?
  10. pd.DataFrame.melt()函数