今日内容一:Redis的安装
可去我的博客各种服务器安装目录下redis服务器安装
今日内容二:Redis集群的搭建
今日内容三:Jedis
连接单机版:
需要将jedis的jar包依赖到e3-common工程里面
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
/**
* 连接单机版
*/
@Test
public void testJedis() {
// 第一步:创建一个Jedis对象。需要指定服务端的ip及端口。
Jedis jedis = new Jedis("192.168.25.128",6379);
// 第二步:使用Jedis对象操作数据库,每个redis命令对应一个方法。
String string = jedis.get("hello");
// 第三步:打印结果。
System.out.println(string);
// 第四步:关闭Jedis
jedis.close();
}
连接单机版使用连接池:
/**
* 连接单机版使用连接池
*/
@Test
public void testJedisPool(){
// 第一步:创建一个JedisPool对象。需要指定服务端的ip及端口
JedisPool pool = new JedisPool("192.168.25.128",6379);
// 第二步:从JedisPool中获得Jedis对象。
Jedis jedis = pool.getResource();
// 第三步:使用Jedis操作redis服务器。
jedis.set("hello1", "xiaoling");
// 第四步:操作完毕后关闭jedis对象,连接池回收资源。
System.out.println(jedis.get("hello1"));
jedis.close();
// 第五步:关闭JedisPool对象。
pool.close();
}
连接集群版:
/**
* 连接集群版
*/
@Test
public void testJedisCluster(){
// 第一步:使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。
Set<HostAndPort> node = new HashSet<>();
node.add(new HostAndPort("192.168.25.128",7001));
node.add(new HostAndPort("192.168.25.128",7002));
node.add(new HostAndPort("192.168.25.128",7003));
node.add(new HostAndPort("192.168.25.128",7004));
node.add(new HostAndPort("192.168.25.128",7005));
node.add(new HostAndPort("192.168.25.128",7006));
// 第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。
JedisCluster jedisCluster = new JedisCluster(node);
jedisCluster.set("xingning", "xiaoling");
// 第三步:打印结果
String string = jedisCluster.get("xingning");
System.out.println(string);
// 第四步:系统关闭前,关闭JedisCluster对象。
jedisCluster.close();
}
今日内容四:向业务逻辑中添加缓存
接口封装:常用的操作redis的方法提取出一个接口,分别对应单机版和集群版创建两个实现类。
/**
* 封装了Redis使用的方法
* <p>Title: JedisClient</p>
* <p>Description: </p>
* <p>Company: www.itcast.cn</p>
* @version 1.0
*/
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);
}
单机版实现类:
/**
* 单机版实现类
* <p>Title: JedisClientPool</p>
* <p>Description: </p>
* <p>Company: www.itcast.cn</p>
* @version 1.0
*/
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) {
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;
}
集群版实现类:
/**
* 集群版实现类
* <p>Title: JedisClientCluster</p>
* <p>Description: </p>
* <p>Company: www.itcast.cn</p>
* @version 1.0
*/
public class JedisClientCluster implements JedisClient {
private JedisCluster jedisCluster;
public JedisCluster getJedisCluster() {
return jedisCluster;
}
public void setJedisCluster(JedisCluster jedisCluster) {
this.jedisCluster = jedisCluster;
}
@Override
public String set(String key, String value) {
return jedisCluster.set(key, value);
}
@Override
public String get(String key) {
return jedisCluster.get(key);
}
@Override
public Boolean exists(String key) {
return jedisCluster.exists(key);
}
@Override
public Long expire(String key, int seconds) {
return jedisCluster.expire(key, seconds);
}
@Override
public Long ttl(String key) {
return jedisCluster.ttl(key);
}
@Override
public Long incr(String key) {
return jedisCluster.incr(key);
}
@Override
public Long hset(String key, String field, String value) {
return jedisCluster.hset(key, field, value);
}
@Override
public String hget(String key, String field) {
return jedisCluster.hget(key, field);
}
@Override
public Long hdel(String key, String... field) {
return jedisCluster.hdel(key, field);
}
@Override
public Boolean hexists(String key, String field) {
return jedisCluster.hexists(key, field);
}
@Override
public List<String> hvals(String key) {
return jedisCluster.hvals(key);
}
@Override
public Long del(String key) {
return jedisCluster.del(key);
}
单机版和集群版只需要在spring 里面的配置文件打开注释和关闭注释即可,两者只能存在一个,需要独立的创建一个配置文件:applicationContext-redis.xml。配置如下:
<!-- 连接redis单机版 -->
<bean id="jedisClientPool" class="cn.e3mall.common.jedis.JedisClientPool">
<property name="jedisPool" ref="jedisPool"></property>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
<!-- 连接集群版 -->
<!-- <bean id="jedisClientCluster" class="cn.e3mall.common.jedis.JedisClientCluster">
<property name="jedisCluster" ref="jedisCluster"></property>
</bean>
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes" >
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
<constructor-arg name="port" value="7001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
<constructor-arg name="port" value="7002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
<constructor-arg name="port" value="7003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
<constructor-arg name="port" value="7004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
<constructor-arg name="port" value="7005"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.128"></constructor-arg>
<constructor-arg name="port" value="7006"></constructor-arg>
</bean>
</set>
</constructor-arg>
</bean> -->
.封装代码测试:
/**
* 单机版和集群版代码测试
* <p>Title: testJedisClient</p>
* <p>Description: </p>
*/
@Test
public void testJedisClient(){
//初始化Spring容器
ApplicationContext application = new ClassPathXmlApplicationContext(
"classpath:spring/applicationContext-redis.xml");
//从容器中获得JedisClient对象
JedisClient jedisClient = application.getBean(JedisClient.class);
jedisClient.set("test", "JedisclientTest");
System.out.println(jedisClient.get("test"));
}
向业务逻辑中添加缓存:
功能分析:
查询内容列表时添加缓存。
1、查询数据库之前先查询缓存。
2、查询到结果,直接响应结果。
3、查询不到,缓存中没有需要查询数据库。
4、把查询结果添加到缓存中。
5、返回结果。
注意:添加缓存不能影响正常业务逻辑。
/**
* 根据内容分类id查询内容列表
* <p>Title: getContentListByCid</p>
* <p>Description: </p>
* @param cid
* @return
* @see cn.e3mall.content.service.ContentService#getContentListByCid(long)
*/
@Override
public List<TbContent> getContentListByCid(long cid) {
try {
//查询缓存
//如果缓存中有直接响应结果
String json = jedisClient.hget(COUNTENT_LIST, cid + "");
//判断json不为空,查询缓存 将json转换成list
if(StringUtils.isNotBlank(json)){
List<TbContent> list = JsonUtils.jsonToList(json, TbContent.class);
return list;
}
} catch (Exception e) {
e.printStackTrace();
}
//如果没有查询数据库
TbContentExample example = new TbContentExample();
Criteria criteria = example.createCriteria();
//设置查询条件
criteria.andCategoryIdEqualTo(cid);
//执行查询
List<TbContent> list = contentMapper.selectByExampleWithBLOBs(example);
//把结果添加到缓存
try {
jedisClient.hset(COUNTENT_LIST, cid +"" , JsonUtils.objectToJson(list));
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
COUNTENT_LIST代表的是在redis缓存中创建一个key值,不能写死,创建一个配置文件resource.propertoes:
COUNTENT_LIST=COUNTENT_LIST
需要在dao.xml中加载配置文件:
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:conf/*.properties" />
@Override
public E3Result addContent(TbContent content) {
//将内容数据插入到内容表
content.setCreated(new Date());
content.setUpdated(new Date());
//插入到数据库
contentMapper.insert(content);
//缓存同步,删除缓存中对应的数据。
jedisClient.hdel(COUNTENT_LIST, content.getCategoryId().toString());
return E3Result.ok();
}