1、为什么要使用StringRedisTemplate?
在进行缓存时,若使用RedisTemplate进行操作,如果我们使用默认的序列化器,Redis会为我们缓存一堆比较乱的代码(具体可以自行尝试),这样不利于我们进行数据的调用和存储,因此在使用时我们会对RedisTemplate的序列化方式进行配置。
而如果我们指定GenericJackson2JsonRedisSerializer序列化器为我们进行序列化,它会自动将Java对象序列化为JSON类型以及反序列化,但是存储到Redis的数据将会如下图所示:
多了一条类名字段,由该序列化器反序列化时调用。这样的存储格式不仅浪费内存,且在类名作修改时,极易出现问题。
所以现在为了节省内存开销,我们并不会使用JSON序列化器来处理Value,而是统一使用String序列化器,要求只能存储String类型的key和value,当需要存储Java对象时,手动完成Java对象到JSON字符串格式的序列化以及JSON字符串到Java对象的反序列化。
而Spring默认提供了一个StringRedisTemplate类,它的key和Value的序列化方式默认就是String类型,省去了我们自定义RedisTemplate的过程。
2、如何使用StringRedisTemplate?
使用StringRedisTemplate最主要的就是进行手动序列化,因此,一个手动序列化的工具就必不可少,在这里推荐使用fastJSON进行操作。
以List数据结构举例:
进行缓存构造:
Page<job> page=jobService.selectJob(new Page<>(pageNum,pageSize));//查询分页
List<job> jobList=page.getRecords();//获取分页中数据项的集合
String jobs = JSON.toJSONString(jobInfoCompanies);//调用fastJSON工具包进行序列化为JSONString格式
stringRedisTemplate.opsForValue().set("jobList:"+pageNum+pageSize,jobs);//进行缓存存储
进行缓存查询:
String jobs = stringRedisTemplate.opsForValue().get("jobList:"+pageNum+pageSize);//获取缓存中的JSONString类型数据
List<job> list = JSONObject.parseArray(jobs,job.class);//调用fastJSON的工具包进行JSONString转List反序列化
//...进行接下来的操作
3、总结:
1、在使用Redis进行缓存时,选择合适Redis模板,推荐使用StringRedisTemplate
2、使用StringRedisTemplate时需要注意手动序列化的细节,在写入和读取时都要进行