Redis——springdata序列化

一、配置序列化:

  //springdata中的RedisTemplate模板操作redis数据,默认会使用JdkSerializationRedisSerializer序列话,会导致服务器中实际的键值和设置时不一致,难以获取;

  实际使用:

    Key,采用字符串序列化器

    Value,采用JDK序列化器,这样方便对象的存储

    特殊情况,局部配置;

二、全局配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置redis连接池对象 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大空闲数 -->
        <property name="maxIdle" value="50" />
        <!-- 最大连接数 -->
        <property name="maxTotal" value="100" />
        <!-- 最大等待时间 -->
        <property name="maxWaitMillis" value="20000" />
    </bean>
    <!-- stringRedisSerializer序列化器 -->
    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

    <!-- 配置redis连接工厂 -->
    <bean id="connectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <!-- 连接池配置 -->
        <property name="poolConfig" ref="poolConfig" />
        <!-- 连接主机 -->
        <property name="hostName" value="192.168.80.135" />
        <!-- 端口 -->
        <property name="port" value="6379" />
        <!-- 密码 -->
        <property name="password" value="java1234" />
    </bean>

    <!-- 配置redis模板对象 -->
    <bean class="org.springframework.data.redis.core.RedisTemplate">
        <!-- 配置连接工厂 -->
        <property name="connectionFactory" ref="connectionFactory" />
        <!--配置序列化器-->
        <property name="keySerializer" ref="stringRedisSerializer"/>
        <!--<property name="valueSerializer" ref="stringRedisSerializer"/>-->
    </bean>
</beans>

三、局部配置:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:redis.xml")
public class RedisTest {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void test01() throws IllegalAccessException, InstantiationException {
        redisTemplate.setValueSerializer(StringRedisSerializer.class.newInstance());
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("age", "100");
        ops.increment("age", 100);
        System.out.println(ops.get("age"));
    }
}

 四、存储对象:

  1)实体类:

public class User implements Serializable {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

  2)测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:redis.xml")
public class RedisTest {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void test01() throws IllegalAccessException, InstantiationException {
        User user = new User();
        user.setName("zs");
        user.setAge(12);

        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set("user:1", user);
        System.out.println(valueOperations.get("user:1"));
    }
}

 五、springBoot中配置:

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

 

posted @ 2019-08-01 19:08  开拖拉机的拉风少年  阅读(496)  评论(0编辑  收藏  举报