Redis點贊數據存儲異常:Integer類型值如何正確存入StringRedisSerializer?

Redis點贊數據存儲異常:Integer類型值如何正確存入StringRedisSerializer?

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點贊數據的正確存儲。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享