🍰 个人主页:__Aurora__
🍞文章有不合理的地方请各位大佬指正。
🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️
RedisAtomicInteger
提供了对整数的原子性操作,确保在多客户端并发访问时数据操作的一致性和原子性。
在秒杀活动中,物品数量是有限的。通过使用 RedisAtomicInteger,可以确保在高并发下物品数量的正确扣减,从而防止超卖现象
测试案例
- newFixedThreadPool线程池创建10个线程
- 创建任务列表,每个任务操作redis,自增100次
- 执行任务后关闭线程池
- 记录操作时间
/**
* 测试 RedisAtomicInteger 多线程下 自增
* 10个线程 每个线程提交任务 每个任务修改100次RedisAtomicInteger 共执行1000次
*
* @throws ExecutionException
* @throws InterruptedException
*/
@Test
void redisAtomT1() throws ExecutionException, InterruptedException {
RedisAtomicInteger redisCount = new RedisAtomicInteger("key12345671", redisTemplate.getConnectionFactory(), 0);
// 创建 100 个线程 并发执行 increment 操作
long start = System.currentTimeMillis();
ExecutorService pool = Executors.newFixedThreadPool(10);
List<Future<?>> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Future<?> future = pool.submit(() -> {
// 配额码原子变量值增加,每次增加1
for (int j = 0; j < 100; j++) {
int count = redisCount.incrementAndGet();
System.out.println(Thread.currentThread().getName() + ": " + count);
}
});
futures.add(future);
}
// 将会阻塞主线程直到异步任务完成
// 等待所有任务完成
for (Future<?> future : futures) {
future.get();
}
// 关闭线程池
pool.shutdown();
// 检查Redis中的值
long finalCount = redisCount.get();
System.out.println("Final Redis count: " + finalCount);
// 应该输出 100
assertEquals(1000L, finalCount);
long endtime = System.currentTimeMillis();
System.out.println("开始时间:" + start);
System.out.println("结束时间:" + endtime);
System.out.println("间隔:" + (endtime - start) + "毫秒");
}