Spring Data RedisTemplate, ttl is not working when setting a value

You need to call expire(…) and set(…) in a different order. The SET command removes any timeout that was previously applied:

From the documentation at http://redis.io/commands/set:

Set key to hold the string value. If key already holds a value, it is overwritten, regardless of its type. Any previous time to live associated with the key is discarded on successful SET operation.

In your case you just need to switch the order of expire(…) and set(…) to set(…) and expire(…).

@Override
public void save(Integer fixtureId, Market market) {
    String key = buildKey(fixtureId, market.getId());
    BoundValueOperations<String, Market> boundValueOperations = marketTemplate.boundValueOps(key);

    boundValueOperations.set(market);
    boundValueOperations.expire(eventsLifeTime, TimeUnit.MINUTES);
}

Besides that, you could improve the code by setting the value and expiry in one call. ValueOperations (RedisOperations.opsForValue()) provides a set method that sets the key and timeout with the signature

void set(K key, V value, long timeout, TimeUnit unit);