使用aop环切技术+redis缓存+sql查询 提高效率!

package cn.itcast.aop;

import cn.hutool.core.util.StrUtil;
import cn.itcast.pojo.Setmeal;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;

/**
 * @author  caiqingyuan
 * @version 1.0.0
 * @date 2021/7/5 16:43
 */
@Aspect  //作用是把当前类标识为一个切面供容器读取
@Component 
public class RedisAop {

    /**
     * 定义切入点,切入点为cn.itcast.service.SetmealService下的所有函数
     */
    @Pointcut("execution(public * cn.itcast.service.SetmealService.*(..))")
    public void redisDelete() {
    }

    @Resource
    private RedisTemplate<String,Setmeal> redisTemplate;

    /**
     * 前置通知:在连接点之前执行的通知
     *
     * @param joinPoint
     */
    @Before("redisDelete()")
    public void doBefore(JoinPoint joinPoint) {
        //通过RequestContextHolder拿到requestAttribute
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        //通过切点来获取方法名
        String classMethod = joinPoint.getSignature().getName();
        if (!StrUtil.containsAny(classMethod, "find", "select", "pageQuery")) {
            if (redisTemplate.hasKey("SET_MEAL_LIST")) {
                this.redisTemplate.delete("SET_MEAL_LIST");
                System.out.println("从redis中删除所有的列表");
            }

        }
    }

}

servcie方法,

package cn.itcast.service;



import cn.itcast.entity.PageResult;
import cn.itcast.pojo.Setmeal;

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

public interface SetmealService {
    /**
     * 新增体检套餐
     *
     * @param setmeal
     * @param checkgroupIds
     */
    void add(Setmeal setmeal, Integer[] checkgroupIds);

    /**
     * 分页查询套餐数据
     *
     * @param currentPage
     * @param pageSize
     * @param queryString
     * @return
     */
    PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString);

    /**
     * 查询检查套餐关联的检查组数据
     *
     * @param id
     * @return
     */
    Integer[] selectedCheckGroupIds(Integer id);

    /**
     * 根据id查询体检套餐基本信息
     *
     * @param id
     * @return
     */
    Setmeal findById(Integer id);

    /**
     * 更新体检套餐数据
     *
     * @param setmeal
     * @param checkgroupIds
     */
    void update(Setmeal setmeal, Integer[] checkgroupIds);

    /**
     * 根据id删除体检套餐数据
     * @param id
     */
    void deleteById(Integer id);

    /**
     * 查询所有套餐数据
     * @return
     */
    List<Setmeal> findAll();

    /**
     * 查询套餐详情 -- 套餐包含的检查组  -- 检查组包含的检查项
     * @param id
     * @return
     */
    Setmeal findSetmealDetail(Integer id);

    /**
     * 查询每个体检套餐的预约数量
     * @return
     */
    List<Map<String, Object>> findSetmealOrderedCount();

}

serviceImpl

package cn.itcast.service.impl;

import cn.itcast.dao.SetmealDao;
import cn.itcast.entity.PageResult;
import cn.itcast.pojo.Setmeal;
import cn.itcast.service.SetmealService;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

@Service
public class SetmealServiceImpl implements SetmealService {

    @Autowired
    private SetmealDao setmealDao;


    @Autowired
    private RedisTemplate<String,Setmeal> redisTemplate;

    private static final String SET_REDIS_KEY = "SET_MEAL_LIST";
    private static final String SET_MEAL_REDIS_KEY = "SET_MEAL";


    @Transactional //开启事务管理
    @Override
    public void add(Setmeal setmeal, Integer[] checkgroupIds) {
        //保存体检套餐基础数据
        setmealDao.add(setmeal);
        //保存体检套餐关联体检组数据
        if (checkgroupIds != null) {
            setCheckGroupAssociation(setmeal.getId(), checkgroupIds);
        }
    }

    @Override
    public PageResult pageQuery(Integer currentPage, Integer pageSize, String queryString) {
        PageHelper.startPage(currentPage, pageSize);
        Page<Setmeal> page = setmealDao.findByCondition(queryString);
        return new PageResult(page.getTotal(), page.getResult());
    }

    @Override
    public Integer[] selectedCheckGroupIds(Integer setMealId) {
        return setmealDao.findCheckGroupAssociationIds(setMealId);
    }

    @Override
    public Setmeal findById(Integer id) {
        return setmealDao.findById(id);
    }

    @Transactional  //开启事务管理
    @Override
    public void update(Setmeal setmeal, Integer[] checkgroupIds) {
        if (redisTemplate.hasKey(SET_MEAL_REDIS_KEY+setmeal.getId())){
            this.redisTemplate.delete(SET_MEAL_REDIS_KEY+setmeal.getId());
            System.err.println("从redis中删除单个套餐");
        }
        //更新体检套餐基础信息
        setmealDao.update(setmeal);
        //删除之前体检套餐与体检组的关联信息
        setmealDao.deleteCheckGroupAssociation(setmeal.getId());
        //保存新的体检套餐与体检组的关联信息
        if (checkgroupIds != null) {
            setCheckGroupAssociation(setmeal.getId(), checkgroupIds);
        }
    }


    @Transactional //开启事务管理
    @Override
    public void deleteById(Integer id) {
        if (redisTemplate.hasKey(SET_MEAL_REDIS_KEY+id)){
            this.redisTemplate.delete(SET_MEAL_REDIS_KEY+id);
            System.err.println("从redis中删除单个套餐");
        }
        //删除体检套餐与体检组的关联数据
        setmealDao.deleteCheckGroupAssociation(id);
        //删除体检套餐数据
        setmealDao.deleteById(id);
    }


    @Override
    public List<Setmeal> findAll() {
        if (redisTemplate.hasKey(SET_REDIS_KEY)){
            //从redis获取
            List<Setmeal> range = this.redisTemplate.opsForList().range(SET_REDIS_KEY, 0, -1);
            System.err.println("从redis中获取套餐列表");
            return range;
        }
        //从sql中获取
        List<Setmeal> all = setmealDao.findAll();
        //存入redis中
        this.redisTemplate.opsForList().leftPushAll(SET_REDIS_KEY,all);
        System.err.println("从mysql中获取套餐列表");
        return all;
    }


    @Override
    public Setmeal findSetmealDetail(Integer id) {
        if (redisTemplate.hasKey(SET_MEAL_REDIS_KEY+id)){
            Setmeal setmeal = this.redisTemplate.opsForValue().get(SET_MEAL_REDIS_KEY+id);
            System.err.println("从redis中获取套餐");
            return setmeal;
        }
        Setmeal setmeal = setmealDao.findDetailsById(id);
        this.redisTemplate.opsForValue().set(SET_MEAL_REDIS_KEY+id,setmeal);
        System.err.println("从mysql中获取套餐");
        return setmeal;
    }


    @Override
    public List<Map<String, Object>> findSetmealOrderedCount() {
        return setmealDao.findSetmealOrderedCount();
    }

    /**
     * 保存检查组和检查项关联信息
     *
     * @param setmealId
     * @param checkGroupIds
     */
    private void setCheckGroupAssociation(Integer setmealId, Integer[] checkGroupIds) {
        if (redisTemplate.hasKey(SET_MEAL_REDIS_KEY+setmealId)){
            this.redisTemplate.delete(SET_MEAL_REDIS_KEY+setmealId);
            System.err.println("从redis中删除单个套餐");
        }
        Stream.of(checkGroupIds).forEach(checkGroupId -> setmealDao.setCheckGroupAssociation(setmealId, checkGroupId));
    }

}

项目中的纯代码!你能认识就认识吧!可以直接使用哦,愿你我皆是黑马..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值