Ошибки в шаблоне Spring Redis или Redis?
Эта проблема почти свела меня с ума! Я использую весенний шаблон Redis в качестве клиентского портала Redis для управления элементами кэша в Redis. В последнее время я пытаюсь сохранить в нем некоторые важные данные (время истечения около 60 с), но иногда (иногда) они удаляются через несколько секунд без каких-либо признаков! Я проверяю свой код снова и снова, других записей нет. Я провел много экспериментов, и был найден только один повод: 1. Когда мое веб-приложение запускалось, примерно в течение первых пяти минут, явление возникает часто (вероятность составляет около 1/3), но после этого времени все в порядке, 2. Получение данных сразу после установки всегда правильно, даже в случае ошибки. Но через несколько секунд он исчезает. Да, вы можете подумать, что в моих кодах должны быть какие-то другие операции удаления. Я проверил это очень тщательно, и ответ - нет:(.
Содержимое моего spring-redis.xml выглядит следующим образом:
<bean id="parentJedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" abstract="true"
p:timeout="50"
p:database="0">
<constructor-arg index="0" ref="sentinelConfig"/>
<constructor-arg index="1" ref="jedisPoolConfig"/>
</bean>
<bean id="jedisConnFactory" parent="parentJedisConnFactory" />
<bean id="nullSupportedRedisCacheTemplate"
class="org.springframework.data.redis.core.RedisTemplate"
p:connection-factory-ref="jedisConnFactory">
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean class="com.***.KryoRedisSerializer"/>
</property>
</bean>
И ниже - реализация клиента Redis:
@Repository("redisCache")
public class RedisCache implements Cache{
@Autowired
@Qualifier("nullSupportedRedisCacheTemplate")
private RedisTemplate<String, Object> nullSupportedRedisCacheTemplate;
private ValueOperations<String, Object> opsValue;
@PostConstruct
public void init(){
opsValue = nullSupportedRedisCacheTemplate.opsForValue();
}
@Override
public <T> void set(String key, T obj) {
set(key, obj, StaticConfiguration.DEFAULT_EXPIRE_TIME);
}
@Override
public <T> void set(String key, T obj, long expireTime) {
opsValue.set(key, obj, expireTime, TimeUnit.MILLISECONDS);
nullSupportedRedisCacheTemplate.expire(key, expireTime, TimeUnit.MILLISECONDS);
}
@SuppressWarnings("unchecked")
@Override
public <T> T get(String key) {
return (T) opsValue.get(key);
}
@Override
public void remove(String key) {
nullSupportedRedisCacheTemplate.delete(key);
}
@Override
public <T> void asynSet(String key, T obj) {
asynSet(key, obj, StaticConfiguration.DEFAULT_EXPIRE_TIME);
}
@Override
public <T> void asynSet(String key, T obj, long expireTime) {
opsValue.set(key, obj, expireTime, TimeUnit.MILLISECONDS);
nullSupportedRedisCacheTemplate.expire(key, expireTime, TimeUnit.MILLISECONDS);
}
@Override
public void asynRemove(String key) {
nullSupportedRedisCacheTemplate.delete(key);
}
@Override
public boolean contain(String key) {
return nullSupportedRedisCacheTemplate.hasKey(key);
}
}
Или вы можете сомневаться в том, что память заполнена и maxmemmory-policy удаляет ключ автоматически. Однако, согласно отзывам оперативников, максимальный объем памяти Redis составляет около 500 МБ, а максимальный объем памяти Redis равен 4G.
Любая причина или анализ от вас будут высоко оценены:)