tensSquare项目实现缓存,SpringCache和Redis

重要的模块需要加上缓存:

好处

  1. 有利于提高查询的速度。
  2. 可以用于数据的备份

注意一下使用Redis进行缓存的事项:

  1. 引入redis的相关的依赖
  2. 在yml文件中加上相关的连接主机的配置
redis:
    host: 192.169.48.5
  1. 使用SpringBoot的话 @Autowired
    private RedisTemplate redisTemplate;模板。
  2. 实现逻辑:
  • 查询redis中是否有缓存的数据
  • 没有就需要查询mysql数据库
  • 把查询的数据写入缓存中
  1. 注意一下:缓存需要同步
    在 增加和删除中进行缓存的同步操作

// 同步缓存
redisTemplate.delete(“article_”+id);

6. SpringCache的缓存没有过期的限制,redis可以设置 过期时间
tensquare_article模块:

package com.tensquare.article.service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Selection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;
import util.IdWorker;

import com.tensquare.article.dao.ArticleDao;
import com.tensquare.article.pojo.Article;

/**
 * 服务层
 * 
 * @author Administrator
 *
 */
@Service
public class ArticleService {
    
    

	@Autowired
	private ArticleDao articleDao;
	
	@Autowired
	private IdWorker idWorker;

	@Autowired
	private RedisTemplate redisTemplate;
	/**
	 * 根据ID查询实体
	 * @param id
	 * @return
	 */
	public Article findById(String id) {
    
    
//		1.从缓存里面读取
		Article article= (Article) redisTemplate.opsForValue().get("article_"+id);
// 		2.如果缓存里面没有,从数据库里面读取
		if (article==null){
    
    
			Article article1=articleDao.findById(id).get();
//		3.数据库查询过后,同步到缓存中 可以设置过期时间 10 TimeUnitSECONDS 10秒 天,小时
			redisTemplate.opsForValue().set("article_"+id,article1,10, TimeUnit.SECONDS);
		}

		return articleDao.findById(id).get();
	}
	/**
	 * 查询全部列表
	 * @return
	 */
	public List<Article> findAll() {
    
    
		return articleDao.findAll();
	}

	
	/**
	 * 条件查询+分页
	 * @param whereMap
	 * @param page
	 * @param size
	 * @return
	 */
	public Page<Article> findSearch(Map whereMap, int page, int size) {
    
    
		Specification<Article> specification = createSpecification(whereMap);
		PageRequest pageRequest =  PageRequest.of(page-1, size);
		return articleDao.findAll(specification, pageRequest);
	}

	
	/**
	 * 条件查询
	 * @param whereMap
	 * @return
	 */
	public List<Article> findSearch(Map whereMap) {
    
    
		Specification<Article> specification = createSpecification(whereMap);
		return articleDao.findAll(specification);
	}



	/**
	 * 增加
	 * @param article
	 */
	public void add(Article article) {
    
    
		article.setId( idWorker.nextId()+"" );

		articleDao.save(article);
	}

	/**
	 * 修改
	 * @param article
	 */
	public void update(Article article) {
    
    
//		同步缓存
		redisTemplate.delete("article_"+article.getId());

		articleDao.save(article);
	}

	/**
	 * 删除
	 * @param id
	 */
	public void deleteById(String id) {
    
    
//		同步缓存
		redisTemplate.delete("article_"+id);
		articleDao.deleteById(id);
	}

	/**
	 * 动态条件构建
	 * @param searchMap
	 * @return
	 */
	private Specification<Article> createSpecification(Map searchMap) {
    
    

		return new Specification<Article>() {
    
    

			@Override
			public Predicate toPredicate(Root<Article> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    
    
				List<Predicate> predicateList = new ArrayList<Predicate>();
                // ID
                if (searchMap.get("id")!=null && !"".equals(searchMap.get("id"))) {
    
    
                	predicateList.add(cb.like(root.get("id").as(String.class), "%"+(String)searchMap.get("id")+"%"));
                }
                // 专栏ID
                if (searchMap.get("columnid")!=null && !"".equals(searchMap.get("columnid"))) {
    
    
                	predicateList.add(cb.like(root.get("columnid").as(String.class), "%"+(String)searchMap.get("columnid")+"%"));
                }
                // 用户ID
                if (searchMap.get("userid")!=null && !"".equals(searchMap.get("userid"))) {
    
    
                	predicateList.add(cb.like(root.get("userid").as(String.class), "%"+(String)searchMap.get("userid")+"%"));
                }
                // 标题
                if (searchMap.get("title")!=null && !"".equals(searchMap.get("title"))) {
    
    
                	predicateList.add(cb.like(root.get("title").as(String.class), "%"+(String)searchMap.get("title")+"%"));
                }
                // 文章正文
                if (searchMap.get("content")!=null && !"".equals(searchMap.get("content"))) {
    
    
                	predicateList.add(cb.like(root.get("content").as(String.class), "%"+(String)searchMap.get("content")+"%"));
                }
                // 文章封面
                if (searchMap.get("image")!=null && !"".equals(searchMap.get("image"))) {
    
    
                	predicateList.add(cb.like(root.get("image").as(String.class), "%"+(String)searchMap.get("image")+"%"));
                }
                // 是否公开
                if (searchMap.get("ispublic")!=null && !"".equals(searchMap.get("ispublic"))) {
    
    
                	predicateList.add(cb.like(root.get("ispublic").as(String.class), "%"+(String)searchMap.get("ispublic")+"%"));
                }
                // 是否置顶
                if (searchMap.get("istop")!=null && !"".equals(searchMap.get("istop"))) {
    
    
                	predicateList.add(cb.like(root.get("istop").as(String.class), "%"+(String)searchMap.get("istop")+"%"));
                }
                // 审核状态
                if (searchMap.get("state")!=null && !"".equals(searchMap.get("state"))) {
    
    
                	predicateList.add(cb.like(root.get("state").as(String.class), "%"+(String)searchMap.get("state")+"%"));
                }
                // 所属频道
                if (searchMap.get("channelid")!=null && !"".equals(searchMap.get("channelid"))) {
    
    
                	predicateList.add(cb.like(root.get("channelid").as(String.class), "%"+(String)searchMap.get("channelid")+"%"));
                }
                // URL
                if (searchMap.get("url")!=null && !"".equals(searchMap.get("url"))) {
    
    
                	predicateList.add(cb.like(root.get("url").as(String.class), "%"+(String)searchMap.get("url")+"%"));
                }
                // 类型
                if (searchMap.get("type")!=null && !"".equals(searchMap.get("type"))) {
    
    
                	predicateList.add(cb.like(root.get("type").as(String.class), "%"+(String)searchMap.get("type")+"%"));
                }
				
				return cb.and( predicateList.toArray(new Predicate[predicateList.size()]));

			}
		};

	}

	/*文章审核*/

	@Transactional
	public void examine(String id){
    
    

		articleDao.examine(id);


	}

	/*
	* 文章点赞
	* */
	@Transactional
	public int updateThumbup(String id){
    
    

		return articleDao.updateThumbup(id);
	}

}

tensquare_gathering通过SpringCache缓存活动信息:

在需要缓存的service层加上:

/**
	 * 根据ID查询实体
	 * gathering再 springCache没什么用,但是必须要写
	 * @param id
	 * @return
	 */
	@Cacheable(value = "gathering",key = "#id")
	public Gathering findById(String id) {
    
    
		return gatheringDao.findById(id).get();
	}

	/**
	 * 增加
	 * @param gathering
	 */
	public void add(Gathering gathering) {
    
    
		gathering.setId( idWorker.nextId()+"" );
		gatheringDao.save(gathering);
	}

	/**
	 * 修改
	 * @param gathering
	 */
	@CacheEvict(value = "gathering",key = "#gathering.id")
	public void update(Gathering gathering) {
    
    
		gatheringDao.save(gathering);
	}

	/**
	 * 删除
	 * @param id
	 */
	@CacheEvict(value = "gathering",key = "id")
	public void deleteById(String id) {
    
    
		gatheringDao.deleteById(id);
	}

猜你喜欢

转载自blog.csdn.net/houzhicongone/article/details/119961006