I want to cache a UserInfo entity in redis for just 3600 seconds and accord to my searches and examples that I saw, I implemented Redis caching in spring like below code and i have an issue with cache and uncache (with define ttl) when I cache a UserInfo entity in redis.
The whole code is here:
UserInfo entity:
@RedisHash(value = "UserInfo", timeToLive = 3600)
public class UserInfo implements Serializable
{
private static final long serialVersionUID = 2048972398004272098L;
@Id
private int id = ThreadLocalRandom.current().nextInt(100000);
private Long expiration;
private String userName;
private String name;
private String familyName;
private String givenName;
private String language;
private Set<String> roles;
private Set<String> permissions;
private String authorizationToken;
private String action;
private String path;
private String remoteAddr;
//getter & setter
}
This is my RedisConfiguration:
@EnableCaching
@EnableScheduling
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP, keyspaceConfiguration = RedisKeyspaceConfiguration.class)
@Configuration
public class RedisConnectionConfig
{
private static final Logger logger = LogManager.getLogger(RedisConnectionConfig.class);
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private Integer port;
@Value("${spring.redis.password}")
private String redisPass;
@Bean
JedisConnectionFactory jedisConnectionFactory()
{
logger.info("================================================================");
logger.info("Redis config : {} : {} ", host, port);
logger.info("================================================================");
RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration(host, port);
redisConfig.setPassword(redisPass);
return new JedisConnectionFactory(redisConfig);
}
@Bean
public RedisTemplate<String, Object> template() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new JdkSerializationRedisSerializer());
template.setValueSerializer(new JdkSerializationRedisSerializer());
template.setEnableTransactionSupport(true);
template.afterPropertiesSet();
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(3600));
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}
}
And this is RedisKeyspaceConfiguration class that I define in
@EnableRedisRepositories(enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP, keyspaceConfiguration = RedisKeyspaceConfiguration.class)
annotation on redis config class :
public class RedisKeyspaceConfiguration extends KeyspaceConfiguration {
@Override
public boolean hasSettingsFor(Class<?> type) {
return true;
}
@Override
public KeyspaceConfiguration.KeyspaceSettings getKeyspaceSettings(Class<?> type) {
KeyspaceSettings keyspaceSettings = new KeyspaceSettings(UserInfo.class, "UserInfo");
keyspaceSettings.setTimeToLive(3600L);
return keyspaceSettings;
}}
And RedisRepository :
public interface UserAuthInfoRepository extends CrudRepository<UserInfo, Integer>
{
UserInfo findById(int id);
UserInfo findByUserName(String userName);
}
And finally this is when I cache it into redis:
public UserInfo cacheUserAuthDataToRedis(UserInfo userInfo) throws AdminUserAuthorizationException
{
UserInfo result = null;
result = userAuthInfoRepository.save(userInfo);
return result;
}
And also application.properties file:
#Redis Config
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.cache.redis.time-to-live=360000
Now when I call cacheUserAuthDataToRedis method as you can see in screenshot 1, data stored in redis and they has a TTL time into TTL box and they will be delete from redis after ttl time runs out and everything is ok :
But as you can see in picture2 there is a another row name UserInfo and the item that there is here they do not disappear because the TTL of them is -1 and they are will stored forever:
Please
- Tell me if you know a better solution for implement this purpose
- Help me resolve the issue in screenshot #2
I appreciate your help

