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; } }