Redis实战====向业务层添加缓存

具备条件

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值