`
zhangwei_david
  • 浏览: 475947 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring+Jedis+Redis自定义模板实现缓存Object对象

 
阅读更多

 

     在实际使用缓存的过程中,我们希望放入缓存的并不是一个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

 

1
0
分享到:
评论

相关推荐

    spring+mvc+hibernate集成redis缓存

    本文将详细介绍如何将Spring、Spring MVC和Hibernate集成到Redis缓存中。 首先,我们需要在项目中引入Redis的相关依赖。在 Maven 的pom.xml文件中添加Jedis或Lettuce客户端库,如Jedis: ```xml &lt;groupId&gt;redis....

    征服 Redis + Jedis + Spring (三)—— 列表操作

    Jedis 是 Java 开发者常用的 Redis 客户端库,而 Spring Data Redis 是 Spring 框架的一部分,它提供了与 Redis 集成的高级抽象。在“征服 Redis + Jedis + Spring (三)—— 列表操作”这一主题中,我们将深入探讨...

    spring-data-redis-1.6.0.RELEASE.jar + jedis-2.7.2.jar

    在IT行业中,Redis和Jedis是两个非常重要的组件,它们在大数据处理、缓存管理和分布式系统中发挥着关键作用。Spring Data Redis则是Spring框架提供的一套用于操作Redis的高级抽象库,它使得与Redis的数据交互变得...

    redis(哨兵模式配置) + springmvc

    将Redis与SpringMVC结合,可以实现高效的缓存策略,提升Web应用的性能。本文将深入探讨如何配置Redis的哨兵模式,并将其与SpringMVC集成。 首先,我们来看哨兵(Sentinel)模式。哨兵模式是Redis提供的高可用性解决...

    Spring mvc整合redis实例(redis连接池)

    有了连接工厂后,我们可以创建一个`RedisTemplate`,它是Spring Data Redis提供的模板类,简化了操作Redis的API。 ```xml &lt;bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"&gt; ...

    spring+redis的Demo

    在IT行业中,Spring框架与Redis的集成是常见的数据缓存解决方案,尤其在高并发和大数据量的场景下。本文将详细讲解如何将Redis与Spring框架整合,并实现一个基础的Demo。 首先,理解Spring和Redis的基本概念是至关...

    spring整合redis案例(jedis)

    在本案例中,我们将深入探讨如何在Spring框架中整合Redis数据存储系统,使用Jedis作为客户端库。Redis是一个高性能的键值对存储系统,适用于缓存、消息队列等多种应用场景。而Spring是Java领域广泛使用的应用程序...

    Spring+redis整合demo2

    Spring Cache模块可以结合Redis实现缓存功能。通过注解`@Cacheable`、`@CacheEvict`和`@Caching`,可以很容易地在方法级别启用缓存,提高性能。 ```java @Cacheable(value = "myCache", key = "#id") public ...

    spring boot redis-jedis

    例如,我们可以实现一个简单的缓存功能,将用户信息存储到Redis中: ```java @Service public class UserService { @Autowired private JedisTemplate jedisTemplate; public void addUser(String userId, ...

    spring整合redis项目

    1. RedisTemplate:这是Spring Data Redis的核心类,提供了键值操作的模板方法,如存取对象、哈希操作、列表、集合、有序集合等。 2. HashOperations:专门处理哈希数据类型的操作,如put、get、delete等。 3. ...

    spring整合redis3.2/redis2.1 jar包

    - Spring 提供了 `RedisTemplate` 和 `StringRedisTemplate` 两个模板类,它们封装了 Redis 的操作,提供了一种面向对象的方式来存取数据。在配置类中,你可以通过 `RedisConnectionFactory` 创建这两个模板: ```...

    Maven 、Redis、SpringMVC 、Mybatis整合

    6. **使用Redis缓存**: 在需要缓存的地方,使用定义好的RedisTemplate进行数据存取。 7. **测试验证**: 编写测试用例,确保所有组件正常工作。 这个技术栈组合的优势在于,Maven简化了构建流程,SpringMVC提供了...

    spring+redis

    本文将深入探讨如何使用Spring MVC与Redis进行集成,实现数据的缓存和查询,以帮助初学者快速掌握这一技能。 首先,Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序,提供模型-视图-控制器(MVC)架构...

    Redis与Spring+Maven整合,附整合过程教学文档

    4. 将Redis缓存应用到业务层,例如,使用`@Cacheable`注解标记某个方法的结果应被缓存。 在实际开发中,Redis可以作为缓存中间件,提高数据访问效率;也可以作为消息队列,实现异步处理。通过Spring的整合,我们...

    redis-cluster结合springboot的使用自定义序列化

    在结合SpringBoot使用自定义序列化时,我们需要实现`org.springframework.data.redis.serializer.RedisSerializer`接口。这是因为Spring Data Redis默认使用JSON或String序列化,但这些可能无法满足我们查看命令行中...

    Spring data redis的简单应用

    在给定的文件列表中,`spring-data-redis-1.1.0.RELEASE.jar`是Spring Data Redis的一个版本,而`jedis-2.1.0.jar`则是连接Redis的客户端库。确保添加正确的版本,因为它们可能会随着时间的推移而更新。 配置Spring...

    spring-boot2集成redis

    **Spring Boot 2 集成 Redis 知识点详解** Spring Boot 2 提供了对 Redis 的便捷集成,使得开发者能够快速地在 Spring 应用中利用 Redis ...在实际应用中,可以根据需求利用 Redis 实现缓存管理、消息队列等多种功能。

    redis和spring整合,redis集群

    3. **连接集群**: 配置 Spring 与 Redis 集群的连接时,需要使用 `JedisCluster` 或 `Lettuce` 的 `ClusterClient`。配置方法与单节点类似,但需要提供一组节点的地址而不是单一地址。 4. **注意事项**: 集群模式下...

    基于Redis的Java Method缓存包.zip

    - **手动失效**:当数据源(如数据库)中的数据发生变化时,可以通过`DEL`命令手动清除对应的Redis缓存。 - **监听模式**:使用Redis的发布/订阅功能,当数据源更新时发送消息,订阅端接收到消息后清除或更新缓存...

Global site tag (gtag.js) - Google Analytics