Redis作为一个开源的使用 ANSIC 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库. 主要用于在大型分布式项目中对数据库查询到的结果进行缓存 . 减轻数据库压力, 提升项目响应速度 .
利用Redis 将查询到的将查询到的结果进行缓存 .每次通过访问它的key ,如果键存在,则将键所对应的的值返回 ; 如果不存在 , 则将值放入 redis的数据库中进行缓存 .
Jedis为java整合Redis后的jar ,添加该坐标后, 即可利用java代码来操作Redis数据库
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>>2.7.2</version>
</dependency>
放在src目录下, 在这个properties 配置文件中 ,用于创建查询到数据库结果后,存放value 所对应的 key .根据是否有key ,我们可以判断Redis数据库对是否对查询结果进行了缓存 .(Redis是key-value数据库 , key 代表键,value 代表值) cache.properties
ITEM_CAT=ITEM_CAT_KEY
主要需要修改的有:
applicationContext-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!-- 加载cache.properties -->
<context:property-placeholder location="classpath:cache.properties"/>
<!-- 实例化JedisCluster -->
<bean id="cluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.179.131"></constructor-arg>
<constructor-arg name="port" value="8001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.179.131"></constructor-arg>
<constructor-arg name="port" value="8002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.179.131"></constructor-arg>
<constructor-arg name="port" value="8003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.179.131"></constructor-arg>
<constructor-arg name="port" value="8004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.179.131"></constructor-arg>
<constructor-arg name="port" value="8005"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.179.131"></constructor-arg>
<constructor-arg name="port" value="8006"></constructor-arg>
</bean>
</set>
</constructor-arg>
</bean>
</beans>
注意 : 要让spring的相关配置文件生效 ,需要在web.xml中对其所在目录进行扫描( jedis的配置文件就在src的spring目录下 ),如下
<!-- 指定spring的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
使用方式
@Service
public class PortalItemCatServiceImpl implements PortalItemCatService{
@Autowired
private ItemCatService itemCatServiceProxy;
@Value("${ITEM_CAT}")
private String itemCatkey;//a.设置redis数据库缓存的键名
@Autowired
private JedisCluster jedisCluster;//b. 注入jedis集群对象
@Override
public String loadItemCatService() {
//c 到jeids数据库中查询是否有该缓存,有则返回
String jedisStr = jedisCluster.get(itemCatkey);
if (!StringUtils.isEmpty(jedisStr)) {
return jedisStr;
}
//1 远程调用服务
List<TbItemCat> list = this.itemCatServiceProxy.loadItemCatList();//获取查询到的结果,list集合
//2 创建catResult对象, 封装响应到前台数据格式
CatResult result = new CatResult();
//3 将list集合转化成符合前端规范的数据格式,递归遍历
List<?>data= getChildren(0L, list);//父id,long类型
result.setData(data);
//4 将reslut序列化为json串
String str = JsonUtils.objectToJson(result);
System.out.println("Str"+str);
//d 到jeids数据库中查询是否有该缓存,无则设置
jedisCluster.set(itemCatkey, str);
jedisCluster.expire(itemCatkey, 86400);//设置失效时间
return str;
}
}
}
从结果可以看出 ,查询到的结果被保存到了第二个和第五个Reids数据库中 ,这是因为搭建环境( 3主3从,2主5从) .在将数据库保存到redis集群的时候, 他们并不会将查询到的数据缓存到集群中的所有数据库中 ,而是随机缓存到了一个主从数据库中 ,既能保证数据的不易丢失也防止了数据库的过度冗余. 另外需要注意Redis 主从数据集群中实现了读写分离 , Master 只负责写和同步数据给 Slave,Slave 负责被读的任务,通过 Slave 的扩容提高读的速度。
需要搭建这样的主从数据库请跳转至: https://blog.csdn.net/qq_43371556/article/details/97174726
当前项目对数据库数据进行了增删改操作后,dao层实现类查询到缓存中的数据和数据 库数据不一致,出现脏读。 这时候就需要完成缓存和数据库之间数据的同步.
例:简单类型数据的删除 ,调用的是del()方法,详情见本人redis 技术详解.
jedisCluster.del(itemCatkey);