需求是统计一个接口的访问量,一个ip仅一次。
接口访问量本来就不太大所以考虑用了redis的自增值来记录访问数,将不同接口自增值统一放在一个hashMap里。
然而在取值时缺报了反序列化异常。
查阅资料发现是redisTemple的RedisSerializer有问题。
spring提供了很多RedisSerializer的选择,很多文档都只提到了jackson,JDK,string这三种。
项目中本来用到了很多pojo类的存储,默认使用的是JDKRedisSerializer,但是这种序列化方式取自增值时会报反序列化异常,
看了redis中的存值发现,redisTemple.opsHash的自增值是没有经过JDKRedisSerializer的序列化的,我传的int值,存在redis里的就是int值,然而取的时候JDKRedisSerializer需要的是一个byte[],所以理所当然的报了异常。
那么用jackson? json格式,速度快,体积小。但是jackson在存pojo时必须在构造函数中添加javaType,以便于在反序列化时能够正常转换。
在两者都难以取舍时,我偶然翻到一个大佬自己写的反序列化工具
GenericJackson2JsonRedisSerializer
然而其实spring已经吸收了这个点子,改进了jackson, 使它不用再添加javaType,大家可以直接调用。