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 分享