SoFunction
Updated on 2025-03-05

Redis dynamic hotspot data cache strategy design

1. Hot spot data identification mechanism

1.1 Counter method

@Service
public class HotDataCounter {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // Access count    public void incrementCounter(String key) {
        String countKey = "counter:" + key;
        ().increment(countKey, 1);
        // Set the counter expiration time, such as 1 hour        (countKey, 1, );
    }

    // Get the number of visits    public Long getCounter(String key) {
        String countKey = "counter:" + key;
        return (Long) ().get(countKey);
    }
}

1.2 LRU algorithm implementation

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int capacity;

    public LRUCache(int capacity) {
        super(capacity, 0.75f, true);
         = capacity;
    }

    @Override
    protected boolean removeEldestEntry(<K, V> eldest) {
        return size() > capacity;
    }
}

2. Dynamic cache strategy implementation

2.1 Basic Caching Service

@Service
public class DynamicCacheService {
    @Autowired
    private RedisTemplate&lt;String, Object&gt; redisTemplate;
    @Autowired
    private HotDataCounter hotDataCounter;
    // Hot spot threshold    private static final long HOT_THRESHOLD = 100;

    // Get data    public Object getData(String key) {
        // Increase access count        (key);
        // Get data from cache        Object value = ().get(key);
        if (value != null) {
            return value;
        }
        // Get data from the database        value = getFromDB(key);
        // Determine whether it is hot data        if (isHotData(key)) {
            // Set a long expiration time for hot spot data            ().set(key, value, 1, );
        } else {
            // Set a short expiration time for non-hot data            ().set(key, value, 5, );
        }
        return value;
    }

    // Determine whether it is hot data    private boolean isHotData(String key) {
        Long count = (key);
        return count != null &amp;&amp; count &gt; HOT_THRESHOLD;
    }
}

2.2 Timed task update strategy

@Component
public class HotDataScheduler {
    @Autowired
    private RedisTemplate&lt;String, Object&gt; redisTemplate;

    @Scheduled(fixedRate = 300000) // Perform every 5 minutes    public void updateHotData() {
        // Get all counters        Set&lt;String&gt; counterKeys = ("counter:");
        if (counterKeys == null) return;
        // Update hotspot data expiration time        for (String counterKey : counterKeys) {
            String dataKey = ("counter:".length());
            Long count = (Long) ().get(counterKey);
            if (count != null &amp;&amp; count &gt; HOT_THRESHOLD) {
                // Extend the expiration time of hot spot data                (dataKey, 1, );
            }
        }
    }
}

3. Multi-level caching strategy

3.1 Local cache with Redis

@Service
public class MultiLevelCache {
    @Autowired
    private RedisTemplate&lt;String, Object&gt; redisTemplate;
    // Local cache    private final LoadingCache&lt;String, Object&gt; localCache = ()
            .maximumSize(1000)
            .expireAfterWrite(5, )
            .build(new CacheLoader&lt;String, Object&gt;() {
                @Override
                public Object load(String key) {
                    return getFromRedis(key);
                }
            });

    public Object get(String key) {
        try {
            return (key);
        } catch (ExecutionException e) {
            return getFromRedis(key);
        }
    }

    private Object getFromRedis(String key) {
        Object value = ().get(key);
        if (value == null) {
            value = getFromDB(key);
            if (value != null) {
                ().set(key, value);
            }
        }
        return value;
    }
}

4. Hotspot data preload

4.1 Preheating service

@Service
public class HotDataPreloader {
    @Autowired
    private RedisTemplate&lt;String, Object&gt; redisTemplate;

    @PostConstruct
    public void preloadHotData() {
        // Get historical hotspot data from statistics        List&lt;String&gt; historicalHotKeys = getHistoricalHotKeys();
        // Preload data to Redis        for (String key : historicalHotKeys) {
            Object value = getFromDB(key);
            if (value != null) {
                ().set(key, value, 1, );
            }
        }
    }
}

5. Cache update policy

5.1 Update Service

@Service
public class CacheUpdateService {
    @Autowired
    private RedisTemplate&lt;String, Object&gt; redisTemplate;

    // Update cached data    @Transactional
    public void updateData(String key, Object value) {
        // Update the database        updateDB(key, value);
        // Determine whether it is hot data        if (isHotData(key)) {
            // Directly update the cache            ().set(key, value, 1, );
        } else {
            // Delete the cache            (key);
        }
    }
}

6. Monitoring and Alarming

6.1 Monitoring Service

@Service
public class CacheMonitorService {
    @Autowired
    private RedisTemplate&lt;String, Object&gt; redisTemplate;

    // Monitor cache hit rate    public double getHitRate() {
        Long hits = (Long) ().get("cache:hits");
        Long misses = (Long) ().get("cache:misses");
        if (hits == null || misses == null) {
            return 0.0;
        }
        return (double) hits / (hits + misses);
    }

    // Record cache access    public void recordAccess(boolean isHit) {
        String key = isHit ? "cache:hits" : "cache:misses";
        ().increment(key, 1);
    }
}

7. Configuration Management

7.1 Dynamic configuration

@Configuration
@RefreshScope
public class CacheConfig {
    @Value("${:100}")
    private long hotThreshold;
    @Value("${:3600}")
    private long hotExpireSeconds;
    @Value("${:300}")
    private long normalExpireSeconds;

}

8. Summary

  • Hot spot identification

    • Use counter to record access frequency
    • Implement LRU algorithm management cache
  • Dynamic cache

    • Dynamically adjust the expiration time according to the access frequency
    • Timed tasks update hotspot data
  • Multi-level cache

    • Local cache with Redis
    • Reduce network overhead
  • Preloading mechanism

    • Preload historical hotspot data when system starts
    • Improve access performance after system startup
  • Update policy

    • Hotspot data is directly updated to cache
    • Delete the non-hot data
  • Monitoring alarm

    • Monitor cache hit rate
    • Record access statistics
  • Configuration Management

    • Support dynamic configuration adjustment
    • Flexible control of cache policies

This is the end of this article about the design of Redis dynamic hotspot data caching strategy. For more related Redis dynamic hotspot cache content, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!