具备条件
redis成功运行,可以用Jedis测试已经连接。需要一个ssm搭建好的框架。
业务添加缓存
步骤的其它代码全部在最底层放
1、给项目添加依赖,StringUtils依赖(commons),Jedis依赖
2、添加已经封装好的Jedis操作类,JsonUtils工具类
3、编写ApplicationContext-redis.xml文件,向容器添加Jedis操作类
4、添加redis信息redis.properties
5、向service层添加缓存(重,4步)
1)、在查询的时候添加缓存(查缓存,空则查数据库入缓存,不空直接去缓存拿数据,key值自己约定)
@Override
public List<Article> queryArticleAllByRootid(int rootid) {
//查询缓存
String cont = jedisClient.hget(key, rootid + "");
try {//缓存存在,从缓存中获取信息
if(StringUtils.isNotBlank(cont)) {
List<Article> list = JsonUtils.jsonToList(cont, Article.class);
return list;
}
} catch (Exception e) {
e.printStackTrace();
}
//缓存不存在,查询数据库
//查询属于同一个rootid的帖子集合并返回
List<Article> list = articleMapper.selectAllByRootid(rootid);
try {
//信息入缓存
jedisClient.hset(key, rootid + "", JsonUtils.objectToJson(list));
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
2)、缓存同步:删除的时候删除缓存
public void deleteArticleById(int id) {
//删除帖子
articleMapper.deleteArticleById(id);
//缓存同步,删除帖子也要删除缓存
String cont = jedisClient.hget(key, id + "");
if(StringUtils.isNotBlank(cont)) {//若缓存存在则删除
try {
jedisClient.hdel(key, id + "");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3)、缓存同步:添加的时候删除缓存
@Override
public void replyArticle(Article article) {
//回复帖子
int rootid = article.getRootid();
//rootid=0就是回复的是主题帖,此时回复的帖子rootid=id;否则回复的是非主题帖此时回复的帖子rootid=rootid,也就不用做操作
if(rootid == 0)
article.setRootid(article.getId());
//回复
articleMapper.replyArticle(article);
//将id的叶子改成1
articleMapper.updateArticleLeafById(article.getId());
//缓存同步,回复帖子也要删除缓存
String cont = jedisClient.hget(key, article.getRootid() + "");
if(StringUtils.isNotBlank(cont)) {//若缓存存在则删除
try {
jedisClient.hdel(key, article.getRootid() + "");
} catch (Exception e) {
e.printStackTrace();
}
}
}
4)、缓存同步:更新的时候删除缓存
机制都一样,我这里因为设计的原因,没有用上。
其它代码信息,工程目录
1、给项目添加依赖
<!-- 引入jedis依赖 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${redis.version}</version>
</dependency>
<!-- 引入commons -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons.version}</version>
</dependency>
<!-- Jedis的版本号 -->
<redis.version>2.7.1</redis.version>
<!-- 引入commons -->
<commons.version>2.6</commons.version>
2、添加已经封装好的Jedis操作类,JsonUtils工具类
JedisClient.java
package com.xue.bbs.common;
import java.util.List;
public interface JedisClient {
String set(String key, String value);
String get(String key);
Boolean exists(String key);
Long expire(String key, int seconds);
Long ttl(String key);
Long incr(String key);
Long hset(String key, String field, String value);
String hget(String key, String field);
Long hdel(String key, String... field);
Boolean hexists(String key, String field);
List<String> hvals(String key);
Long del(String key);
}
JedisClientPool.java
package com.xue.bbs.common;
import java.util.List;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
/**
* Jedis工具类
* @author xuexue
*
*/
public class JedisClientPool implements JedisClient {
private JedisPool jedisPool;
public JedisPool getJedisPool() {
return jedisPool;
}
public void setJedisPool(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
@Override
public String set(String key, String value) {
System.out.println(jedisPool);
Jedis jedis = jedisPool.getResource();
String result = jedis.set(key, value);
jedis.close();
return result;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String result = jedis.get(key);
jedis.close();
return result;
}
@Override
public Boolean exists(String key) {
Jedis jedis = jedisPool.getResource();
Boolean result = jedis.exists(key);
jedis.close();
return result;
}
@Override
public Long expire(String key, int seconds) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key, seconds);
jedis.close();
return result;
}
@Override
public Long ttl(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.ttl(key);
jedis.close();
return result;
}
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.incr(key);
jedis.close();
return result;
}
@Override
public Long hset(String key, String field, String value) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hset(key, field, value);
jedis.close();
return result;
}
@Override
public String hget(String key, String field) {
Jedis jedis = jedisPool.getResource();
String result = jedis.hget(key, field);
jedis.close();
return result;
}
@Override
public Long hdel(String key, String... field) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hdel(key, field);
jedis.close();
return result;
}
@Override
public Boolean hexists(String key, String field) {
Jedis jedis = jedisPool.getResource();
Boolean result = jedis.hexists(key, field);
jedis.close();
return result;
}
@Override
public List<String> hvals(String key) {
Jedis jedis = jedisPool.getResource();
List<String> result = jedis.hvals(key);
jedis.close();
return result;
}
@Override
public Long del(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.del(key);
jedis.close();
return result;
}
}
3、编写ApplicationContext-redis.xml文件,向容器添加Jedis操作类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!--加载redis.properties -->
<!-- <context:property-placeholder location="classpath:conf/redis.properties"/> -->
<!-- 扫描类进来 -->
<!-- <context:component-scan base-package="com.xue.bbs.common" /> -->
<!-- 向Spring容器中添加JedisClientPool操作jedis类 -->
<bean id="jedisClientPool" class="com.xue.bbs.common.JedisClientPool">
<property name="jedisPool" ref="jedisPool"></property>
</bean>
<!-- 向Spring容器中添加JedisPool对象 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
<constructor-arg name="host" value="${redis.ip}"></constructor-arg>
<constructor-arg name="port" value="${redis.port}"></constructor-arg>
<constructor-arg name="timeout" value="${redis.timeout}"></constructor-arg>
<constructor-arg name="password" value="${redis.password}"></constructor-arg>
</bean>
<!-- 向Spring容器中添加资源管理 JedisPool池 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.pool.maxTotal}"/>
<property name="maxIdle" value="${redis.pool.maxIdle}" />
<property name="minIdle" value="${redis.pool.minIdle}"/>
<property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
<property name="testOnReturn" value="${redis.pool.testOnReturn}" />
<property name="testWhileIdle" value="${redis.pool.testWhileIdle}" />
<property name="numTestsPerEvictionRun" value="${redis.pool.numTestsPerEvictionRun}" />
<property name="timeBetweenEvictionRunsMillis" value="${redis.pool.timeBetweenEvictionRunsMillis}" />
</bean>
</beans>
4、添加redis信息redis.properties
#redis信息配置
#redis密码
redis.password=11044a
#redis服务器的IP
redis.ip=192.168.60.100
#redis服务器的Port
redis.port=6379
#redis连接超时时间
redis.timeout=6000
#池的配置
#最大活动对象数
redis.pool.maxTotal=1000
#最大能够保持idel状态的对象数
redis.pool.maxIdle=100
#最小能够保持idel状态的对象数
redis.pool.minIdle=50
#当池内没有返回对象时,最大等待时间
redis.pool.maxWaitMillis=10000
#当调用borrow Object方法时,是否进行有效性检查
redis.pool.testOnBorrow=true
#当调用return Object方法时,是否进行有效性检查
redis.pool.testOnReturn=true
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.
redis.pool.timeBetweenEvictionRunsMillis=30000
#向调用者输出“链接”对象时,是否检测它的空闲超时;
redis.pool.testWhileIdle=true
# 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.
redis.pool.numTestsPerEvictionRun=50
#主页缓存的key
index_article=index_article