1.キャッシュ処理SpringDataRedis
これを使用して、他のテクノロジーのキャッシュを置き換えることができます。元のプロジェクトでは、LuaとCanalを使用して広告キャッシュを実装しています。
1.1記事のキャッシュ処理を実装する
1.1.1`依存関係を導入する
tensquare_articleのpom.xmlに依存関係を導入します
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
1.1.2
構成ファイル
application.ymlを変更し、スプリングノードの下に構成を追加します
server:
port: 9004
spring:
application:
name: tensquare-article #指定服务名
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.2.2:3306/tensquare_article?characterEncoding=UTF8
username: root
password: 123456
jpa:
database: MySQL
show-sql: true
redis:
host: 192.168.66.133
5.1.3
サービスレイヤー
ArticleServiceを変更してRedisTemplateをインポートし、findByIdメソッドを変更します
/**
* 根据ID查询实体
* @param id
* @return
*/
/*public Article findById(String id) {
//1.先从redis查询是否有该文章数据
BoundValueOperations bos = redisTemplate.boundValueOps("article_" + id);
Article article = (Article)bos.get();
//Article article = (Article)redisTemplate.opsForValue().set("key","value");
//1.1 没有,则从数据库查询
if(article==null){
article = articleDao.findById(id).get();
bos.set(article);
//设置过期时间
bos.expire(30, TimeUnit.SECONDS);
}
//1.2 有,直接返回redis数据
return article;
}*/
public Article findById(String id) {
//1.先从redis查询是否有该文章数据
Article article = (Article)redisTemplate.opsForValue().get("article_"+id);
//1.1 没有,则从数据库查询
if(article==null){
article = articleDao.findById(id).get();
redisTemplate.opsForValue().set("article_"+id,article,30,TimeUnit.SECONDS);
}
//1.2 有,直接返回redis数据
return article;
}
1.2変更または削除後にキャッシュをクリアする
概要:データが変更または削除された場合は、キャッシュから削除する必要があります。キャッシュ内のデータが削除されていない場合、クエリは古いデータを検索します。
ArticleServiceのdeleteメソッドを変更します
/**
* 修改
* @param article
*/
public void update(Article article) {
articleDao.save(article);
//删除缓存
redisTemplate.delete("article_"+article.getId());
}
/**
* 删除
* @param id
*/
public void deleteById(String id) {
articleDao.deleteById(id);
//删除缓存
redisTemplate.delete("article_"+id);
}
1.3キャッシュの有効期限処理
概要、30秒で期限切れになるように設定
1.3.1
方法1
public Article findById(String id) {
//1.先从redis查询是否有该文章数据
BoundValueOperations bos = redisTemplate.boundValueOps("article_" + id);
Article article = (Article)bos.get();
//1.1 没有,则从数据库查询
if(article==null){
article = articleDao.findById(id).get();
bos.set(article);
//设置过期时间
bos.expire(30, TimeUnit.SECONDS);
}
//1.2 有,直接返回redis数据
return article;
}
1.3.2
方法2
public Article findById(String id) {
//1.先从redis查询是否有该文章数据
Article article = (Article)redisTemplate.opsForValue().get("article_"+id);
//1.1 没有,则从数据库查询
if(article==null){
article = articleDao.findById(id).get();
redisTemplate.opsForValue().set("article_"+id,article,30,TimeUnit.SECONDS);
}
//1.2 有,直接返回redis数据
return article;
}