`

redis Jedis序列化自定义存储list对象和map数据

    博客分类:
  • java
阅读更多
1,redis缓存配置类
public class RedisCache {
	protected static Logger logger = Logger.getLogger(RedisCache.class);
	public final static String VIRTUAL_COURSE_PREX = "_lc_vc_";
	
	
	private RedisCacheConfig redisCacheConfig;
	private JedisPool jedisPool = null;
	
	public RedisCacheConfig getRedisCacheConfig() {
		return redisCacheConfig;
	}

	public void setRedisCacheConfig(RedisCacheConfig redisCacheConfig) {
		this.redisCacheConfig = redisCacheConfig;
	}

	public RedisCache(){
		
	}
	
	/**
	 * 初始化Redis连接池
	 */
	private void initialPool(){
		JedisPoolConfig poolConfig = redisCacheConfig.getPoolConfig();
		String[] serverArray = redisCacheConfig.getServers().split(",");
		for(int i = 0; i < serverArray.length; i++){
			try {
				JedisPoolConfig config = new JedisPoolConfig();
				config.setMaxTotal(poolConfig.getMaxTotal());
				config.setMaxIdle(poolConfig.getMaxIdle());
				config.setMaxWaitMillis(poolConfig.getMaxWaitMillis());
				config.setTestOnBorrow(poolConfig.getTestOnBorrow());
				config.setTestOnReturn(poolConfig.getTestOnReturn());
				
				jedisPool = new JedisPool(config, serverArray[i], redisCacheConfig.getPort(), redisCacheConfig.getTimeout());
				break;
			} catch (Exception e) {
				logger.error("initialPool create JedisPool(" + serverArray[i] + ") error : "+e);
			}
		}
		
	}
	
	/**
	 * 在多线程环境同步初始化
	 */
	private synchronized void poolInit() {
		if (jedisPool == null) {  
			initialPool();
		}
	}
 
	 
	/**
	 * 同步获取Jedis实例
	 * @return Jedis
	 */
	public synchronized Jedis getJedis() {
		if (jedisPool == null) {
			poolInit();
		}
		Jedis jedis = null;
		try {
			if (jedisPool != null) {
				jedis = jedisPool.getResource();
				jedis.auth(redisCacheConfig.getAuth());
			}
		} catch (Exception e) {
			logger.error("Get jedis error : "+e);
			e.printStackTrace();
		}finally{
			returnResource(jedis);
		}
		return jedis;
	}
	
	/**
	 * 释放jedis资源
	 * @param jedis
	 */
	public void returnResource(final Jedis jedis) {
		if (jedis != null && jedisPool !=null) {
			jedisPool.returnResource(jedis);
		}
	}

	/**
	 * 得到Key
	 * @param key
	 * @return
	 */
	public String buildKey(String key){
		return VIRTUAL_COURSE_PREX + key;
	}
	/**
	 * 设置 String
	 * @param key
	 * @param value
	 */
	public void setString(String key ,String value){
		try {
			value = StringUtil.isNullOrEmpty(value) ? "" : value;
			getJedis().set(buildKey(key),value);
		} catch (Exception e) {
			logger.error("Set key error : "+e);
		}
	}
	 
	/**
	 * 设置 过期时间
	 * @param key
	 * @param seconds 以秒为单位
	 * @param value
	 */
	public void setString(String key ,int seconds,String value){
		try {
			value = StringUtil.isNullOrEmpty(value) ? "" : value;
			getJedis().setex(buildKey(key), seconds, value);
		} catch (Exception e) {
			logger.error("Set keyex error : "+e);
		}
	}
	 
	/**
	 * 获取String值
	 * @param key
	 * @return value
	 */
	public String getString(String key){
		String bKey = buildKey(key);
		if(getJedis() == null || !getJedis().exists(bKey)){
			return null;
		}
		return getJedis().get(bKey);
	}
	/**
	 * 设置 list
	 * @param <T>
	 * @param key
	 * @param value
	 */
	public <T> void setList(String key ,List<T> list){
		try {
			getJedis().set(key.getBytes(),ObjectTranscoder.serialize(list));
		} catch (Exception e) {
			logger.error("Set key error : "+e);
		}
	}
	/**
	 * 获取list
	 * @param <T>
	 * @param key
	 * @return list
	 */
	public <T> List<T> getList(String key){
		String bKey = buildKey(key);
		if(getJedis() == null || !getJedis().exists(key.getBytes())){
			return null;
		}
		byte[] in = getJedis().get(key.getBytes());  
        List<T> list = (List<T>) ObjectTranscoder.deserialize(in);  
		return list;
	}
	/**
	 * 设置 map
	 * @param <T>
	 * @param key
	 * @param value
	 */
	public <T> void setMap(String key ,Map<String,T> map){
		try {
			getJedis().set(key.getBytes(),ObjectTranscoder.serialize(map));
		} catch (Exception e) {
			logger.error("Set key error : "+e);
		}
	}
	/**
	 * 获取list
	 * @param <T>
	 * @param key
	 * @return list
	 */
	public <T> Map<String,T> getMap(String key){
		String bKey = buildKey(key);
		if(getJedis() == null || !getJedis().exists(key.getBytes())){
			return null;
		}
		byte[] in = getJedis().get(key.getBytes());  
		Map<String,T> map = (Map<String, T>) ObjectTranscoder.deserialize(in);  
		return map;
	}
}

2,spring配置
<!-- 声明redisCache -->
	<bean id="redisCache" class="com.cache.RedisCache" depends-on="redisCacheConfig">
		<property name="redisCacheConfig" ref="redisCacheConfig"></property>
	</bean>
	<bean id="redisCacheConfig" class="com.able.virtualcourse.cache.RedisCacheConfig" depends-on="jedisPoolConfig">
		<property name="servers"><value>${redis.servers}</value></property>
		<property name="port"><value>${redis.port}</value></property>
		<property name="auth"><value>${redis.auth}</value></property>
		<property name="timeout"><value>${redis.pool.timeout}</value></property>
		<property name="poolConfig" ref="jedisPoolConfig"></property>
	</bean>
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxTotal"><value>${redis.pool.maxTotal}</value></property>
		<property name="maxIdle"><value>${redis.pool.maxIdle}</value></property>
		<property name="maxWaitMillis"><value>${redis.pool.maxWait}</value></property>
		<property name="testOnBorrow"><value>${redis.pool.testOnBorrow}</value></property>
		<property name="testOnReturn"><value>${redis.pool.testOnReturn}</value></property>
	</bean>

3,序列化工具类
public class ObjectTranscoder {
	public static byte[] serialize(Object value) {  
        if (value == null) {  
            throw new NullPointerException("Can't serialize null");  
        }  
        byte[] rv=null;  
        ByteArrayOutputStream bos = null;  
        ObjectOutputStream os = null;  
        try {  
            bos = new ByteArrayOutputStream();  
            os = new ObjectOutputStream(bos);  
            os.writeObject(value);  
            os.close();  
            bos.close();  
            rv = bos.toByteArray();  
        } catch (IOException e) {  
            throw new IllegalArgumentException("Non-serializable object", e);  
        } finally {  
        	try {
	        	 if(os!=null)os.close();
	        	 if(bos!=null)bos.close();
       	 	}catch (Exception e2) {
       		 e2.printStackTrace();
			}  
        }  
        return rv;  
    }  

    public static Object deserialize(byte[] in) {  
        Object rv=null;  
        ByteArrayInputStream bis = null;  
        ObjectInputStream is = null;  
        try {  
            if(in != null) {  
                bis=new ByteArrayInputStream(in);  
                is=new ObjectInputStream(bis);  
                rv=is.readObject();  
                is.close();  
                bis.close();  
            }  
        } catch (Exception e) {  
            e.printStackTrace();
         }finally {  
        	 try {
	        	 if(is!=null)is.close();
	        	 if(bis!=null)bis.close();
        	 } catch (Exception e2) {
        		 e2.printStackTrace();
 			 }
         }
        return rv;  
    }  
}

分享到:
评论

相关推荐

    Redis部署笔记(单机+主从+哨兵+集群)

    ● 屏蔽byte[]数据类型,所有实现了序列化接口的对象均可直接在Redis进行读写 ● 保留String数据类型(并不会序列化成byte[],目的是保留与其他程序交互数据的方式) ● 把Redis的Map封装成RedisMap类(key强制为...

    java redis demo

    在这个示例中,可能使用了序列化方法将Java对象(如String、Bean、List和Map)转化为字节数据存储在Redis中,并能反序列化回原对象。 2. **操作String**: Redis支持简单的键值对操作,String是最基础的数据类型。...

    征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)

    在本篇博客“征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)”中,我们将深入探讨如何利用Redis、Jedis库以及Spring框架进行哈希表的操作,特别是`HMGET`和`HMSET`这两个重要的命令。...

    java 对Redis的导入和导出

    在Java开发中,Redis作为一个高性能的键值存储系统,常被用作缓存或数据库,其数据操作便捷高效。为了在不同的服务器之间迁移或者备份Redis中的数据,我们需要实现数据的导入与导出功能。本篇将详细介绍如何使用Java...

    java操作redis

    3. **序列化与反序列化**:在 Java 应用程序中,通常需要将 Java 对象序列化为二进制数据后再存入 Redis,反之亦然。常见的序列化框架包括 JSON、Protobuf 等。 4. **异步与非阻塞**:Redisson 等客户端库提供了...

    Redis在java中的使用示例

    总之,Redis的String、List、Set和Hash提供了丰富的数据结构,使得它成为Java开发中理想的缓存和数据持久化工具。合理运用这些数据类型,可以优化数据处理,提升应用程序的响应速度和整体性能。通过深入学习和实践,...

    jedis.jar下载

    3. **性能优秀**:Jedis通过优化的网络通信和序列化机制,确保了与Redis服务器交互的高效性。 4. **连接池管理**:Jedis支持连接池,可以有效管理多个客户端连接,提高并发性能。 5. **集群支持**:Jedis提供对Redis...

    springboot redis

    以上就是SpringBoot结合Redis实现存储自定义对象(如Map和List)以及缓存数据的基本步骤。通过这种方式,我们可以有效地利用Redis的内存优势,提高系统的响应速度和并发处理能力。在实际开发中,还需要考虑缓存更新...

    jedis简单实例

    - **哈希操作**:可以将对象序列化后存入哈希表,便于存储和检索复杂数据。 ```java Map, String&gt; hash = new HashMap(); hash.put("field1", "value1"); hash.put("field2", "value2"); jedis.hset("myHash", hash...

    【收集】Java调用Redis 入门级Demo

    在IT行业中,Java和Redis是两个非常重要的技术组件。Java是一种广泛应用的编程语言,而Redis则是一种...当然,这只是Java调用Redis的入门级Demo,实际开发中还需要考虑更多因素,如错误处理、数据序列化、事务操作等。

    Java利用Redis实现消息队列的示例代码

    * 序列化的优点是可以将对象转换为二进制数据,以便于存储和传输。 二、消息类 * 消息类是实现消息队列的核心组件,需要实现Serializable接口。 * 消息类需要有唯一的标识符,以便于区分不同的消息。 * 消息类可以...

    Redis个人总结

    Redis是一种高性能的键值对数据存储系统,以其丰富的数据结构和高效的读写性能著称。在个人总结中,我们可以看到Redis主要使用了五种数据结构,分别是String、List、Set、Hash和ZSet,每种都有其独特的特性和用途。 ...

    spring+redis

    在这个配置中,我们指定了Redis服务器的地址和端口,并配置了序列化器,因为Redis存储的是字节流,需要序列化和反序列化Java对象。这里使用了StringRedisSerializer处理键,以及`GenericJackson2JsonRedisSerializer...

    Redis 实例 教程

    Redis,全名Remote Dictionary Server,是一款高性能的键值存储系统,常用于数据缓存、消息队列以及数据库持久化等场景。它以其丰富的数据结构、高效的性能和简单易用的特性,受到了广大开发者的青睐。在本教程中,...

    Redis面试知识点.pdf

    - **数据持久化**:Redis支持将数据保存至磁盘,而Memcached仅支持内存存储。 - **数据类型**:Redis支持更丰富的数据类型。 - **事务支持**:Redis支持事务处理,而Memcached不支持。 #### 5、Memcache与Redis的...

    redis与spring的整合

    针对String、list、set、map,需要在RedisTemplate中配置序列化器,例如使用Jackson2JsonRedisSerializer: ```xml &lt;bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer....

    Redis缓存,泛型集合与json字符串的相互转换实例

    在本文中,我们将深入探讨Redis缓存的使用,以及如何在Java中...通过使用FastJSON进行序列化和反序列化,以及Spring Boot的`StringRedisTemplate`,我们可以方便地在内存和持久存储之间切换数据,确保系统的高效运行。

    基于Spark的机器学习资料63、后台服务工具redis:详解redis操作命令.pdf

    string类型是二进制安全的,可以包含任何数据,例如jpg图片或者序列化的对象。string类型可以存储的最大值为512MB。 string命令 * SET key "value":设置key的值 * GET key:读取key的值 * GETRANGE key 0 3:读取...

    redis-toolkit:jedis 操作 redis 的几种方式, 通过 JavaConf 方式配置; 以 Jar 的方式提供服务

    // 配置序列化器,如使用 JdkSerializationRedisSerializer 或 StringRedisSerializer // ... return template; } } ``` 有了 Jedis 实例后,我们可以通过多种方式操作 Redis。以下是一些常见的 Jedis 操作: ...

Global site tag (gtag.js) - Google Analytics