发表于: 2019-12-21 19:29:36
1 1118
一、今天完成的事
1.解决昨天出现的bug
没能解决,不知道原因,直接回滚就可以了
2.解决redis序列化的问题
如果直接使用redisTemplate,存入的key是序列化之后的key
这样能正常存但是要是根据key是娶不到的
需要在写一个RedisConfiguration类
@Configuration
@EnableCaching
public class RedisConfig {
@Autowired
RedisConnectionFactory connectionFactory;
@Bean(name = "redisTemplate")
public RedisTemplate<Object, Object> initRedisTemplate() {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
//RedisTemplate会自动初始化StringRedisSerializer,所以这里直接取
final RedisSerializer<String> stringSerializer = redisTemplate.getStringSerializer();
//设置字符串序列化器,这样spring就会吧redis的key当做字符串来处理了
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
发现放在外部util包是不能自动配置的,所以写在了implement所在包中,在implement类中正常使用redisTemplate就可以了。
配置的com.jnshu.core.utils.RedisUtil也不能注入,没找到解决方法,而且使用不是很方便。
存进redis后可以获取到key
后面就是程序中的缓存逻辑了。
3.给程序加上缓存
写在implement中
package com.jnshu.video.service.serviceImpl;
import com.jnshu.model.Student;
import com.jnshu.model.Video;
import com.jnshu.model.VideoCollection;
import com.jnshu.model.VideoLike;
import com.jnshu.utils.RedisUtil;
import com.jnshu.video.controller.WxVideoController;
import com.jnshu.video.mapper.WxVideoMapper;
import com.jnshu.video.service.WxVideoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Collections;
import java.util.List;
/**
* @author Admin
* @PackageName com.jnshu.academyctrlwebclient.service.serviceImpl
* @ClassName ctrl
* @Description
* @create 2019-11-30 16:00
*/
@Service
public class WxVideoServiceImpl implements WxVideoService {
@Autowired
WxVideoMapper wXVideoMapper;
@Autowired
RedisTemplate redisTemplate;
@Override
public List<Video> selectVideoList(Video video,String token) throws Exception{
return wXVideoMapper.selectVideoList(video);
}
@Override
public Video queryVideoById(Long id) {
Video video = null;
if(redisTemplate.opsForValue().get("video") != null){
video = (Video) redisTemplate.opsForValue().get("video");
}else {
video = wXVideoMapper.queryVideoById(id);
redisTemplate.opsForValue().set("video",video);
}
return video;
}
@Override
public boolean setLike(int like,Long id) {
boolean status = wXVideoMapper.setLike(like, id);
String[] key = {"video","videoList","videoLike"};
redisTemplate.delete(CollectionUtils.arrayToList(key));
return status;
}
@Override
public boolean setCollection(Long vid,int collections) {
boolean status = wXVideoMapper.setCollection(vid,collections);
String[] key = {"video","videoList","videoLike"};
redisTemplate.delete(CollectionUtils.arrayToList(key));
return status;
}
@Override
public boolean setVideoCollection(Long vid, Long sid) {
return wXVideoMapper.setVideoCollection(vid, sid);
}
@Override
public boolean delVideoCollection(Long vid, Long sid) {
return wXVideoMapper.delVideoCollection(vid, sid);
}
@Override
public VideoLike queryVideoLike(Long vid, Long sid) {
VideoLike videoLike = null;
if(redisTemplate.opsForValue().get("videoLike") != null){
videoLike = (VideoLike) redisTemplate.opsForValue().get("videoLike");
}else {
videoLike = wXVideoMapper.queryVideoLike(vid,sid);
redisTemplate.opsForValue().set("videoLike",videoLike);
}
return videoLike;
}
@Override
public VideoCollection queryVideoCollection(Long vid, Long sid) {
VideoCollection videoCollection = null;
if(redisTemplate.opsForValue().get("videoCollectionByWxVideo") != null){
videoCollection = (VideoCollection) redisTemplate.opsForValue().get("videoCollectionByWxVideo");
}else {
videoCollection = wXVideoMapper.queryVideoCollection(vid, sid);
redisTemplate.opsForValue().set("videoCollectionByWxVideo",videoCollection);
}
return videoCollection;
}
@Override
public Long queryStudentId(String openId) {
Long id = null;
if(redisTemplate.opsForValue().get("studentId") != null){
id = (Long) redisTemplate.opsForValue().get("studentId");
}else{
id = wXVideoMapper.queryStudentId(openId);
redisTemplate.opsForValue().set("studentId",id);
}
return id;
}
@Override
public boolean addVideoLike(Long vid, Long sid) {
return wXVideoMapper.addVideoLike(vid, sid);
}
@Override
public boolean delVideoLike(Long vid, Long sid) {
return wXVideoMapper.delVideoLike(vid, sid);
}
}
二、遇到的问题
没能解决列表分页缓存,更新数据不能获取对应的列表
/**
* 获取列表
*
* @param start
* @return
* @throws Exception
*/
@GetMapping(value = "/u/videoList")
private PageInfo<Video> getVideoList(@RequestParam(value = "start", defaultValue = "1") int start,
@RequestParam(value = "size", defaultValue = "10") int size,
Video video, String token) throws Exception {
List<Video> videoList = null;
if(redisTemplate.opsForList().size("videoList") != 0){
System.out.println("从缓存中获取");
Page page = PageHelper.startPage(start, size);
redisTemplate.opsForValue().set("page",page);
videoList = redisTemplate.opsForList().range("videoList",0,-1);
} else{
System.out.println("从数据库中获取");
//获取sid
WxVideoController wxVideoController = new WxVideoController();
String openId = wxVideoController.getIdFromOpenId(token);
Long sid = wxVideoService.queryStudentId(openId);
System.out.println(sid);
video.setCollection_sid(sid);
video.setLike_sid(sid);
Page page = PageHelper.startPage(start, size);
videoList = wxVideoService.selectVideoList(video, token);
redisTemplate.opsForList().rightPushAll("videoList",videoList);
redisTemplate.opsForValue().set("page",page);
}
return new PageInfo<>(videoList);
}
第一次获取列表能根据条件获取
第二次获取就不能从列表中获取条件中所需要的数据
后来使用两层if语句嵌套判断两次查询的信息是否相同
private PageInfo<Video> getVideoList(@RequestParam(value = "start", defaultValue = "1") int start,
@RequestParam(value = "size", defaultValue = "10") int size,
Video video, String token) throws Exception {
List<Video> videoList = null;
if(redisTemplate.opsForList().size("videoList") != 0){
System.out.println("从缓存中获取");
Page page = (Page) redisTemplate.opsForValue().get("page");
if(page.indexOf(1) != start || page.indexOf(2) != size){
PageHelper.startPage(start, size);
System.out.println("和查询信息不一样,还是从数据库中获取");
videoList = wxVideoService.selectVideoList(video, token);
return new PageInfo<>(videoList);
}
System.out.println(page);
videoList = redisTemplate.opsForList().range("videoList",0,-1);
} else{
System.out.println("从数据库中获取");
//获取sid
WxVideoController wxVideoController = new WxVideoController();
String openId = wxVideoController.getIdFromOpenId(token);
Long sid = wxVideoService.queryStudentId(openId);
System.out.println(sid);
video.setCollection_sid(sid);
video.setLike_sid(sid);
Page page = PageHelper.startPage(start, size);
videoList = wxVideoService.selectVideoList(video, token);
redisTemplate.opsForList().rightPushAll("videoList",videoList);
redisTemplate.opsForValue().set("page",page);
}
return new PageInfo<>(videoList);
}
实现了,就是逻辑比较复杂
三、收获
四、明天的计划
继续缓存
评论