发表于: 2019-12-21 19:29:36

1 1119


一、今天完成的事

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);
   }

实现了,就是逻辑比较复杂

三、收获

四、明天的计划

继续缓存



返回列表 返回列表
评论

    分享到