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点赞数据的正确存储。