🍰 个人主页:__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(() -> {// 配额码原子变量值增加,每次增加1for (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);// 应该输出 100assertEquals(1000L, finalCount);long endtime = System.currentTimeMillis();System.out.println("开始时间:" + start);System.out.println("结束时间:" + endtime);System.out.println("间隔:" + (endtime - start) + "毫秒");
}