redis點贊數據存儲異常排查與解決方案
在使用redis存儲點贊數據時,常常會遇到類型轉換異常:Java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String。此異常通常發生在嘗試將Integer類型的點贊狀態代碼存儲到使用StringRedisSerializer序列化的Redis Hash結構中。
問題根源在于StringRedisSerializer僅能處理字符串類型數據。當程序試圖將Integer類型值存儲到使用該序列化器的Redis中時,就會發生類型轉換錯誤。
問題代碼示例:
以下代碼片段展示了RedisServiceImpl.java中的saveLiked2Redis方法,該方法嘗試將constant.REDIS_LIKE_CODE (Integer類型) 作為Redis Hash的value進行存儲。
RedisServiceImpl.java:
@Override public void saveLiked2Redis(String likeUserId, String likePostId, String likeAnswerId) { String key = RedisKeyUtils.getLikedKey(likeUserId, likePostId, likeAnswerId); redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED, key, constant.REDIS_LIKE_CODE); }
UserLike.java:
public class UserLike { private Integer id; //主鍵ID private String likeUserID; //點贊人ID private String likePostID; //被點贊文章ID private String likeAnswerID; //被點贊回答ID private Integer status = 0; //點贊狀態,0:未點贊,1:已點贊 // ... 省略構造方法 ... }
由于constant.REDIS_LIKE_CODE為Integer類型,而StringRedisSerializer要求value為string類型,因此導致類型不匹配。
解決方案:
為了解決此問題,最直接有效的方法是將constant.REDIS_LIKE_CODE的值定義為字符串常量。例如,將0改為”0″,將1改為”1″。 這避免了類型轉換,確保Redis能夠正確存儲點贊狀態信息,并且無需修改StringRedisSerializer,保持代碼簡潔性。
修改后的RedisServiceImpl.java (假設constant.REDIS_LIKE_CODE已修改為String類型):
@Override public void saveLiked2Redis(String likeUserId, String likePostId, String likeAnswerId) { String key = RedisKeyUtils.getLikedKey(likeUserId, likePostId, likeAnswerId); redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED, key, constant.REDIS_LIKE_CODE); }
通過這種簡單的修改,即可有效解決ClassCastException異常,確保Redis點贊數據的正確存儲。