Ошибки в шаблоне 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.

Любая причина или анализ от вас будут высоко оценены:)

0 ответов

Другие вопросы по тегам