使用 redisTemplate 的一些坑。
redisTemplate 配置
:
<bean id="redisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.pool.max.active}" />
<property name="maxIdle" value="${redis.pool.max.idle}" />
<property name="maxWaitMillis" value="${redis.pool.max.wait}" />
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
<property name="testWhileIdle" value="${redis.pool.testWhileIdle}" />
<property name="testOnReturn" value="${redis.pool.testOnReturn}" />
<property name="timeBetweenEvictionRunsMillis" value="${redis.pool.timeBetweenEvictionRunsMillis}" />
</bean>
<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}" />
<property name="port" value="${redis.port}" />
<property name="password" value="${redis.password}" />
<property name="usePool" value="true" />
<property name="poolConfig" ref="redisPoolConfig" />
<property name="timeout" value="${redis.timeout}" />
</bean>
<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<qualifier value="redis"/>
<property name="connectionFactory" ref="redisConnectionFactory" />
<!-- 如果不配置Serializer,那么存储的时候智能使用String,如果用User类型存储,那么会提示错误User can't cast to String -->
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
</bean>
Java代码
:
@Resource
private RedisTemplate<String, Serializable> redisTemplate;
public void add(String key, Serializable obj, long timeout, TimeUnit timeUnit) {
if(redisTemplate.hasKey(key)){
delete(key);
}
redisTemplate.opsForValue().set(key, obj, timeout, timeUnit);
}
public Serializable get(String key) {
return redisTemplate.opsForValue().get(key);
}
public void delete(String key) {
redisTemplate.delete(key);
}
入坑点:
- 1.redisTemplate 的注入,不能用 @Autowired,要用 @Resource,因为配置中是 id="redisTemplate"的 bean,@Resource 是优先按 name 注入的!!!
- 2.关于序列化问题,坑爹的我在 redis 中手动存了个 key,然后忘了删除,而程序调用该 key 就报错,因为程序存入的是序列化后的值!!!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于