高并发秒杀——SpringBoot集成redis
shop--13.升级--Redis缓存技术
集成Redis
1.添加Jedis依赖
2.添加Fastjson依赖
1.安装redis http://www.runoob.com/redis/redis-install.html
1.引入redis依赖
<!--redis客户端:jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.41</version></dependency><!--配置springBootConfiguration, 可以使用@ConfigurationProperties(prefix = "redis")--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>
2.在application.properties加入redis配置文件
redis.host=127.0.0.1
redis.port=6379
redis.timeout=3
redis.pool.MaxTotal=10
redis.database=0
redis.pool.maxActive=100
redis.pool.maxIdle=20
redis.pool.maxWait=3
redis.pool.testOnBorrow=true
3. 定义redis的类,引入redis配置
@Component
@ConfigurationProperties(prefix = "redis")
public class RedisConfig {private String host;private int port;private int timeout;private int poolMaxTotal;private int poolMaxIdle;private int poolMaxWait;public String getHost() {return host;}public void setHost(String host) {this.host = host;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}public int getTimeout() {return timeout;}public void setTimeout(int timeout) {this.timeout = timeout;}public int getPoolMaxTotal() {return poolMaxTotal;}public void setPoolMaxTotal(int poolMaxTotal) {this.poolMaxTotal = poolMaxTotal;}public int getPoolMaxIdle() {return poolMaxIdle;}public void setPoolMaxIdle(int poolMaxIdle) {this.poolMaxIdle = poolMaxIdle;}public int getPoolMaxWait() {return poolMaxWait;}public void setPoolMaxWait(int poolMaxWait) {this.poolMaxWait = poolMaxWait;}
}
4.RedisPoolFactory类
@Service
public class RedisPoolFactory {@AutowiredRedisConfig redisConfig;@Beanpublic JedisPool JedisPoolFactory(){JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxIdle(redisConfig.getPoolMaxIdle());jedisPoolConfig.setMaxTotal(redisConfig.getPoolMaxTotal());jedisPoolConfig.setMaxWaitMillis(redisConfig.getPoolMaxWait() * 1000);JedisPool jedisPool = new JedisPool(jedisPoolConfig, redisConfig.getHost(),redisConfig.getPort(), redisConfig.getTimeout() * 1000);return jedisPool;}
}
5.编写RedisService类
@Service
public class RedisRervice {@AutowiredJedisPool jedisPool;/*** h获取单个对象* @param prefix* @param key* @param clazz* @param <T>* @return*/public <T> T get(KeyPrefix prefix, String key, Class<T> clazz){Jedis jedis = null;try{jedis = jedisPool.getResource();//生成真正的keyString realKey = prefix.getKeyPrefix() + key;String str = jedis.get(realKey);T t = stringToBean(str, clazz);return t;}finally {jedis.close();}}/*** 设置缓存值* @param prefix* @param key* @param value* @param <T>* @return*/public <T> boolean set(KeyPrefix prefix, String key, T value){Jedis jedis = null;try{jedis = jedisPool.getResource();String str = beanToString(value);if(str == null || str.length() <= 0){return false;}//生成真正的keyString realKey = prefix.getKeyPrefix() + key;int second = prefix.expireSeconds();if(second <= 0){jedis.set(realKey, str);}else{jedis.setex(realKey, second, str);}jedis.set(realKey, str);return true;} finally {jedis.close();}}private <T> String beanToString(T value) {if(value == null){return null;}Class<?> clazz = value.getClass();if(clazz == int.class || clazz == Integer.class){return "" + value;}else if(clazz == String.class){return (String) value;} else if(clazz == long.class || clazz == Long.class){return "" + value;}else{return JSON.toJSONString(value);}}private <T> T stringToBean(String str, Class<T> clazz) {if (str == null || str.length() <= 0 || clazz == null) {return null;}if (clazz == int.class || clazz == Integer.class) {return (T) Integer.valueOf(str);} else if (clazz == String.class) {return (T) str;} else if (clazz == long.class || clazz == Long.class) {return (T) Long.valueOf(str);} else {return JSON.toJavaObject(JSON.parseObject(str), clazz);}}/*** 判断是否存在* @param prefix* @param key* @param <T>* @return*/public <T> boolean exits(KeyPrefix prefix, String key){Jedis jedis = null;try{jedis = jedisPool.getResource();String realKey = prefix.getKeyPrefix() + key;return jedis.exists(realKey);} finally {jedis.close();}}/*** 增加值* @param prefix* @param key* @param <T>* @return*/public <T> Long incr(KeyPrefix prefix, String key){Jedis jedis = null;try{jedis = jedisPool.getResource();String realKey = prefix.getKeyPrefix() + key;return jedis.incr(realKey);} finally {jedis.close();}}/*** 减少值* @param prefix* @param key* @param <T>* @return*/public <T> Long decr(KeyPrefix prefix, String key){Jedis jedis = null;try{jedis = jedisPool.getResource();String realKey = prefix.getKeyPrefix() + key;return jedis.decr(realKey);} finally {jedis.close();}}
}
6.controller中测试
@AutowiredRedisService redisService;@RequestMapping(value = "/redis/set", method = RequestMethod.GET)@ResponseBodypublic boolean redisSet(){boolean value = redisService.set("key2", "redis");return value;}@RequestMapping(value = "/redis/get", method = RequestMethod.GET)@ResponseBodypublic Object redisGet(){String l = redisService.get("key2", String.class);return l;}
使用一个前缀来区分key
public interface KeyPrefix {int expireSeconds();String getKeyPrefix();
}
KeyPrefix
public abstract class BasePrefix implements KeyPrefix {private int expireSeconds;private String keyPrefix;public BasePrefix(String keyPrefix) {this(0, keyPrefix);}public BasePrefix(int expireSeconds, String keyPrefix) {this.expireSeconds = expireSeconds;this.keyPrefix = keyPrefix;}//默认 0 代表永不过期@Overridepublic int expireSeconds() {return expireSeconds;}//不同的类对应不同的prefix@Overridepublic String getKeyPrefix() {String className = getClass().getSimpleName();return className + ": " + keyPrefix;}
}
转载于:https://www.cnblogs.com/SkyeAngel/p/9204721.html
高并发秒杀——SpringBoot集成redis相关推荐
- Java高并发秒杀平台(Redis + RabbitMQ)
Seconds-Kill 本项目是一个模拟高并发环境下基于 SpringBoot 的秒杀购物平台.为了减少对数据库的直接访问,通过 Redis 实现了缓存优化:并通过 RabbitMQ 消息中间件来接 ...
- 【在线网课】Java高性能高并发秒杀系统方案优化实战
java教程视频讲座简介: Java高性能高并发秒杀系统方案优化实战 Java秒杀系统方案优化 高性能高并发实战 以"秒杀"这一Java高性能高并发的试金石场景为例,带你通过一系列 ...
- SpringBoot、Redis轻松实现Java高并发秒杀系统笔记
秒杀项目 优极限[完整项目实战]半天带你用SpringBoot.Redis轻松实现Java高并发秒杀系统 文章目录 秒杀项目 技术栈 课程介绍 学习目标 如何设计一个秒杀系统 项目搭建 分布式会话 登 ...
- SpringBoot实现Java高并发秒杀系统之DAO层开发(一)
SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...
- SpringBoot实现Java高并发秒杀系统之Service层开发(二)
继上一篇文章:SpringBoot实现Java高并发秒杀系统之DAO层开发 我们创建了SpringBoot项目并熟悉了秒杀系统的表设计,下面我们将讲解一下秒杀系统的核心部分:Service业务层的开发 ...
- Redis之实现优惠券高并发秒杀下单
Redis之实现优惠券高并发秒杀下单 实现逻辑如图: 此方法高并发情况下会出现超库存的问题,可使用乐观锁解决,乐观锁使用场景是更新的时候 一:解决乐观锁方法一:加版本号,如图所示: 二:使用CAS法解 ...
- 高并发秒杀系统方案的优化
最近接触了一个关于高并发秒杀的项目,在这里稍微整理一下关于这个项目的一些值得记录的一些点,以下是源码地址:github 高并发项目的瓶颈主要在于数据库访问次数上,访问次数越多,对数据库压力也就越大,因 ...
- redis 依赖_springboot|springboot集成redis缓存
javaDEMO 本网站记录了最全的各种JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring的, Mybatis的等等各种,助力你从菜鸟到大牛,记得收藏哦~~https: ...
- SpringBoot集成Redis缓存
SpringBoot集成Redis缓存 前言 本系列文章将简单的学习SpringCloud微服务相关知识,其实也是因为时间的原因,一直拖到现在,遂打算趁着假期,决定记录下来. 从天气预报微服务系统的单 ...
最新文章
- Java培训深度学习都要学什么
- Java集合TreeMap
- 变化的和不变的。。。(2004版)
- 两个分数化简比怎么化_我学《分数的意义》心得
- 如何将JBoss HR员工奖励项目放入云端
- dotNet中初始化器的使用
- ​【文末有福利】为何美国的科研既能得诺贝尔奖,又能产生高科技产品?
- Nifi 之 kafka消费存入hbase
- Android Studio 修改包名 com.example.calculator-----gt;com.melon.calculator
- ccf——201903-4 消息传递接口
- (Origin教程)在图片和表格中插入Latex公式
- [Effective C++系列]-为多态基类声明Virtual析构函数
- EOS 钱包开发(JAVA)
- Android基础入门教程——9.2 MediaPlayer播放音频与视频
- 产品人的归宿 · 之 · 创业维艰
- stm32定时器的ETR、CH1N、CH2N、CH3N
- php 月初时间,php 月初,月末时间大统计
- 通达oa2015 php解密,通达OA /interface/auth.php SQL注入
- Python漫画爬虫开源 66漫画 AJAX,包含数据库连接,图片下载处理
- AList和RaiDrive对百度网盘进行本地挂载(可上传下载)
热门文章
- 1.4编程基础之逻辑表达式与条件分支 12 骑车与走路
- fastadmin在html中查询数据,FastAdmin模块开发快速上手
- Java笔记-对称加密AES的使用
- Qt文档阅读笔记-Semaphores Example解析(信号量并发实例)
- Qt工作笔记-重写滚轮事件,实现界面的增加、减少(放大、缩小)
- 编码风格工作笔记-初步模仿大佬编码风格
- Java高级语法笔记-模板类
- 最全的BAT Google等团队技术博客集合
- html5和极速模式,浅谈360浏览器6.0版本极速模式与兼容模式_蓝戒的博客
- php提交raw_PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析