本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
redis保存AtomicInteger对象踩坑及解决
一路向西 · 150浏览 · 发布于2022-11-23 +关注

这篇文章主要介绍了redis保存AtomicInteger对象踩坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


redis保存AtomicInteger对象踩坑

redisTemplate 保存AtomicInteger对象异常:

java.lang.ClassCastException: java.util.concurrent.atomic.AtomicInteger cannot be cast
 to java.lang.String
    at org.springframework.data.redis.serializer.StringRedisSerializer.serialize
    (StringRedisSerializer.java:36)
    at org.springframework.data.redis.core.AbstractOperations.rawValue
    (AbstractOperations.java:127)
    at org.springframework.data.redis.core.DefaultValueOperations.set
    (DefaultValueOperations.java:235)
    at com.quan.starter.service.impl.RedisServiceImpl.set(RedisServiceImpl.java:139)


跟踪源码发现其执行的是 StringRedisSerializer 的实现,serialize默认接收的参数类型为String 从而抛出以上异常

经过检查,发现是RedisTemplate泛型惹的祸:

@Autowired
private RedisTemplate<String, String> redisTemplate;

解决方案

去除泛型:

@Autowired
private RedisTemplate redisTemplate;

运行服务再次跟踪源码,执行的是 DefaultValueOperations 的实现,问题解决

RedisAtomicInteger的使用

RedisAtomicInteger 从名字上来说就是 redis 的原子Integer 数据类型,由于其原子性,可用于秒杀活动物品数量的控制。

以及保证顺序生成数字。

@Resource
  RedisTemplate<String, Object> redisTemplate;
    /**
   * RedisAtomicInteger
   *
   * @throws Exception 异常
   */
  @Test
  public void testTransaction1() throws Exception {
      RedisAtomicInteger redisCount = new RedisAtomicInteger("key1", 
      this.redisTemplate.getConnectionFactory());
      redisCount.set(0);
      // 创建 100 个线程 并发执行  increment 操作
      ExecutorService pool = Executors.newFixedThreadPool(10);
      for (int i = 0; i < 100; i++) {
          pool.submit(() -> {
              // 配额码原子变量值增加,每次增加1
              for (int j = 0; j < 100; j++) {
                  int count = redisCount.incrementAndGet();
                  log.info(Thread.currentThread().getName() + ": " + count);
              }
          });
      }
  }

结果

.
.
.
pool-2-thread-90: 9989
pool-2-thread-61: 9987
pool-2-thread-3: 9986
pool-2-thread-12: 9990
pool-2-thread-25: 9991
pool-2-thread-90: 9992
pool-2-thread-12: 9994
pool-2-thread-61: 9993
pool-2-thread-25: 9995
pool-2-thread-61: 10000
pool-2-thread-12: 9996
pool-2-thread-61: 9997
pool-2-thread-25: 9998
pool-2-thread-12: 9999


相关推荐

使用SELECT语句检索数据

奔跑的男人 · 804浏览 · 2019-06-03 09:33:43
部署MySQL延迟从库的几个好处

吴振华 · 663浏览 · 2019-05-14 21:57:51
MongoDB凭什么跻身数据库排行前五?

iamitnan · 723浏览 · 2019-06-18 10:04:56
Oracle开启和关闭的几种模式

qq2360248666 · 751浏览 · 2019-06-04 10:18:47
加载中

0评论

评论
欢迎大家关注我,有技术问题可以一起交流探讨!
分类专栏
小鸟云服务器
扫码进入手机网页