Redis點贊數據存儲:Integer類型值導致類型轉換異常如何解決?

Redis點贊數據存儲:Integer類型值導致類型轉換異常如何解決?

redis數據存儲類型轉換異常排查與解決方案

在使用redis存儲點贊數據時,常常遇到類型轉換異常Java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String。此問題源于Redis模板的序列化機制與存儲數據的類型不匹配。

問題描述:

后端代碼將點贊用戶ID (likeUserID)、被點贊文章ID (likePostID) 和被點贊回答ID (likeAnswerID) 存儲到Redis。RedisServiceImpl.java 中的 saveLiked2Redis 方法接收三個 String 類型參數,并將其作為 key 的一部分,使用 redisTemplate.opsForHash().put 方法將點贊狀態碼 Constant.REDIS_LIKE_CODE 存儲為 value。然而,Constant.REDIS_LIKE_CODE 是 Integer 類型,而 Redis 模板的默認序列化器 StringRedisSerializer 期望 value 為 String 類型,導致類型轉換異常。

代碼片段:

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); }

RedisLikeController.java:

// 點贊 @RequiresAuthentication @RequestMapping("/userLike") public ResponseJson userLike(@RequestBody UserLike userLike) {     redisService.saveLiked2Redis(userLike.getLikeUserID(), userLike.getLikePostID(), userLike.getLikeAnswerID());     return new ResponseJson(Constant.HTTP_CODE_OK, null, "點贊成功"); }

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 0:未點贊 1:已點贊     //省略了構造部分 }

錯誤信息追蹤到 StringRedisSerializer 的 serialize 方法,證實了 Constant.REDIS_LIKE_CODE 的 Integer 類型無法直接轉換為 String 類型。

解決方案:

最直接的解決方法是將 Constant.REDIS_LIKE_CODE 定義為 String 類型,確保 Redis 存儲的 value 與序列化器期望的類型一致,從而避免類型轉換錯誤。 另一種方法是修改 redisTemplate 的 value 序列化器為可以處理 Integer 類型的序列化器,例如 GenericJackson2JsonRedisSerializer。 選擇哪種方法取決于項目整體的設計和編碼風格。

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