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