前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis在分布式项目中的应用

Redis在分布式项目中的应用

作者头像
时间静止不是简史
发布2020-07-25 23:54:34
4150
发布2020-07-25 23:54:34
举报
文章被收录于专栏:Java探索之路Java探索之路

利用Redis在分布式项目中实现数据缓存

  • 介绍
  • 使用步骤
    • 前提
    • 步骤
      • 1. 添加Jedis坐标
      • 2. 创建 cache.properties
      • 3. 创建jedis 配置值文件
      • 4. 修改 Dao层实现类
      • 运行结果 :
  • 补充: 缓存同步思想
    • 介绍
    • 实现思路

介绍

Redis作为一个开源的使用 ANSIC 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库. 主要用于在大型分布式项目中对数据库查询到的结果进行缓存 . 减轻数据库压力, 提升项目响应速度 .

利用Redis 将查询到的将查询到的结果进行缓存 .每次通过访问它的key ,如果键存在,则将键所对应的的值返回 ; 如果不存在 , 则将值放入 redis的数据库中进行缓存 .

使用步骤

前提

  • 安装Redis或Redis集群
  • Maven环境的搭建(用于项目构建和项目管理)

步骤

1. 添加Jedis坐标

Jedis为java整合Redis后的jar ,添加该坐标后, 即可利用java代码来操作Redis数据库

代码语言:javascript
复制
<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>>2.7.2</version>
	</dependency>

2. 创建 cache.properties

放在src目录下, 在这个properties 配置文件中 ,用于创建查询到数据库结果后,存放value 所对应的 key .根据是否有key ,我们可以判断Redis数据库对是否对查询结果进行了缓存 .(Redis是key-value数据库 , key 代表键,value 代表值) cache.properties

代码语言:javascript
复制
ITEM_CAT=ITEM_CAT_KEY

3. 创建jedis 配置值文件

主要需要修改的有:

  • 加载cache.properties 的文件位置
  • 配置redis.clients.jedis.JedisCluster(ip , 端口号)

applicationContext-service.xml

代码语言:javascript
复制
<?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目录下 ),如下

代码语言:javascript
复制
<!-- 指定spring的配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring/applicationContext-*.xml</param-value>
	</context-param>

4. 修改 Dao层实现类

使用方式

  • 通过@value使用el表达式注入cache.properties 配置文件中的key
  • 注入jedis集群对象
  • 对返回结果进行判断 ,jeids数据库中查询是否有该缓存,有则返回 ,无则添加( 对应注释 abcd )
  • 根据需要 ,看是否设置失效时间
代码语言:javascript
复制
@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层实现类查询到缓存中的数据和数据 库数据不一致,出现脏读。 这时候就需要完成缓存和数据库之间数据的同步.

实现思路

  1. 可以设置 key 的生命周期,定期的和数据库同步 .
  2. 当项目对数据库数据完成增删改的时候,清空 redis 中缓存的数据 ;项目重新调用远程服务获得(执行查询操作)数据,再次将查询到的结果放入缓存中

例:简单类型数据的删除 ,调用的是del()方法,详情见本人redis 技术详解.

代码语言:javascript
复制
	jedisCluster.del(itemCatkey);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 利用Redis在分布式项目中实现数据缓存
  • 介绍
  • 使用步骤
    • 前提
      • 步骤
        • 1. 添加Jedis坐标
        • 2. 创建 cache.properties
        • 3. 创建jedis 配置值文件
        • 4. 修改 Dao层实现类
        • 运行结果 :
    • 补充: 缓存同步思想
      • 介绍
        • 实现思路
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档