首页 > 数据库 >redis保存AtomicInteger对象踩坑及解决详解

redis保存AtomicInteger对象踩坑及解决详解

时间:2022-12-27 10:01:45浏览次数:45  
标签:java thread redis AtomicInteger 详解 RedisAtomicInteger redisTemplate

这篇文章主要介绍了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 redisTemplate;

解决方案

去除泛型:

@Autowired
private RedisTemplate redisTemplate;

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

RedisAtomicInteger的使用

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

以及保证顺序生成数字。

@Resource
RedisTemplate 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


标签:java,thread,redis,AtomicInteger,详解,RedisAtomicInteger,redisTemplate
From: https://blog.51cto.com/u_12148962/5971344

相关文章

  • redis template spring设置
    springboot默认提供了StringRedisTemplate工具类。key和value全部以String的方式进行序列化。ObjectMapper是jackJson的一个工具类。<dependency><groupId>com.......
  • 详解如何进入、退出docker容器的方法
    参考地址:https://blog.csdn.net/qq_46416934/article/details/1244909781启动docker服务首先需要知道启动docker服务是:servicedockerstart或者:systemctlstartdoc......
  • map.computeIfAbsent() 详解(转载)
    转载地址:https://blog.csdn.net/qq_42815754/article/details/104798709https://blog.csdn.net/manqishizhizhu/article/details/124110851......
  • EnvoyFilter详解
     欢迎关注我的公众号: 目前刚开始写一个月,一共写了18篇原创文章,文章目录如下:​​istio多集群探秘,部署了50次多集群后我得出的结论​​​​istio多集群链路追踪,附实操视频​......
  • 局域网大文件上传详解及实例代码
    ​ 最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。在某些业务中,大文件上传是一个比较重要的......
  • 本地开发环境使用redis
    1.使用cmd连接后,查询结果出现乱码时,尝试连接时加--raw参数2.如果还是乱码,设置cmd窗口编码 chcp65001就是换成UTF-8代码页chcp936可以换回默认的GBKchcp437是......
  • redis 5 命令大全
    从网站迁移过来,格式有些问题get获取redis键的值getkeyLaravel: $result=Redis::get("key");set  设置redis键的值setkeyvalue更多用法:exseconds ......
  • k8s运行redis
    redis-persistentvolume.yaml---apiVersion:v1kind:PersistentVolumemetadata:name:redis-datadir-pv-1namespace:wgs-redisspec:capacity:storage......
  • Redis--数据结构--命令汇总
    Redis--数据结构--命令汇总​​1.String​​​​2.Hash​​​​3.List​​​​4.Set​​​​5.SortedSet​​​​6.其他​​​​6.1获取全部的key​​​​6.2key是......
  • 内网大文件上传详解及实例代码
    ​ 前言文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好......