redisTemplate 操作及相关配置

本文介绍了一个基于Spring Data Redis的DAO封装类,用于简化Redis的操作。包括批量插入H码和批量获取数据的方法,并提供了配置文件及基础数据类型工具类的实现。

redisDao封装类-其他dao集成他

package com.ffcs.wlan.dao.common;  
import javax.annotation.Resource;  
import org.springframework.data.redis.core.StringRedisTemplate;  
  
/**  
 * AbstractBaseRedisDao 
 * @author hugsh 
 * @version <b>1.0</b>  
 */   
public abstract class AbstractBaseRedisDao<K, V> {  
      
    @Resource  
    protected StringRedisTemplate redisTemplate;  
  
    public void setRedisTemplate(StringRedisTemplate redisTemplate) {  
        this.redisTemplate = redisTemplate;  
    }  
}  

 批量插入(不关注返回值)

@Repository  
public  class RedisInitDao extends AbstractBaseRedisDao<String, Object> {  
          
    Logger logger=Logger.getLogger(RedisInitDao.class);  
      
        /** 
         * 批量向redis中插入H码:key(tableName:hcode) value(pcode) 
         * 如果键已存在则返回false,不更新,防止覆盖。使用pipeline批处理方式(不关注返回值) 
         *  @param list  一个map代表一行记录,2个key:hcode & pcode。 
         *  @param tableName redis中key的值为tableName:hcode  对应value值为pcode。 
         *  @return 
         */  
        public boolean addHcode(final List<Map<String, Object>> list,final String tableName) {  
            boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {  
                public Boolean doInRedis(RedisConnection connection)  
                        throws DataAccessException {  
                    RedisSerializer<String> serializer = redisTemplate.getStringSerializer();  
                    for (Map<String, Object> map : list) {  
                        byte[] key  = serializer.serialize(tableName+":"+map.get("hcode").toString());  
                        byte[] name = serializer.serialize(map.get("pcode").toString());  
                        connection.setNX(key, name);  
                    }  
                    return true;  
                }  
            }, false, true);  
            return result;  
        }  

批量获取(有返回值)

/** 
 * 从redis中获取(获取密码日志) rPop从链表尾部弹出(最早的日志) 
 * 多线程并发读取日志长度的时候,比如都得到结果是1000条。 
 * 当多线程每个都 循环1000次 pop弹出 日志的时候, 
 * 由于是多线程一起pop,所以每个线程获得的数组中都会包含 null  甚至有的全是null 
 * @return 
 */  
public List<String> getLogFromRedis() {  
      
    final RedisSerializer<String> serializer = redisTemplate.getStringSerializer();  
    //密码日志的长度  
    final Long pwdLogSize=redisTemplate.opsForList().size("getpwdList");  
      
    List<Object> pwdLogList=redisTemplate.executePipelined(new RedisCallback<String>() {  
        @Override  
        public String doInRedis(RedisConnection conn)  
                throws DataAccessException {  
            for (int i=0 ;i<pwdLogSize ;i++) {  
                byte[] listName  = serializer.serialize("getpwdList");  
                conn.rPop(listName);  
            }  
            return null;  
        }  
    }, serializer);  
      
    //  去除结果中的null  
    ArrayList<String> newList=new ArrayList<String>();  
    for (Object o : pwdLogList) {  
        if(o!=null)  
            newList.add(String.valueOf(o));  
    }  
    return newList;  
}  

基础数据类型工具类(opsForList)

/** 
 * 向redis中插入获取密码日志:leftPush 从链表头部压入 
 *  @param pwdLog 获取密码的日志 
 *  @return 
 */  
public void addLogIntoRedis(final String pwdLog) {  
    log.info("insert getpwd log into redis:"+pwdLog);  
    try {  
        redisTemplate.opsForList().leftPush("getpwdList", pwdLog);  
    } catch (Exception e) {  
        log.error(e.getMessage());  
    }  
} 

配置文件

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:p="http://www.springframework.org/schema/p"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    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">  
  
  
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  
        <property name="maxTotal" value="${redis.maxTotal}"></property>  
        <property name="maxIdle" value="${redis.maxIdle}" />   
        <property name="maxWaitMillis" value="${redis.maxWait}" />  
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />  
    </bean>  
      
      
    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"  
        p:host-name="${redis.host}" p:port="${redis.port}" p:pool-config-ref="poolConfig"/>  
      
    <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">  
        <property name="connectionFactory"   ref="connectionFactory" />  
    </bean>         
      
</beans>  

 

<!-- 引入项目配置文件 -->  
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
        <property name="locations">  
            <list>  
                <value>classpath:redis.properties</value><!-- 引入redis配置文件 -->  
                <value>classpath:jdbc.properties</value><!-- 定义spring-jdbc配置信息路径 -->  
            </list>  
        </property>  
    </bean>  
  
  
<!-- 自动扫描model,dao和service包(自动注入) -->  
<context:component-scan base-package="com.ffcs.wlan.model,com.ffcs.wlan.dao,com.ffcs.wlan.service" />  

属性文件

# Redis settings  
redis.host=192.168.11.100  
redis.port=6379  
#redis.pass=hugsh    
redis.maxIdle=25  
redis.maxTotal=250  
#redis.maxActive=600 invalid in2.4  
redis.maxWait=1000  
redis.testOnBorrow=true  

 

<think>嗯,用户想了解如何配置RedisTemplate的序列化设置,我需要根据提供的引用内容来整理答案。首先,记得系统级指令里的要求,行内数学公式用$...$,独立公式用$$...$$,但这里可能用不上数学公式,主要是代码和配置说明。用户需要示例及说明,所以得给出具体的配置步骤和代码例子。 首先,引用3提到RedisTemplate默认使用JdkSerializationRedisSerializer,但通常推荐使用JSON序列化,比如Jackson2JsonRedisSerializer。引用4也提到了反序列化时的类型转换问题,可能需要配置类型提示。此外,引用1和2提到了通过@Qualifier来区分不同的RedisTemplate实例,这点可能在配置多个实例时有用,但用户主要问的是序列化配置,所以这部分可能作为扩展或注意事项提到。 接下来,我需要分步骤说明配置过程。第一步是创建配置类,使用@Configuration注解,然后在里面定义RedisTemplate的Bean。这里需要设置key和value的序列化器,比如StringRedisSerializer用于key,Jackson2JsonRedisSerializer用于value。同时,要配置ObjectMapper来支持类型信息,以便反序列化时能正确转换类型,如引用4提到的例子。 然后,给出代码示例,展示如何配置RedisTemplate。需要注意GenericJackson2JsonRedisSerializer和Jackson2JsonRedisSerializer的区别,前者会自动添加类型信息,而后者可能需要手动设置。引用3中提到的StringRedisTemplate是专门处理字符串的,可以简单说明。 另外,注意事项部分需要包括启用Redis仓库、类型安全、多个实例的区分(引用1和2的@Qualifier),以及序列化器选择的影响。比如,使用不同的序列化器可能导致存储格式不同,需要保持一致性。 最后,生成相关问题,覆盖用户可能进一步想了解的内容,比如多个RedisTemplate实例的配置、序列化器区别、类型转换异常处理等,参考提供的引用内容中的知识点。 需要检查是否符合所有系统指令,特别是使用中文回答,正确格式的代码块,以及引用标识。确保每个引用在回答中正确标注,比如引用3和引用4的内容在适当的地方添加[^3]和[^4]。</think>### RedisTemplate序列化配置步骤说明 #### 一、基础配置原理 RedisTemplate默认使用$JdkSerializationRedisSerializer$,会产生二进制数据且可读性差。推荐采用JSON序列化方式,需配置以下核心组件: 1. 键序列化器:通常使用$StringRedisSerializer$ 2. 值序列化器:推荐$Jackson2JsonRedisSerializer$或$GenericJackson2JsonRedisSerializer$ 3. Hash结构序列化器:需单独配置 #### 二、完整配置示例(Spring Boot) ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); // 配置序列化器 Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(om); // 设置序列化规则 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(serializer); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(serializer); template.afterPropertiesSet(); return template; } } ``` #### 三、关键配置说明 1. **类型安全配置** ```java om.activateDefaultTyping(...); // 添加类型元数据[^4] ``` 此配置会在JSON中添加@class字段,确保反序列化时能正确识别原始类型 2. **字符串专用模板** ```java @Autowired private StringRedisTemplate stringRedisTemplate; // 内置String序列化器 ``` 3. **多实例区分** ```java @Bean("customTemplate") public RedisTemplate<String, User> customTemplate() { // 创建特定类型的模板[^1][^2] } ``` #### 四、操作示例 ```java // 写入对象 User user = new User("Alice", 30); redisTemplate.opsForValue().set("user:1001", user); // 读取对象(需显式类型转换) User cachedUser = (User) redisTemplate.opsForValue().get("user:1001"); // [^4] ``` #### 五、注意事项 1. 需在启动类添加@EnableRedisRepositories 2. 序列化器类型必须与操作数据类型匹配 3. 使用@Qualifier区分多个RedisTemplate实例 4. GenericJackson2JsonRedisSerializer与Jackson2JsonRedisSerializer的主要区别在于是否自动处理类型信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值