redis缓存点赞

废话

我先bbll

       最近老师让我们用redis缓存完成点赞功能,以及查询redis缓存中的数据. 我第一次接触redis什么也不懂, 去借鉴大佬分享的, 各种方法都有, 但没找到适合我这个**学生的, 简直不能再笨了. 写了好久, 临近崩溃的时候终于… 终于… 崩溃了!!     玩笑, 写出来了! 是那种很低级的, 大佬忽略!!

关于项目

       我使用的是eclipse的maven工程
       框架是SSM框架, spring MVC, spring和mybatis框架的整合, 是MVC模式, 整个系统划分为表现层, controller层, service层, mapper层四层
       spring MVC负责请求的转发和视图管理
       spring实现业务对象管理
       mybatis作为数据对象的持久化引擎

在这里插入图片描述

代码

controller层

主要的步骤都在controller了, 其他的是调用一些方法

package com.hp.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.hp.entity.Item;
import com.hp.service.JedisService;
import com.hp.service.ShopService;
import com.hp.util.JsonUtils;

/**
 * 用户controller层
 * @author 11501
 *
 */
@Controller
@Scope("prototype")
public class ShopController {
	//注入service层
	@Autowired
	private ShopService shopService;
	//注入redis的service接口
	@Autowired 
	private JedisService jedisService;
	
	/**
	 * redis缓存商品列表查询
	 * @param model
	 * @return
	 */
	@RequestMapping("/shoplist")
	public String shoplist(Model model) {
		List<Item> list = new ArrayList<Item>();
		//获取redis中的数据
		Map<String, String> getAll = jedisService.hGetAll(1+"");
		//判断数据是否存在
		if (getAll != null && getAll.size() > 0) {
			//如果数据存在,遍历
			for (String key : getAll.keySet()) {
				//把每一条数据转换成类的对象
				String s = getAll.get(key);
				Item item = JsonUtils.jsonToPojo(s, Item.class);
				//再把类的对象存到集合中
				list.add(item);
				//通过model传到前端
				model.addAttribute("list", list);
			}
		} else {
			Map<String, Object> map = new HashMap<String, Object>();
			//如果数据不存在,查询数据
			list = shopService.shoplist(map);
			for (Item item : list) {
				//遍历把每一条数据数据转化成json字符串
				String s = JsonUtils.objectToJson(item);
				//存到redis中
				jedisService.hSet(1+"", item.getId()+"", s);
			}
		}
		return "shop/shoplist";
	}
	
	/**
	 * redis缓存的点赞功能
	 * @param id
	 * @return
	 */
	@RequestMapping("/praise")
	public String praise(int id) {
		//根据前端传的id查询json信息
		String hGet = jedisService.hGet(1+"", id+"");
		//把查询的信息转化成类的对象
		Item item = JsonUtils.jsonToPojo(hGet, Item.class);
		//进行+1操作
		int praise = item.getPraise()+1;
		item.setPraise(praise);
		//删除原来的信息
		jedisService.hDel(1+"", id+"");
		//再把类的对象转化成json字符串
		String s = JsonUtils.objectToJson(item);
		//操作后把值存到redis中
		jedisService.hSet(1+"", id+"", s);
		//重定向商品查询
		return "redirect:shoplist.action";
	}
}

service层接口

package com.hp.service;

import java.util.List;
import java.util.Map;

import com.hp.entity.Item;

/**
 * 用户service层接口
 * @author 11501
 *
 */
public interface ShopService {
	//商品列表查询
	List<Item> shoplist(Map<String, Object> map);
}

service接口的实现类

package com.hp.service.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.hp.entity.Item;
import com.hp.mapper.ShopMapper;
import com.hp.service.ShopService;

/**
 * 用户service层接口的实现类
 * @author 11501
 *
 */
@Service
@Repository("shopService")
@Transactional
public class ShopServiceImpl implements ShopService {
	//注入mapper层
	@Autowired
	private ShopMapper shopMapper;
	
	//商品列表查询
	@Override
	public List<Item> shoplist(Map<String, Object> map) {
		return shopMapper.shoplist(map);
	}
}

mapper层接口

package com.hp.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;

import com.hp.entity.Item;

/**
 * 用户mapper层接口
 * @author 11501
 *
 */
@Mapper
public interface ShopMapper {	
	//商品列表
	List<Item> shoplist(Map<String, Object> map);
	
}

mapper层接口的实现

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.hp.mapper.ShopMapper">
	<!-- 商品列表 -->
	<select id="shoplist" parameterType="map" resultType="item">
		select s.id,s.goods,s.goods_price,s.creat_data,s.goods_details,d.type_name,s.praise
		from goods s,goodtype d
		where s.goods_type_id = d.id
	</select>
</mapper>

以上的是整体查询功能的流程
 *功能的完成:
    实体类entity,定义对象的属性, (参照数据库中表的字段来设置)
    Mapper.xml(Mybatis), 定义功能, 对应对数据库进行的操作, 比如 insert、selectAll、selectById、delete、update等
    Mapper.java, 将Mapper.xml中的操作按照id映射成Java函数
    Service.java, 为控制层提供服务,接受控制层的参数,完成相应的功能,并返回给控制层
    Controller.java,连接页面请求和服务层,获取页面请求的参数,通过自动装配,映射不同的URL到相应的处理函数,并获取参数,对参数进行处理,之后传给服务层。
    JSP页面调用,请求哪些参数,需要获取什么数据。
DataBase ===> Entity ===> Mapper.xml ===> Mapper.Java ===> ServiceImpl.java ===> Service.java ===> Controller.java ===> Jsp.

结合jedis完成整个流程

       上面controller层中已经包含了jedis的调用,下面附上代码

JedisService

package com.hp.service;

import java.util.Map;

public interface JedisService {
	//获取redis中的某一条数据
	public String hGet(String key, String field);
	//删除redis非关系型数据库中的一条数据
	public long hDel(String key, String fields);
	//往redis非关系型数据库中插入一条数据
	public long hSet(String key, String field,String value);
	//获取redis非关系型数据库中的所有数据库数据信息
	public Map<String, String> hGetAll(String key);
}

JedisServiceImpl

package com.hp.service.impl;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.hp.service.JedisService;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;


@Service
@Repository("jedisService")
@Transactional
public class JedisServiceImpl implements JedisService{
	//注入jedispool连接池
	@Autowired 
	private JedisPool jedisPool;
	
	@Override
	public String hGet(String key, String field) {
		Jedis jedis = jedisPool.getResource();
		return jedis.hget(key, field);
	}
	@Override
	public long hDel(String key, String fields) {
		Jedis jedis = jedisPool.getResource();
		return jedis.hdel(key, fields);
	}
	@Override
	public long hSet(String key, String field,String value) {
		Jedis jedis = jedisPool.getResource();
		return jedis.hset(key, field, value);
	}
	@Override
	public Map<String, String> hGetAll(String key) {
		Jedis jedis = jedisPool.getResource();
		return jedis.hgetAll(key);
	}
}

使用到的工具类

       在controller层中, redis存取json格式的数据, 用到了一个工具类(JsonUtils), 主要是把json字符串转化为pojo, 把pojo转化为字符串等.

package com.hp.util;

import java.util.List;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;


/**
 * 商城自定义响应结构
 */
public class JsonUtils {

    // 定义jackson对象
    private static final ObjectMapper MAPPER = new ObjectMapper();

    /**
     * 将对象转换成json字符串。
     * <p>Title: pojoToJson</p>
     * <p>Description: </p>
     * @param data
     * @return
     */
    public static String objectToJson(Object data) {
    	try {
			String string = MAPPER.writeValueAsString(data);
			return string;
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
    	return null;
    }
    
    /**
     * 将json结果集转化为对象
     * @param jsonData json数据
     * @param clazz 对象中的object类型
     * @return
     */
    public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
        try {
            T t = MAPPER.readValue(jsonData, beanType);
            return t;
        } catch (Exception e) {
        	e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 将json数据转换成pojo对象list
     * <p>Title: jsonToList</p>
     * <p>Description: </p>
     * @param jsonData
     * @param beanType
     * @return
     */
    public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {
    	JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
    	try {
    		List<T> list = MAPPER.readValue(jsonData, javaType);
    		return list;
		} catch (Exception e) {
			e.printStackTrace();
		}
    	return null;
    }
}

我技术很菜, 看到这的各位有什么问题欢迎提出
我们一起学习交流, 共同进步

发布了21 篇原创文章 · 获赞 4 · 访问量 1891

猜你喜欢

转载自blog.csdn.net/qq_40803085/article/details/103417543
今日推荐