提交 525d4372 编写于 作者: E Evan

feat: cache article list, #119

上级 94615724
package com.gm.wj.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Service;
......@@ -30,6 +31,10 @@ public class RedisService {
return redisTemplate.opsForValue().get(key);
}
// public <T> PageImpl<T> getPage(String key) {
// return redisTemplate.opsForValue().get(key);
// }
public Boolean delete(String key) {
return redisTemplate.delete(key);
}
......
package com.gm.wj.service;
import com.gm.wj.config.RedisConfig;
import com.gm.wj.dao.BookDAO;
import com.gm.wj.entity.Book;
import com.gm.wj.entity.Category;
import com.gm.wj.redis.RedisService;
import com.gm.wj.util.CastUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.annotation.processing.Processor;
import java.util.List;
import java.util.Timer;
/**
* @author Evan
......@@ -26,18 +26,29 @@ public class BookService {
@Autowired
private RedisService redisService;
// @Cacheable(value = RedisConfig.REDIS_KEY_DATABASE)
public List<Book> list() {
List<Book> books;
String key = "booklist";
List<Book> books = CastUtils.castList(redisService.get(key), Book.class);
if (books == null) {
Object bookCache = redisService.get(key);
if (bookCache == null) {
Sort sort = new Sort(Sort.Direction.DESC, "id");
books = bookDAO.findAll(sort);
redisService.set(key, books);
} else {
books = CastUtils.objectConvertToList(bookCache, Book.class);
}
return books;
}
// @Cacheable(value = RedisConfig.REDIS_KEY_DATABASE)
// public List<Book> list() {
// List<Book> books;
// Sort sort = new Sort(Sort.Direction.DESC, "id");
// books = bookDAO.findAll(sort);
// return books;
// }
public void addOrUpdate(Book book) {
redisService.delete("booklist");
bookDAO.save(book);
......
......@@ -2,6 +2,8 @@ package com.gm.wj.service;
import com.gm.wj.dao.JotterArticleDAO;
import com.gm.wj.entity.JotterArticle;
import com.gm.wj.redis.RedisService;
import com.gm.wj.util.MyPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
......@@ -16,12 +18,33 @@ import org.springframework.stereotype.Service;
public class JotterArticleService {
@Autowired
JotterArticleDAO jotterArticleDAO;
@Autowired
RedisService redisService;
public MyPage list(int page, int size) {
MyPage<JotterArticle> articles;
String key = "articlepage:" + page;
Object articlePageCache = redisService.get(key);
public Page list(int page, int size) {
Sort sort = new Sort(Sort.Direction.DESC, "id");
return jotterArticleDAO.findAll(PageRequest.of(page, size, sort));
if (articlePageCache == null) {
Sort sort = new Sort(Sort.Direction.DESC, "id");
Page<JotterArticle> articlesInDb = jotterArticleDAO.findAll(PageRequest.of(page, size, sort));
articles = new MyPage<>(articlesInDb);
redisService.set(key, articles);
} else {
articles = (MyPage<JotterArticle>) articlePageCache;
}
return articles;
}
// 用于复现异常
// @Cacheable(value = RedisConfig.REDIS_KEY_DATABASE)
// public Page list(int page, int size) {
// Sort sort = new Sort(Sort.Direction.DESC, "id");
// return jotterArticleDAO.findAll(PageRequest.of(page, size, sort));
// }
public JotterArticle findById(int id) {
return jotterArticleDAO.findById(id);
}
......
......@@ -8,8 +8,7 @@ import java.util.List;
* @date 2020/5/31 19:04
*/
public class CastUtils {
public static <T> List<T> castList(Object obj, Class<T> clazz)
{
public static <T> List<T> objectConvertToList(Object obj, Class<T> clazz) {
List<T> result = new ArrayList<T>();
if(obj instanceof List<?>)
{
......
package com.gm.wj.util;
import org.springframework.data.domain.Page;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* @Author Evan
* @Date 2020/6/10
*/
public class MyPage<T> implements Iterable<T>, Serializable {
private static final long serialVersionUID = -3720998571176536865L;
private List<T> content = new ArrayList<>();
private long totalElements;
private int pageNumber;
private int pageSize;
private boolean first;
private boolean last;
private boolean empty;
private int totalPages;
private int numberOfElements;
public MyPage() {
}
//只用把原来的page类放进来即可
public MyPage(Page<T> page) {
this.content = page.getContent();
this.totalElements = page.getTotalElements();
this.pageNumber = page.getPageable().getPageNumber();
this.pageSize = page.getPageable().getPageSize();
this.numberOfElements = page.getNumberOfElements();
}
//是否有前一页
public boolean hasPrevious() {
return getPageNumber() > 0;
}
//是否有下一页
public boolean hasNext() {
return getPageNumber() + 1 < getTotalPages();
}
//是否第一页
public boolean isFirst() {
return !hasPrevious();
}
//是否最后一页
public boolean isLast() {
return !hasNext();
}
//获取内容
public List<T> getContent() {
return Collections.unmodifiableList(content);
}
//设置内容
public void setContent(List<T> content) {
this.content = content;
}
//是否有内容
public boolean hasContent() {
return getNumberOfElements() > 0;
}
//获取单页大小
public int getPageSize() {
return pageSize;
}
//设置单页大小
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
//获取全部元素数目
public long getTotalElements() {
return totalElements;
}
//设置全部元素数目
public void setTotalElements(long totalElements) {
this.totalElements = totalElements;
}
//设置是否第一页
public void setFirst(boolean first) {
this.first = first;
}
// 设置是否最后一页
public void setLast(boolean last) {
this.last = last;
}
//获取当前页号
public int getPageNumber() {
return pageNumber;
}
//设置当前页号
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
//获取总页数
public int getTotalPages() {
return getPageSize() == 0 ? 1 : (int) Math.ceil((double) totalElements / (double) getPageSize());
}
//设置总页数
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
//获取单页元素数目
public int getNumberOfElements() {
return numberOfElements;
}
//设置单页元素数目
public void setNumberOfElements(int numberOfElements) {
this.numberOfElements = numberOfElements;
}
//判断是否为空
public boolean isEmpty() {
return !hasContent();
}
//设置是否为空
public void setEmpty(boolean empty) {
this.empty = empty;
}
//迭代器
@Override
public Iterator<T> iterator() {
return getContent().iterator();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册