2016-01-20 137 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; 
    } 
    }