redis保存AtomicInteger对象踩坑及解决

 更新时间:2022年11月22日 17:19:40   作者:夜月如水  
这篇文章主要介绍了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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis持久化AOF示例详解

    Redis持久化AOF示例详解

    AOF(Append-Only File)用于将Redis服务器收到的写操作追加到日志文件,通过该机制可以保证服务器重启后依然可以依靠日志文件恢复数据,这篇文章主要介绍了Redis持久化AOF详解,需要的朋友可以参考下
    2023-12-12
  • 详解redis是如何实现队列消息的ack

    详解redis是如何实现队列消息的ack

    这篇文章主要介绍了关于redis是如何实现队列消息的ack的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • redis键空间通知使用实现

    redis键空间通知使用实现

    这篇文章主要介绍了redis键空间通知使用实现
    2021-08-08
  • 使用Redis命令操作数据库的常见错误及解决方法

    使用Redis命令操作数据库的常见错误及解决方法

    由于Redis是内存数据库,因此可能会存在一些安全问题,下面这篇文章主要给大家介绍了关于使用Redis命令操作数据库的常见错误及解决方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • Redis中键和数据库通用指令详解

    Redis中键和数据库通用指令详解

    这篇文章主要为大家介绍了Redis中键和数据库通用指令基本操作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Redis实现数据的交集、并集、补集的示例

    Redis实现数据的交集、并集、补集的示例

    本文主要介绍了Redis实现数据的交集、并集、补集的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Redis基本数据类型List常用操作命令

    Redis基本数据类型List常用操作命令

    这篇文章主要为大家介绍了Redis数据类型List常用命令操作,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 基于redis实现分布式锁的原理与方法

    基于redis实现分布式锁的原理与方法

    这篇文章主要给大家介绍了基于redis实现分布式锁的原理与方法,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • Redis源码解析:集群手动故障转移、从节点迁移详解

    Redis源码解析:集群手动故障转移、从节点迁移详解

    这篇文章主要介绍了Redis源码解析:集群手动故障转移、从节点迁移的相关内容,涉及通过集群定时器函数clusterCron实现从节点迁移等知识,具有一定参考价值,需要的朋友可以了解。
    2017-10-10
  • redis缓存穿透解决方法

    redis缓存穿透解决方法

    在本篇文章里小编给大家分享了关于redis缓存穿透的解决方法以及相关实例内容,需要的朋友们学习下。
    2019-06-06

最新评论