Redis allows expiring entire keys, but individual fields in a hash cannot be expired by default. Redisson provides a solution through RMapCache, which supports per-field expiration. This is extremely useful when you want different fields in the same map to have different lifetimes.
1. Introduction to RMapCache
RMapCache is an extension of RMap that provides:
- All operations of
RMap(get,put,remove,putAll, etc.) - Ability to set time-to-live (TTL) for individual entries
- Automatic eviction of expired entries using background threads in Redisson
Key points:
- Each entry can have a different TTL
- Expired entries are automatically removed from the map
- Useful for caching scenarios where fields have different lifetimes
2. Setting Up the Test Class
Create a dedicated class to test map caching:
import org.redisson.api.RMapCache;
import org.redisson.api.RedissonClient;
import java.util.concurrent.TimeUnit;
public class MapCacheTest extends BaseTest {
public void testMapCacheFieldExpiry() throws InterruptedException {
// Create a RMapCache instance
RMapCache<Integer, Student> usersCache = redisson.getMapCache("usersCache");
// Create student objects
Student student1 = new Student("Alice", 25, "Atlanta");
Student student2 = new Student("Jake", 30, "Miami");
// Put values with individual expiration times
usersCache.put(1, student1, 5, TimeUnit.SECONDS); // expires in 5 seconds
usersCache.put(2, student2, 10, TimeUnit.SECONDS); // expires in 10 seconds
3. Accessing Map Values Before Expiration
You can retrieve values just like in RMap:
// Sleep for 3 seconds before accessing
Thread.sleep(3000);
// Access both entries
System.out.println("Student 1: " + usersCache.get(1)); // Should be present
System.out.println("Student 2: " + usersCache.get(2)); // Should be present
At this point:
Student 1(TTL 5s) → still presentStudent 2(TTL 10s) → still present
4. Accessing Map Values After Partial Expiration
After waiting for additional seconds:
// Sleep 3 more seconds
Thread.sleep(3000);
// Access again
System.out.println("Student 1: " + usersCache.get(1)); // Should be null (expired)
System.out.println("Student 2: " + usersCache.get(2)); // Should still be present
}
}
Now:
Student 1→ expired and automatically removedStudent 2→ still in the map
Behavior: Redisson emits an empty signal when accessing expired entries, so get returns null.
5. Key Points and Best Practices
- Per-field expiration:
RMapCacheis the only Redisson map variant that allows this. - Automatic eviction: You do not need to manually remove expired entries.
- TTL management: Each
putcan have a custom TTL. - Data types: Works with any value type (
String, POJO, complex object). - Thread safety: Redisson handles background cleanup threads for expiration.
- Use cases:
- Session storage per field
- Caching individual user preferences
- Temporary configuration or state storage
6. Complete Example
RMapCache<Integer, Student> usersCache = redisson.getMapCache("usersCache");
Student student1 = new Student("Alice", 25, "Atlanta");
Student student2 = new Student("Jake", 30, "Miami");
usersCache.put(1, student1, 5, TimeUnit.SECONDS);
usersCache.put(2, student2, 10, TimeUnit.SECONDS);
Thread.sleep(3000);
System.out.println("After 3 seconds:");
System.out.println("Student 1: " + usersCache.get(1)); // present
System.out.println("Student 2: " + usersCache.get(2)); // present
Thread.sleep(3000);
System.out.println("After 6 seconds:");
System.out.println("Student 1: " + usersCache.get(1)); // expired -> null
System.out.println("Student 2: " + usersCache.get(2)); // still present
