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)
跟蹤源碼發(fā)現(xiàn)其執(zhí)行的是 StringRedisSerializer 的實現(xiàn),serialize默認(rèn)接收的參數(shù)類型為String 從而拋出以上異常
經(jīng)過檢查,發(fā)現(xiàn)是RedisTemplate泛型惹的禍:
@Autowired private RedisTemplate<String, String> redisTemplate;
解決方案
去除泛型:
@Autowired private RedisTemplate redisTemplate;
運行服務(wù)再次跟蹤源碼,執(zhí)行的是 DefaultValueOperations 的實現(xiàn),問題解決
RedisAtomicInteger的使用
RedisAtomicInteger 從名字上來說就是 redis 的原子Integer 數(shù)據(jù)類型,由于其原子性,可用于秒殺活動物品數(shù)量的控制。
以及保證順序生成數(shù)字。
@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);
// 創(chuàng)建 100 個線程 并發(fā)執(zhí)行 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);
}
});
}
}結(jié)果
.
.
.
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
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
redis哈希類型_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了redis哈希類型的常用方法及原理淺析,感興趣的朋友一起看看吧2017-08-08
Centos7.3安裝Redis4.0.6詳細(xì)圖文教程
這篇文章主要介紹了Centos7.3安裝Redis4.0.6詳細(xì)教程圖解,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2018-10-10
淺析Redis Sentinel 與 Redis Cluster
本文主要介紹Redis Sentinel 及 Redis Cluster的區(qū)別及用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
使用Redis命令操作數(shù)據(jù)庫的常見錯誤及解決方法
由于Redis是內(nèi)存數(shù)據(jù)庫,因此可能會存在一些安全問題,下面這篇文章主要給大家介紹了關(guān)于使用Redis命令操作數(shù)據(jù)庫的常見錯誤及解決方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02

