在实际使用缓存的过程中,我们希望放入缓存的并不是一个String类型参数而是一个Object对象,而且希望从缓存中取出的也是一个Object对象
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:task="http://www.springframework.org/schema/task" xmlns:util="http://www.springframework.org/schema/util" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd "> <aop:aspectj-autoproxy /> <context:annotation-config /> <context:component-scan base-package="com.cathy.demo.redis.*" /> <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool"> <constructor-arg index="0" ref="jedisPoolConfig" /> <constructor-arg index="1"> <list> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg name="host" value="127.0.0.1" /> <constructor-arg name="port" value="6379" /> <constructor-arg name="timeout" value="2000" /> </bean> </list> </constructor-arg> </bean> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="50" /> <property name="maxIdle" value="8" /> <property name="testOnBorrow" value="true" /> <property name="testOnReturn" value="true" /> </bean> <bean id="redisClient" class="com.cathy.demo.redis.RedisClientImpl"/> <bean id="redisExecuteTemplate" class="com.cathy.demo.redis.RedisExecuteTemplate"/> </beans>
** * 序列化工具 * @author zhangwei_david * @version $Id: SerializationUtil.java, v 0.1 2014年12月31日 下午5:41:35 zhangwei_david Exp $ */ public class SerializationUtil { private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<Class<?>, Schema<?>>(); private static Objenesis objenesis = new ObjenesisStd(true); private static <T> Schema<T> getSchema(Class<T> clazz) { @SuppressWarnings("unchecked") Schema<T> schema = (Schema<T>) cachedSchema.get(clazz); if (schema == null) { schema = RuntimeSchema.getSchema(clazz); if (schema != null) { cachedSchema.put(clazz, schema); } } return schema; } /** * 序列化 * * @param obj * @return */ public static <T> byte[] serializer(T obj) { @SuppressWarnings("unchecked") Class<T> clazz = (Class<T>) obj.getClass(); LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE); try { Schema<T> schema = getSchema(clazz); return ProtostuffIOUtil.toByteArray(obj, schema, buffer); } catch (Exception e) { throw new IllegalStateException(e.getMessage(), e); } finally { buffer.clear(); } } /** * 反序列化 * * @param data * @param clazz * @return */ public static <T> T deserializer(byte[] data, Class<T> clazz) { try { T obj = objenesis.newInstance(clazz); Schema<T> schema = getSchema(clazz); ProtostuffIOUtil.mergeFrom(data, obj, schema); return obj; } catch (Exception e) { throw new IllegalStateException(e.getMessage(), e); } } }
/** * * @author zhangwei_david * @version $Id: RedisTemplate.java, v 0.1 2015年6月6日 下午6:21:26 zhangwei_david Exp $ */ @Component public class RedisExecuteTemplate { @Autowired private ShardedJedisPool shardedJedisPool; public ShardedJedis getRedisClient() { try { ShardedJedis shardJedis = shardedJedisPool.getResource(); return shardJedis; } catch (Exception e) { } return null; } @SuppressWarnings("deprecation") public void returnResource(ShardedJedis shardedJedis) { shardedJedisPool.returnResource(shardedJedis); } public Object excute(ExecuteCallback executeCallback) { ShardedJedis shardedJedis = getRedisClient(); if (shardedJedis == null) { return null; } try { // 通过回调方法执行具体执行 return executeCallback.command(shardedJedis); } catch (Exception e) { } finally { // 释放资源 returnResource(shardedJedis); } return null; } /** * * * @author zhangwei_david * @version $Id: RedisExecuteTemplate.java, v 0.1 2015年6月6日 下午7:45:58 zhangwei_david Exp $ */ public interface ExecuteCallback { public Object command(ShardedJedis shardedJedis); } }
/** * * @author zhangwei_david * @version $Id: RedisClient.java, v 0.1 2015年6月6日 下午7:38:43 zhangwei_david Exp $ */ public interface RedisClient { /** * * * @param key * @param obj * @param expire * @return */ public boolean putObjectWithExpire(String key, Object obj, long expire); /** * * 从Redis缓存中获取key指定的对象 * @param key * @param clazz * @return */ public Object getObjectByKey(String key, Class<?> clazz); }
/** * * @author zhangwei_david * @version $Id: RedisClient.java, v 0.1 2015年6月6日 下午6:35:25 zhangwei_david Exp $ */ @Component("redisClient") public class RedisClientImpl implements RedisClient { @Autowired private RedisExecuteTemplate redisExecuteTemplate; /** * * @see com.cathy.demo.redis.RedisClient#putObjectWithExpire(java.lang.String, java.lang.Object, long) */ public boolean putObjectWithExpire(final String key, final Object obj, final long expireTime) { String result = (String) redisExecuteTemplate.excute(new ExecuteCallback() { byte[] objSeria = SerializationUtil.serializer(obj); public Object command(ShardedJedis shardedJedis) { return shardedJedis.set(key, new String(objSeria), "nx", "ex", expireTime); } }); return "OK".equals(result); } /** * * @see com.cathy.demo.redis.RedisClient#getObjectByKey(java.lang.String, java.lang.Class) */ public Object getObjectByKey(final String key, final Class<?> clazz) { return redisExecuteTemplate.excute(new ExecuteCallback() { public Object command(ShardedJedis shardedJedis) { String str = shardedJedis.get(key); return SerializationUtil.deserializer(str.getBytes(), clazz); } }); } }
/** * * @author zhangwei_david * @version $Id: RedisClientTest.java, v 0.1 2015年6月6日 下午6:38:24 zhangwei_david Exp $ */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath*:META-INF/spring/jedis-beans.xml") public class RedisClientTest { @Autowired private RedisClientImpl redisClient; @Test public void testSet() { redisClient.putObjectWithExpire("my1.person.test", new Person(), 100); Person person = (Person) redisClient.getObjectByKey("my1.person.test", Person.class); System.out.println(person.getName()); } }
log4j:WARN custom level class [# 输出DEBUG级别以上的日志] not found. 2015-06-06 19:43:09 [ main:0 ] - [ INFO ] @TestExecutionListeners is not present for class [class com.cathy.demo.redis.RedisClientTest]: using defaults. 2015-06-06 19:43:09 [ main:145 ] - [ INFO ] Loading XML bean definitions from URL [file:/H:/Alipay.com/workspace4alipay/demo/target/classes/META-INF/spring/jedis-beans.xml] 2015-06-06 19:43:09 [ main:314 ] - [ INFO ] JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning 2015-06-06 19:43:09 [ main:333 ] - [ INFO ] Refreshing org.springframework.context.support.GenericApplicationContext@43840: startup date [Sat Jun 06 19:43:09 CST 2015]; root of context hierarchy 2015-06-06 19:43:09 [ main:489 ] - [ INFO ] Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@525845: defining beans [org.springframework.aop.config.internalAutoProxyCreator,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,shardedJedisPool,jedisPoolConfig,redisClient,redisExecuteTemplate,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy Test 2015-06-06 19:43:09 [ Thread-3:742 ] - [ INFO ] Closing org.springframework.context.support.GenericApplicationContext@43840: startup date [Sat Jun 06 19:43:09 CST 2015]; root of context hierarchy 2015-06-06 19:43:09 [ Thread-3:743 ] - [ INFO ] Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@525845: defining beans [org.springframework.aop.config.internalAutoProxyCreator,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,shardedJedisPool,jedisPoolConfig,redisClient,redisExecuteTemplate,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
相关推荐
本文将详细介绍如何将Spring、Spring MVC和Hibernate集成到Redis缓存中。 首先,我们需要在项目中引入Redis的相关依赖。在 Maven 的pom.xml文件中添加Jedis或Lettuce客户端库,如Jedis: ```xml <groupId>redis....
Jedis 是 Java 开发者常用的 Redis 客户端库,而 Spring Data Redis 是 Spring 框架的一部分,它提供了与 Redis 集成的高级抽象。在“征服 Redis + Jedis + Spring (三)—— 列表操作”这一主题中,我们将深入探讨...
在IT行业中,Redis和Jedis是两个非常重要的组件,它们在大数据处理、缓存管理和分布式系统中发挥着关键作用。Spring Data Redis则是Spring框架提供的一套用于操作Redis的高级抽象库,它使得与Redis的数据交互变得...
将Redis与SpringMVC结合,可以实现高效的缓存策略,提升Web应用的性能。本文将深入探讨如何配置Redis的哨兵模式,并将其与SpringMVC集成。 首先,我们来看哨兵(Sentinel)模式。哨兵模式是Redis提供的高可用性解决...
有了连接工厂后,我们可以创建一个`RedisTemplate`,它是Spring Data Redis提供的模板类,简化了操作Redis的API。 ```xml <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> ...
在IT行业中,Spring框架与Redis的集成是常见的数据缓存解决方案,尤其在高并发和大数据量的场景下。本文将详细讲解如何将Redis与Spring框架整合,并实现一个基础的Demo。 首先,理解Spring和Redis的基本概念是至关...
在本案例中,我们将深入探讨如何在Spring框架中整合Redis数据存储系统,使用Jedis作为客户端库。Redis是一个高性能的键值对存储系统,适用于缓存、消息队列等多种应用场景。而Spring是Java领域广泛使用的应用程序...
Spring Cache模块可以结合Redis实现缓存功能。通过注解`@Cacheable`、`@CacheEvict`和`@Caching`,可以很容易地在方法级别启用缓存,提高性能。 ```java @Cacheable(value = "myCache", key = "#id") public ...
例如,我们可以实现一个简单的缓存功能,将用户信息存储到Redis中: ```java @Service public class UserService { @Autowired private JedisTemplate jedisTemplate; public void addUser(String userId, ...
1. RedisTemplate:这是Spring Data Redis的核心类,提供了键值操作的模板方法,如存取对象、哈希操作、列表、集合、有序集合等。 2. HashOperations:专门处理哈希数据类型的操作,如put、get、delete等。 3. ...
- Spring 提供了 `RedisTemplate` 和 `StringRedisTemplate` 两个模板类,它们封装了 Redis 的操作,提供了一种面向对象的方式来存取数据。在配置类中,你可以通过 `RedisConnectionFactory` 创建这两个模板: ```...
6. **使用Redis缓存**: 在需要缓存的地方,使用定义好的RedisTemplate进行数据存取。 7. **测试验证**: 编写测试用例,确保所有组件正常工作。 这个技术栈组合的优势在于,Maven简化了构建流程,SpringMVC提供了...
本文将深入探讨如何使用Spring MVC与Redis进行集成,实现数据的缓存和查询,以帮助初学者快速掌握这一技能。 首先,Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序,提供模型-视图-控制器(MVC)架构...
4. 将Redis缓存应用到业务层,例如,使用`@Cacheable`注解标记某个方法的结果应被缓存。 在实际开发中,Redis可以作为缓存中间件,提高数据访问效率;也可以作为消息队列,实现异步处理。通过Spring的整合,我们...
在结合SpringBoot使用自定义序列化时,我们需要实现`org.springframework.data.redis.serializer.RedisSerializer`接口。这是因为Spring Data Redis默认使用JSON或String序列化,但这些可能无法满足我们查看命令行中...
在给定的文件列表中,`spring-data-redis-1.1.0.RELEASE.jar`是Spring Data Redis的一个版本,而`jedis-2.1.0.jar`则是连接Redis的客户端库。确保添加正确的版本,因为它们可能会随着时间的推移而更新。 配置Spring...
**Spring Boot 2 集成 Redis 知识点详解** Spring Boot 2 提供了对 Redis 的便捷集成,使得开发者能够快速地在 Spring 应用中利用 Redis ...在实际应用中,可以根据需求利用 Redis 实现缓存管理、消息队列等多种功能。
3. **连接集群**: 配置 Spring 与 Redis 集群的连接时,需要使用 `JedisCluster` 或 `Lettuce` 的 `ClusterClient`。配置方法与单节点类似,但需要提供一组节点的地址而不是单一地址。 4. **注意事项**: 集群模式下...
- **手动失效**:当数据源(如数据库)中的数据发生变化时,可以通过`DEL`命令手动清除对应的Redis缓存。 - **监听模式**:使用Redis的发布/订阅功能,当数据源更新时发送消息,订阅端接收到消息后清除或更新缓存...