版权声明:请说明出处 https://blog.csdn.net/wah198703/article/details/80453339
1、使用@Async 注解 ,使用spring 异步处理方法(https://blog.csdn.net/hry2015/article/details/67640534)
2、使用@Qualifier(用哪个),多个实例实现了一个接口,在注入的时候告诉spring用哪个
(https://www.cnblogs.com/smileLuckBoy/p/5801678.html)
3、幂等性,就是多次操作,结果都一样。
比如,读取一个文件,1次和10次,读出来的内容应该是一样的。
4、RestTemplate,简单来说就是,spring的一个操作rest风格的工具类,get,post,put,delete 随便选择
5、AtomicInteger
6、使用了静态代码块,静态代码块,会在加载类的时候就将静态代码块的内容加载到内存中。
7、使用了Map来做单例模式,抽象工厂模式
public class SendPrizeStrategyFactory {
private static Map<Integer, SendPrizeStrategy> sendPrizeStrategyMap = Maps.newHashMap();//这里定义一个空的Map
static {
ApplicationContext applicationContext = ApplicationContextHolder.context; //使用团贷网封装好的工具
SendPrizeStrategy baoxiangSendPrizeStrategy = applicationContext.getBean(TuanBaoxiangSendPrizeStrategy.class);//获取实例,cglib实现原理,动态代理
TuanBiSendPrizeStrategy tuanBiSendPrizeStrategy = applicationContext.getBean(TuanBiSendPrizeStrategy.class);
SendPrizeStrategy ticketSendPrizeStrategy = applicationContext.getBean(TicketSendPrizeStrategy.class);
// 红包、实物类奖品使用 团宝箱服务发送奖品
sendPrizeStrategyMap.put(PrizesTypeId.RED_BONUSES_TYPE_ID, baoxiangSendPrizeStrategy);// 用Map装入实例
sendPrizeStrategyMap.put(PrizesTypeId.MATERIAL_GITF, baoxiangSendPrizeStrategy);
// 团币奖品使用 团币服务发送奖品
sendPrizeStrategyMap.put(PrizesTypeId.TUANBI_TYPE_ID, tuanBiSendPrizeStrategy);
// 抽奖券使用,补偿抽奖券
sendPrizeStrategyMap.put(PrizesTypeId.CARDS_TYPE_ID, ticketSendPrizeStrategy);
}
private SendPrizeStrategyFactory() {
}
public static void addSendPrizeStrategy(Integer prizesTypeId, SendPrizeStrategy sendPrizeStrategy) {
if (!sendPrizeStrategyMap.containsKey(prizesTypeId)) {
sendPrizeStrategyMap.put(prizesTypeId, sendPrizeStrategy);
}
}
public static SendPrizeStrategy findStrategy(Integer prizesTypeId) {
SendPrizeStrategy sendPrizeStrategy = sendPrizeStrategyMap.get(prizesTypeId);
if (sendPrizeStrategy != null) {
return sendPrizeStrategy; //获取实例
}
throw new AppBusinessException(Activity518ErrorCode.SEND_PRIZE_STRATEGY_NOT_FOUND);
}
}
8、多次使用String.format(%sAAAA%s) ,来拼接字符串,这样性能会高些吗?
9、多次使用策略模式,先定义一个抽象类,在这个抽象类里面写一些公用方法。新创建的类就继承这个抽象类,并重写抽象方法。这样可以用调用不同的类,使用不同的方法。(这样做法,在功能上来说,和switch的功能差不多,只是把case的内容放到一个类里面去了,当然用继承的方法去做的话,在别人看你的代码的时候就显得更加高大上些,但是本质还是一样的事情)
10、使用过了分布式锁,目的,防止用户多次提交。
// 获取分布式锁
boolean isLock = jedisService.tryGetDistributedLock(coinLockKey, requestId, 100);
/**
* 尝试获取分布式锁
* @param lockKey 锁
* @param requestId 请求标识
* @param expireTime 超期时间
* @return 是否获取成功
*/
public boolean tryGetDistributedLock(String lockKey, String requestId, int expireTime) {
RedisConnection conn = jedisConnectionFactory.getConnection();
Jedis jedis = (Jedis) conn.getNativeConnection();
String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
conn.close();
if (LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
}
11、包装类就使用包装类的方法来进行比较数字
12、