重要的模块需要加上缓存:
好处
- 有利于提高查询的速度。
- 可以用于数据的备份
注意一下使用Redis进行缓存的事项:
- 引入redis的相关的依赖
- 在yml文件中加上相关的连接主机的配置
redis:
host: 192.169.48.5
- 使用SpringBoot的话 @Autowired
private RedisTemplate redisTemplate;模板。 - 实现逻辑:
- 查询redis中是否有缓存的数据
- 没有就需要查询mysql数据库
- 把查询的数据写入缓存中
- 注意一下:缓存需要同步
在 增加和删除中进行缓存的同步操作
// 同步缓存
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);
}