2016-01-20 138 views
3

我有一个Spring Spring Hibernate应用程序。在我的应用程序中,最近我实现了Spring数据Redis。Spring Data Redis过期密钥

spring-servlet.xml 
<!-- redis connection factory --> 
<bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/> 

<!-- redis template definition --> 
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" 
    p:connection-factory-ref="jedisConnFactory"/> 

在我ServiceImpl类此redisTemplate使用。

RedisServiceImpl 

@Autowired 
private RedisTemplate<String, T> redisTemplate; 

public RedisTemplate<String, T> getRedisTemplate() { 
    return redisTemplate; 
} 

public void setRedisTemplate(RedisTemplate<String, T> redisTemplate) { 
    this.redisTemplate = redisTemplate; 
} 

现在我在redisServer添加数据这样

public void putData(String uniqueKey, String key, Object results) { 

    redisTemplate.opsForHash().put(uniqueKey, key, results); 
} 

现在我想删除过期的关键。

我在谷歌搜索,但在谷歌所有的都在说这样的

redisTemplate.expire(key, timeout, TimeUnit); 

在这种到期方法,我们需要提供uniqueKey而不是key。 但我需要到期key而不是uniqueKey

所以请帮我我能做些什么过期Key

+0

http://docs.spring。IO /弹簧数据/数据redis的/文档/ 1.5.2.RELEASE/API /组织/ springframework的/数据/ redis的/核心/ RedisTemplate.html#到期(K,%20long,%20java.util.concurrent.TimeUnit)不说关于uniqueKey的任何事情。你可以通过密钥过期 – shazin

+0

是的,你是对的。在这个网址没有提到有关uniqueKey的任何信息。但在执行时,当我使用uniqueKey然后这个uniqueKey过期。但是当我使用密钥时,这个密钥不会过期。 –

+0

唯一的密钥被认为是整个散列...所以可以过期这个散列的密钥。除非您需要手动删除散列键和值。 – Nebras

回答

2

实际上,您不能过期或设置Redis哈希中单个密钥的TTL。您只能过期或设置完整散列的TTL。如果你想支持这个,你必须改变你的数据结构。

这是为什么它是不可能的链接;以下是从 Redis expire

一些摘录据我所知Redis的关心性能比的特点。它将 在redis中击败了内存高效散列实现的目的。 由于散列键值字段并不总是表示为完整 精选redis对象(当散列 很小以节省内存时,它们可以存储为线性数组),所以散列键字段不能有TTL。

而且这种联系Allow to set an expiration on hash field可以帮助你改变你的数据结构来处理过期

2

其实你可以使用RMapCache对象Redisson框架(基于Redis的数据网格的Java)做到这一点。它提供了为每个映射条目设置ttlmaxIdle的功能。示例:

// implements java.util.concurrent.ConcurrentMap interface 
RMapCache<String, SomeObject> map = redisson.getMapCache("anyMap"); 

// ttl = 10 minutes, 
map.put("key1", new SomeObject(), 10, TimeUnit.MINUTES); 
// ttl = 10 minutes, maxIdleTime = 10 seconds 
map.put("key1", new SomeObject(), 10, TimeUnit.MINUTES, 10, TimeUnit.SECONDS); 
3

我正在使用Redis版本3.2.100。

而不是Redis的templat E,使用Redis的缓存管理器,通过redistemplate到CacheManager的,并使用其设定的到期属性。它基本上是字符串&龙的地图,你可以添加缓存名称,并设置其到期时间,即生存时间(TTL)。

您可以使用setDefaultExpiration cacheManager的方法为所有缓存设置相同的到期时间。

@SuppressWarnings({ "rawtypes", "unused" }) 
@Configuration 
@EnableCaching(proxyTargetClass = true, mode = AdviceMode.ASPECTJ, order = 1) 
@PropertySource("classpath:/application.properties") 
public class CacheConfigImpl extends CachingConfigurerSupport { 

    private @Value("${redis.ip}") String redisHost; 
    private @Value("${redis.port}") int redisPort; 

    private static final Map<String, Long> cacheMap = new HashMap<String, Long>(); 
    static { 
     cacheMap.put("method1cache", 600L); 
     cacheMap.put("method2cache", 600L); 
     cacheMap.put("method3cache", 800L); 
    } 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean 
    public JedisConnectionFactory redisConnectionFactory() { 
     JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory(); 
     redisConnectionFactory.setHostName(CustomPropertyLoader.getProperty("redis.ip")); 
     redisConnectionFactory.setPort(Integer.parseInt(CustomPropertyLoader.getProperty("redis.port"))); 
     return redisConnectionFactory; 
    } 

    @Bean 
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) { 
     RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>(); 
     redisTemplate.setConnectionFactory(redisConnectionFactory); 
     redisTemplate.afterPropertiesSet(); 
     return redisTemplate; 
    } 

    @Bean(name = "RCacheManager") 
    public CacheManager cacheManager(RedisTemplate redisTemplate) { 

     RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); 
     Map<String, Long> expires = new HashMap<String, Long>(); 
     cacheManager.setExpires(cacheMap); 
     cacheManager.setUsePrefix(true); 
     final String redis_client_name = CustomPropertyLoader.getProperty("redis.client.name"); 
     cacheManager.setCachePrefix(new RedisCachePrefix() { 
      private final RedisSerializer<String> serializer = new StringRedisSerializer(); 
      private final String delimiter = ":"; 

      public byte[] prefix(String cacheName) { 
       return this.serializer 
         .serialize(redis_client_name.concat(this.delimiter).concat(cacheName).concat(this.delimiter)); 
      } 
     }); 
     return cacheManager; 
    } 
    }