使用RedisTemplate实现根据用户喜好推荐电影类型

前言

RedisTemplat提供了对redis的各种操作

具体实现细节

1、创建一个Maven项目,在pom.xml中添加RedisTemplat的依赖

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <version>2.2.1.RELEASE</version>
     </dependency>

2、在application.properties中配置redis连接

#redis连接
spring.redis.database=1 #具体操作哪个数据库
spring.redis.host=127.0.0.1
spring.redis.port=6379

3、实现方式(controller)这里直接使用controller层来实现业务层,不在写接口层和业务层。

   //注入RedisTemplate 
   @Autowired
   private RedisTemplate redisTemplate;

     /**
     * 用户刚进入的时候
     * 判断redis里面是否存在用户喜爱列表,如果没有
     * 则添加喜爱列表
     * 有
     * 则不添加服务列表
     * 不管是刚添加的还是以前就存在的
     * 都可以查出用户喜爱前三的电影类型(用户第一次进来喜好刚创建都为0,系统默认排序查询)
     */
    @RequestMapping("express")
    @ResponseBody
    public String express(String phone){
    
    
        Boolean servers = redisTemplate.hasKey(phone);
        //判断redis里面是否存在用户喜爱的电影类型列表
        if(servers == false){
    
    
            //没有,添加数据到redis
            redisTemplate.boundZSetOps(phone).add("搞笑",0);
            redisTemplate.boundZSetOps(phone).add("综艺",0);
            redisTemplate.boundZSetOps(phone).add("恐怖",0);
            redisTemplate.boundZSetOps(phone).add("歌舞",0);
            redisTemplate.boundZSetOps(phone).add("历史",0);
            redisTemplate.boundZSetOps(phone).add("古装",0);
            redisTemplate.boundZSetOps(phone).add("科幻",0);
            redisTemplate.boundZSetOps(phone).add("仙侠",0);
        }
        //获取用户点击率前三的电影类型,只显示电影类型
        Set<String> server = redisTemplate.boundZSetOps(phone).reverseRange(0,2);
        //显示电影类型和点击率(次数)
        Set<String> score = redisTemplate.boundZSetOps(phone).reverseRangeWithScores(0,2);
        //转换格式
        String scores = JsonUtil.obj2String(score);
        String result = JsonUtil.obj2String(server);
        return result;
    }

4、JsonUtil转换格式工具

package com.yy.util;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class JsonUtil {
    
    

    private static ObjectMapper objectMapper = new ObjectMapper();

    //对象转字符串
    public static <T> String obj2String(T obj) {
    
    
        if (obj == null) {
    
    
            return null;
        }
        try {
    
    
            return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            return null;
        }
    }

    //字符串转对象
    public static <T> T string2Obj(String str, Class<T> clazz) {
    
    
        if (str == null || str.isEmpty() || clazz == null) {
    
    
            return null;
        }
        try {
    
    
            return clazz.equals(String.class) ? (T) str : objectMapper.readValue(str, clazz);
        } catch (IOException e) {
    
    
            e.printStackTrace();
            return null;
        }
    }
}

5、使用接口测试工具进行测试
在这里插入图片描述
6、看一下redis里面的数据
在这里插入图片描述
7、查询爱好的完成了,下面开始获取用户浏览的次数

    /**
     *记录用户点击意图的次数
     *每查看一次电影的类型
     *电影的对应类型的浏览量就会加1
     * @param phone
     * @param serverType
     */
    @RequestMapping("serverList")
    @ResponseBody
    public void serverList(String phone,String serverType){
    
    
        switch (serverType){
    
    
            case "搞笑":
                redisTemplate.boundZSetOps(phone).incrementScore("搞笑",1);
                break;
            case "综艺":
                redisTemplate.boundZSetOps(phone).incrementScore("综艺",1);
                break;
            case "恐怖":
                redisTemplate.boundZSetOps(phone).incrementScore("恐怖",1);
                break;
            case "歌舞":
                redisTemplate.boundZSetOps(phone).incrementScore("歌舞",1);
                break;
            case "历史":
                redisTemplate.boundZSetOps(phone).incrementScore("历史",1);
                break;
            case "古装":
                redisTemplate.boundZSetOps(phone).incrementScore("古装",1);
                break;
            case "科幻":
                redisTemplate.boundZSetOps(phone).incrementScore("科幻",1);
                break;
            case "仙侠":
                redisTemplate.boundZSetOps(phone).incrementScore("仙侠",1);
                break;
        }
    }

8、用接口测试工具测试
在这里插入图片描述
9、然后返回第一个查询用户喜好电影类型的接口
在这里插入图片描述
10、再看一下redis数据库里面的值
在这里插入图片描述
到此结束!!!

猜你喜欢

转载自blog.csdn.net/javaasd/article/details/107542860