Spring4.0整合Redis实用示例

Redis使用之--基于Lettuce实现Spring和Redis的集成(一) 主要从Redis的应用出发,介绍在java项目中,基于lettuce实现spring和redis的集成过程。 集成方案:spring4.x + spring-data-redis1.8.x + lettuce4.2.x 在集成中,不再使用xml配置方式,全部使用spring注解的方式,完成redis的集成。集成后支持redis单机、redis主从哨兵两种部署模式的redis的连接使用。 阅读详情

上篇我们介绍了redis数据的安装与使用,以及顺便介绍了redis一款可视化工具,所以这篇我们开始介绍Spring4.0与Redis的整合,通过两种方式来示例Redis的使用,一种是AOP方式,对所有满足表达式的类与方法进行redis缓存,另一种是使用自定义注解方式达到灵活配置自己需要注解的方法。下面将慢慢介绍如何从一步一步的整合与使用,本文所示范的项目框架为:spring4.0+SpringMVC+Mybatis3.0+CXF+Redis+Maven,此文章仅展示spring+redis整合。

一、Redis介绍

什么是Redis?
      redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
它有什么特点?
(1)Redis数据库完全在内存中,使用磁盘仅用于持久性。
(2)相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。
(3)Redis可以将数据复制到任意数量的从服务器。
Redis 优势?
 (1)异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
 (2)支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。
(3)操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
(4)多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。
Redis 缺点?
(1)单线程
(2)耗内存

二、实用范例

1.maven中引入jar包

<!-- redis缓存依赖 -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>1.6.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.7.3</version>
		</dependency>


2.配置Bean,在application.xml中增加相关配置

<!--加载数据库文件,读取数据库相关信息,加载redis配置信息 -->
	<context:property-placeholder location="classpath:redis.properties" />
<!-- jedis 连接池配置 -->
	<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxIdle" value="${redis.maxIdle}" />
		<property name="maxWaitMillis" value="${redis.maxWait}" />
		<property name="testOnBorrow" value="${redis.testOnBorrow}" />
	</bean>
	<!-- redis 连接工厂 -->
	<bean id="connectionFactory"
		class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
		<property name="poolConfig" ref="poolConfig" />
		<property name="port" value="${redis.port}" />
		<property name="hostName" value="${redis.host}" />
		<!-- <property name="password" value="${redis.password}" /> -->
		<property name="timeout" value="${redis.timeout}"></property>
	</bean>
	<!-- redis操作模板,这里采用尽量面向对象的模板 -->
	<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
		<property name="connectionFactory" ref="connectionFactory" />
		<!-- 如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can't cast to String!!! -->
		<property name="keySerializer">
			<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
		</property>
		<property name="valueSerializer">
			<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
		</property>
	</bean>

	<!-- cache配置 -->
	<bean id="methodCacheInterceptor" class="com.idream.ishare.common.interceptor.MethodCacheInterceptor">
		<property name="redisUtil" ref="redisUtil" />
	</bean>
	<bean id="redisUtil" class="com.idream.ishare.common.utils.RedisUtil">
		<property name="redisTemplate" ref="redisTemplate" />
	</bean>


其中对应的redis.properties配置如下


#redis center
redis.host=127.0.0.1
redis.port=6379
#redis.password=123456
redis.maxIdle=100
redis.maxActive=300
redis.maxWait=1000
redis.testOnBorrow=true
redis.timeout=100000
  
# no cache class
#targetNames=xxxRecordManager,xxxSetRecordManager,xxxStatisticsIdentificationManager 
targetNames=
# no cache method
methodNames= 
  
# cache failure time(s)
#com.service.impl.xxxRecordManager= 60
#com.service.impl.xxxSetRecordManager= 60
defaultCacheExpireTime=100

fep.local.cache.capacity =10000


3.增加相应的工具类与AOP切面类

1)RedisUtil:用来缓存和去除数据的实例

/**
 * redis cache 工具类
 * 
 */
public final class RedisUtil {

	private RedisTemplate<Serializable, Object> redisTemplate;

	/**
	 * 批量删除对应的value
	 * 
	 * @param keys
	 */
	public void remove(final String... keys) {
		for (String key : keys) {
			remove(key);
		}
	}

	/**
	 * 批量删除key
	 * 
	 * @param pattern
	 */
	public void removePattern(final String pattern) {
		Set<Serializable> keys = redisTemplate.keys(pattern);
		if (keys.size() > 0)
			redisTemplate.delete(keys);
	}

	/**
	 * 删除对应的value
	 * 
	 * @param key
	 */
	public void remove(final String key) {
		if (exists(key)) {
			redisTemplate.delete(key);
		}
	}

	/**
	 * 判断缓存中是否有对应的value
	 * 
	 * @param key
	 * @return
	 */
	public boolean exists(final String key) {
		return redisTemplate.hasKey(key);
	}

	/**
	 * 读取缓存
	 * 
	 * @param key
	 * @return
	 */
	public Object get(final String key) {
		Object result = null;
		ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
		result = operations.get(key);
		return result;
	}

	/**
	 * 写入缓存
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean set(final String key, Object value) {
		boolean result = false;
		try {
			ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
			operations.set(key, value);
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 写入缓存
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean set(final String key, Object value, Long expireTime) {
		boolean result = false;
		try {
			ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
			operations.set(key, value);
			redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	public void setRedisTemplate(RedisTemplate<Serializable, Object> redisTemplate) {
		this.redisTemplate = redisTemplate;
	}
}

2)MethodCacheInterceptor
切面MethodCacheInterceptor,对application.xml配置AOP切面中符合切面的类与方法进行拦截,同时加入判断如果缓存存在数据,从缓存取数据。否则第一次从数据库取,并将结果保存到缓存 中去

public class MethodCacheInterceptor implements MethodInterceptor {

	private Logger logger = LoggerFactory.getLogger(MethodCacheInterceptor.class);

	private RedisUtil redisUtil;
	private List<String> targetNamesList; // 不加入缓存的service名称
	private List<String> methodNamesList; // 不加入缓存的方法名称
	private Long defaultCacheExpireTime; // 缓存默认的过期时间

	/**
	 * 初始化读取不需要加入缓存的类名和方法名称
	 */
	public MethodCacheInterceptor() {
		try {
			if (logger.isInfoEnabled()) {
				logger.info("进入redis缓存切面类,MethodCacheInterceptor");
				logger.info("读取redis配置文件redis.properties,其绝对路劲为:"
						+ MethodCacheInterceptor.class.getResource("/redis.properties").getFile());
			}
			File f = new File(MethodCacheInterceptor.class.getResource("/redis.properties").getFile());
			// 配置文件位置直接被写死,有需要自己修改下
			InputStream in = new FileInputStream(f);
			Properties p = new Properties();
			p.load(in);
			// 分割字符串
			String[] targetNames = p.getProperty("targetNames").split(",");
			String[] methodNames = p.getProperty("methodNames").split(",");

			// 加载过期时间设置
			defaultCacheExpireTime = Long.valueOf(p.getProperty("defaultCacheExpireTime"));
			// 创建list
			targetNamesList = new ArrayList<String>(targetNames.length);
			methodNamesList = new ArrayList<String>(methodNames.length);
			Integer maxLen = targetNames.length > methodNames.length ? targetNames.length : methodNames.length;
			// 将不需要缓存的类名和方法名添加到list中
			for (int i = 0; i < maxLen; i++) {
				if (i < targetNames.length) {
					targetNamesList.add(targetNames[i]);
				}
				if (i < methodNames.length) {
					methodNamesList.add(methodNames[i]);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		
		if (logger.isInfoEnabled()) {
			logger.info("进入redis缓存切面类的invoke方法,MethodCacheInterceptor.invoke(invocation)");
		}
		
		Object value = null;

		String targetName = invocation.getThis().getClass().getName();
		String methodName = invocation.getMethod().getName();
		
		Boolean isNeedCache=isAddCache(targetName, methodName);
		if (logger.isInfoEnabled()) {
			logger.info("判断当前类和方法是否不需要缓存(配置文件中设定有默认的非缓存类和方法),是否需要缓存:"+isNeedCache);
		}
		if (!isNeedCache) {
			// 若不需要缓存则执行方法返回结果
			return invocation.proceed();
		}
		Object[] arguments = invocation.getArguments();
		String key = getCacheKey(targetName, methodName, arguments);
		if (logger.isInfoEnabled()) {
			logger.info("获取缓存key="+key);
		}
		try {
			if (logger.isInfoEnabled()) {
				logger.info("判断是否存在缓存,isExist:"+redisUtil.exists(key));
			}
			// 判断是否有缓存
			if (redisUtil.exists(key)) {
				if (logger.isInfoEnabled()) {
					logger.info("若该key对应的缓存已存在,则直接返回缓存值,value="+redisUtil.get(key));
				}
				return redisUtil.get(key);
			}
			// 写入缓存
			value = invocation.proceed();
			if (logger.isInfoEnabled()) {
				logger.info("若该key对应的缓存不存在,则反射获取当前方法返回结果作为该key的缓存值value="+value);
			}
			if (value != null) {
				final String tkey = key;
				final Object tvalue = value;
				new Thread(new Runnable() {
					@Override
					public void run() {
						if (logger.isInfoEnabled()) {
							logger.info("写入当前key对应的value,{key:"+tkey+",value:"+tvalue+"}");
						}
						redisUtil.set(tkey, tvalue, defaultCacheExpireTime);

					}
				}).start();
			}
		} catch (Exception e) {
			e.printStackTrace();
			if (value == null) {
				return invocation.proceed();
			}
		}
		return value;
	}

	/**
	 * 是否加入缓存
	 * 
	 * @return
	 */
	private boolean isAddCache(String targetName, String methodName) {
		boolean flag = true;
		if (targetNamesList.contains(targetName) || methodNamesList.contains(methodName)) {
			flag = false;
		}
		return flag;
	}

	/**
	 * 创建缓存key
	 * 
	 * @param targetName
	 * @param methodName
	 * @param arguments
	 */
	private String getCacheKey(String targetName, String methodName, Object[] arguments) {
		StringBuffer sbu = new StringBuffer();
		sbu.append(targetName).append("_").append(methodName);
		if ((arguments != null) && (arguments.length != 0)) {
			for (int i = 0; i < arguments.length; i++) {
				sbu.append("_").append(arguments[i]);
			}
		}
		return sbu.toString();
	}

	public void setRedisUtil(RedisUtil redisUtil) {
		this.redisUtil = redisUtil;
	}
}

4.最后我们开始配置xml以确定那些类与方法需要进行缓存
1)方式一:AOP切面方式,在application.xml中增加如下AOP配置

<aop:config>
		<aop:pointcut id="redisMethodCachePointcut"
			expression="execution(* com.idream.ishare.*.service.impl.*.*(..))" />
		<aop:advisor advice-ref="methodCacheInterceptor"
			pointcut-ref="redisMethodCachePointcut" />
	</aop:config>

由上可知我们是对符合expression表达式的所有类与方法都进行缓存。(至此,AOP切面方式的spring与redis集成已全部完毕,下面测试中会给出相应示例)

2)方式二:使用自定义注解的方式来灵活标识那些方法需要惊醒Redis缓存

首先我们需要添加自定义注解RedisCache
/**
 * redis缓存
 * @author HASEE
 *
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RedisCache {
	
	/**
	 * key
	 * @return
	 */
	String key() default "";
	
	/**
	 * value
	 * @return
	 */
	String value() default "";
	
}

然后在application.xml中增加对该注解的过滤匹配,标识所有添加注解的方法都需要缓存

<aop:config>
		<aop:pointcut id="redisMethodCachePointcut"
			expression="@annotation(com.idream.ishare.common.annotation.RedisCache)" />
		<aop:advisor advice-ref="methodCacheInterceptor"
			pointcut-ref="redisMethodCachePointcut" />
	</aop:config>

最后在我们需要缓存的方法中增加注解即可


@RedisCache
	public DataResult<UserRegistVO> queryUserByName(String userAccount) {
		DataResult<UserRegistVO> dataResult = new DataResult<UserRegistVO>();
		UserRegistVO userRegistVO=new UserRegistVO();
		if (!StringUtils.isEmpty(userAccount)) {
			userRegistVO.setUserAccount(userAccount);
			UserRegistVO uRegistVO = registerDao.queryUserByName(userRegistVO);
			dataResult.setData(uRegistVO);
			if (uRegistVO != null) {
				dataResult.setMsgCode(200);
				dataResult.setMessage("该用户已存在");
			} else {
				dataResult.setMsgCode(404);
				dataResult.setMessage("该用户不存在"); 
			}
		} else {
			dataResult.setData(userRegistVO);
			dataResult.setMsgCode(500);
			dataResult.setMessage("请检查用户名是否输入");
		}
		return dataResult;
	}

至此,在项目中,有该注解的地方才会使用缓存,没有注解的地方与普通的方法一样。
个人比较推荐第二种方式来进行redis缓存配置,原因就不用多说。

三、redis测试
1.首先我们测试AOP方式,将以下两个方法均请求一次,看控制台输出日志




控制台输出


通过日志我们可以看到,AOP的方式对于两个方法均进行了缓存判断,即使用缓存


2.我们测试自定义注解方式,将以下两个方法均请求一次(与AOP不同的是,这次仅在queryUserByName方法中增加@RedisCache注解),看控制台输出日志



控制台日志输出


在这一次测试中,仅有添加了注解的方法才进入的缓存,没有注解的方法与普通方法一样。


最后我们看使用缓存后所达到的效果(此处使用注解方式所打印的日志)




第一次请求的时候判断是否存在缓存的时候结果为false,然后查询数据将查询的将结果写入了缓存中;
第二次请求的时候判断是否存在缓存的时候结果为true,然后直接返回缓存中的结果集。


至此我们介绍完了Spring集成Redis.


深入Spring Boot :整合Redis详解 Spring Data Redis是Spring Data项目中的一个主要模块,它提供了从Spring应用程序中轻松配置和访问Redis的功能、提供了与应用交互的低级和高级抽象,使开发者摆脱了对基础结构的关注,例如提供了RedisCacheManager。从Spring3.1开始,Spring框架提供了对Cache的支持,提供了一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种annotation,即能够达到缓存方法的返回对象的作用。添加图片注释,不超过 140 字(可选)... 阅读详情

相关推荐

spring4.0结合redis3.0

spring4.0结合redis3.0需要的jar

spring data redisTemplate操作redis多个数据库

问题场景: 最近的项目需要同时操作一个redis中多个数据库,然后发现redisTemplate中并没有提供什么切换数据库的方法 这引起了我的思考 原因分析: 我们使用springboot redisTemplate最常规的做法就是在配置文件中配置redis的url, 然后springboot自动注入配置自动生成redisTemplate这个bean 但这里也没有提及redis0到15号数据库的选择 代码分析 RedisTemplate继承RedisAccessor类 在RedisAccessor中有这样

Danwich的博客 998

配置Spring4.0注解Cache+Redis缓存的用法

本篇文章主要介绍了详解配置Spring4.0注解Cache+Redis缓存的用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Redis使用之--基于Lettuce实现Spring和Redis的集成(二)

spring5.x + spring-data-redis2.x + lettuce5.x实现spring和redis的集成

田sir的博客 1525

[Unity]-[UI]-[Image] 关于UI精灵图资源导入设置的详细解释

如果纹理存储了有特定含义的信息,并且您需要着色器中的确切值(例如,平滑度或金属度),请禁用此属性。此选项允许将纹理编码为特定格式(RGBM 或 dLDR,具体取决于平台)并通过后期处理步骤对纹理数据进行处理(推拉式扩张通道)。使用在3D模型的专业法线贴图。通用的纹理类型,一般在Material上的材质图片参数使用,比如漫反射、法线贴图这些。​​Compression​​:ASTC 6x6(移动端)或DXT5(PC)​​Compression​​:BC5(PC)或ASTC 6x6(移动端)

sky_smile_Allen的博客 2171

AI:Coze、Dify、n8n:三款低代码工具如何选?

Coze、Dify、n8n:三款低代码工具如何选?

Kant2048的博客 2806

Spring4.*+Redis整合使用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34223655的博客 997

基于立创EDA的8口全千兆POE交换机设计详解:RTL8370N芯片与90W大功率供电方案

本文详细解析了基于立创EDA设计的8口全千兆POE交换机方案,核心采用RTL8370N交换芯片与支持90W大功率供电的IEEE 802.3bt标准PD芯片。文章深入探讨了PSE/PD供电管理、电源架构设计、电路细节及关键散热方案,为DIY或学习POE交换机硬件设计提供了完整的开源实践指南。

weixin_29050829的博客 1万+

Redis 讲解系列之 与Spring集成

本章我们将实例讲解Redis如何与Spring整合。由于Redis与Spring的整合手段比较多,本章将着重讲解Spring与Spring-data-redis整合。

2401_83384536的博客 782

阿里云CDN HTTPS 证书配置流程

可以使用HTTPS方式访问资源,如果浏览器中URL旁边出现锁的HTTPS标识,表示HTTPS安全加速已生效。: 证书配置完成后,需要留意证书过期时间并在证书过期前手动配置新的证书。注意 ⚠️ 一定是需要复制 以下标识之间的内容。如果已在阿里云数字证书管理服务中购买了证书,请选择。,该证书将在阿里云数字证书管理服务中保存。如果使用第三方服务商签发的证书,请选择。第四步,在指定域名的左侧导航栏,单击。第二步,在左侧导航栏,单击。开关,并配置证书相关参数。页面,找到目标域名,单击。中选择已购买的证书。

w风雨无阻w的专栏 2208

ESP32-C5硬件设计全链路指南:ADC/SDIO/USB/RF PCB实战

模数转换器(ADC)和高速外设接口是嵌入式系统硬件设计的核心基础。理解ADC通道映射、输入阻抗特性与抗干扰布线,是保障传感器采样精度的前提;掌握SDIO、USB差分信号的阻抗控制、端接策略与电源去耦方法,则直接决定通信可靠性与EMC性能。在Wi-Fi 6/Bluetooth 5.3双模SoC如ESP32-C5中,ADC复用约束、USB与SDIO管脚冲突、RF匹配网络调校、四层板叠层规划等工程细节,共同构成高成功率PCB落地的关键技术栈。本文聚焦ESP32-C5平台,系统梳理从模拟前端到射频输出的硬件设计规范

weixin_35756130的博客 345

简单示例:Spring4 整合 单个Redis服务

1. 引入spring-data-redis.jar   API:https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/package-summary.html#package.description 2. spring配置文件添加如下配置 &lt;!-- re...

weixin_33861800的博客 133

我的宠物狗学编程:从零开始的代码之旅

在这个示例中,我们定义了一个名为"interact"的函数,它通过输入函数获取用户的输入,并根据输入执行相应的代码块。在编程中,我们使用条件语句来根据不同的条件执行不同的代码块。对于我的狗狗,我将创建一个名为"feed"的函数来表示它的进食行为,并根据不同的条件输出不同的信息。在这个示例中,我们定义了一个名为"feed"的函数,并使用一个参数"food"来表示食物。对于我的狗狗,我将创建一个名为"dog_name"的变量来存储它的名字。对于我的狗狗,我将创建一个名为"bark"的函数来表示它的叫声。

2301_79331387的博客 333

Spring Boot整合Redis

Redis 基于内存进行存储,支持key-value的存储形式,底层是用C语言进行编写的 基于key-value形式的数据字典,结构简单,没有数据表的概念,直接用键值对形式完成数据的管理。 支持5种数据类型: 字符串 列表 集合 有序集合 哈希 搭建Redis环境 在windows上安装Redis 下载Redis https://github.com/MicrosoftArchive/redis/tags 如不能进入Github,可以到https://download.csdn.net/downl

zjojk的博客 1万+

立项书8分钟定生死?手把手教你用ChatGPT辅助打造高水平申报书,让评审专家一看就想打高分!

宏大叙事、空话堆砌只会让评审绕晕,不如聚焦一个具体问题,拿出清晰的研究路径、扎实的设计方案,把“我想做什么、为什么做、打算怎么做”讲明白。对评审来说,关键不在你读了多少,而在你能否看清领域的共识、争议和空白,GPT的作用就在于帮你理清研究脉络,发现问题结构,聚焦那些还没被充分讨论的变量或方法,去提升综述的深度。之前要用到ProcessOn、Draw.io等工具画流程图,现在有了ai虽然方便了,但也需要多次调教,如果嫌麻烦,七哥给大家准备了课题申报常用的流程图,技术路线图,方便大家直接拿来编辑填空使用。

智能AI让学术科研更容易 290

下载和运行GitHub上的代码教程总结

从昨天开始就想着从GitHub上下载一个开源的Vue的实战项目,希望能从中学习更多的Vue的实用内容,结果搞了半天好不容易下载了,不知道怎么弄。然而,今天终于成功了,激动地我赶紧来记录一下。 如何从GitHub上下载自己需要的项目: 1.首先,你要有一个自己的GitHub(https://github.com/)的账号。关于如何注册GitHub的账号以及如何获取你的SSH密钥这个问题,请大家参...

不怕万人阻挡,只怕自己投降 29万+

Spring和Redis整合详解

Spring和Redis整合详解 官方主页 Spring Spring Redis 概述 Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库,缓存和消息代理。 简单来说,它是一个以(key,value)的形式存储数据的数据库. 官网:https://redis.io/download 去下载对应的版本。 Spring已经为我们对Redis做了很好的封装,我们需要做的就是配置和Serc...

feiyangtianyao的专栏 7万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring整合Redis

本文将简要介绍如何在Spring中集成Jedis,配置连接池、数据序列化等内容,并通过封装工具类来优化Redis的使用体验。

懒惰蜗牛的博客 2758

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring 整合 Redis

pom构建: 4.0.0 com.x.redis springredis 0.0.1-SNAPSHOT org.springframework.data spring-data-redis 1.0.2.RELEASE org.springframework spring-test 3.1.2.

天行健,君子以自强不息 18万+

Spring4 整合 Redis

pom构建: [html] view plain copy  print? modelVersion>4.0.0modelVersion>   groupId>com.x.redisgroupId>   artifactId>springredisartifactId>   version>0.0.1-SNAPSHOTversion>  

kuandai225的博客 1555

【详解】Spring整合Redis

通过上述步骤,我们成功地在Spring Boot项目中集成了Redis,并实现了基本的数据存储和读取功能。Redis的强大之处在于其高性能和丰富的数据结构支持,这使得它成为缓存和消息队列等场景的理想选择。希望本文对大家有所帮助,如果有任何问题或建议,欢迎留言交流!以上就是关于Spring整合Redis的技术博客文章,希望能对你的学习和工作有所帮助。当然可以!Spring框架与Redis的整合在现代Web应用中非常常见,特别是在需要缓存数据以提高性能的情况下。

牛肉胡辣汤 1972

Spring基于注解整合Redis

本文介绍了如何使用Spring注解来整合Redis,并使用缓存相关的注解来简化对Redis的操作。当方法被调用时,Spring会先检查缓存中是否存在对应的结果,如果存在,则直接返回缓存的结果;电子商务网站,我们可以使用Redis作为商品信息的缓存,以提高访问速度和减轻数据库的压力。当方法被调用时,Spring会先执行该方法,并将结果存入缓存,而不会去检查缓存中是否已存在。方法时,如果该商品信息已存在于缓存中,则直接从缓存中获取,避免了频繁地访问数据库,提升了访问速度和性能。实例,并配置了连接工厂。

牛肉胡辣汤 1422

spring boot 整合redis

1.简介spring boot提供了spring-data-redis库来整合redis的操作,并通过简单的配置信息实现与redis的整合。2.准备工作安装redis缓存数据库,安装可视化工具,推荐使用:rdm。3.redis简介REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使

深存少年梦 7133

Spring Boot——整合Redis

Redis(Remote Dictionary Server)是一个开源的内存数据存储系统,它以键值对(key-value)的形式存储数据,并提供了多种数据结构的支持。Spring Boot简介。

秋书一叶的博客 8071
上一篇: Windows 64位下安装Redis详细教程以及RedisManager的使用
下一篇: spring整合mybatis ORA-00911: 无效字符问题解决方式
simon-hacker
博客等级 码龄12年 4粉丝 23原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值