ToB企服应用市场:ToB评测及商务社交产业平台

标题: Redis动态热门数据缓存策略计划 [打印本页]

作者: 愛在花開的季節    时间: 5 天前
标题: Redis动态热门数据缓存策略计划
Redis动态热门数据缓存策略计划

1. 热门数据识别机制

1.1 计数器方式

  1. @Service
  2. public class HotDataCounter {
  3.     @Autowired
  4.     private RedisTemplate<String, Object> redisTemplate;
  5.     // 访问计数
  6.     public void incrementCounter(String key) {
  7.         String countKey = "counter:" + key;
  8.         redisTemplate.opsForValue().increment(countKey, 1);
  9.         // 设置计数器过期时间,比如1小时
  10.         redisTemplate.expire(countKey, 1, TimeUnit.HOURS);
  11.     }
  12.     // 获取访问次数
  13.     public Long getCounter(String key) {
  14.         String countKey = "counter:" + key;
  15.         return (Long) redisTemplate.opsForValue().get(countKey);
  16.     }
  17. }
复制代码
1.2 LRU算法实现

  1. public class LRUCache<K, V> extends LinkedHashMap<K, V> {
  2.     private final int capacity;
  3.     public LRUCache(int capacity) {
  4.         super(capacity, 0.75f, true);
  5.         this.capacity = capacity;
  6.     }
  7.     @Override
  8.     protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
  9.         return size() > capacity;
  10.     }
  11. }
复制代码
2. 动态缓存策略实现

2.1 基础缓存服务

  1. @Service
  2. public class DynamicCacheService {
  3.     @Autowired
  4.     private RedisTemplate<String, Object> redisTemplate;
  5.     @Autowired
  6.     private HotDataCounter hotDataCounter;
  7.     // 热点阈值
  8.     private static final long HOT_THRESHOLD = 100;
  9.     // 获取数据
  10.     public Object getData(String key) {
  11.         // 增加访问计数
  12.         hotDataCounter.incrementCounter(key);
  13.         // 从缓存获取数据
  14.         Object value = redisTemplate.opsForValue().get(key);
  15.         if (value != null) {
  16.             return value;
  17.         }
  18.         // 从数据库获取数据
  19.         value = getFromDB(key);
  20.         // 判断是否为热点数据
  21.         if (isHotData(key)) {
  22.             // 热点数据设置较长的过期时间
  23.             redisTemplate.opsForValue().set(key, value, 1, TimeUnit.HOURS);
  24.         } else {
  25.             // 非热点数据设置较短的过期时间
  26.             redisTemplate.opsForValue().set(key, value, 5, TimeUnit.MINUTES);
  27.         }
  28.         return value;
  29.     }
  30.     // 判断是否为热点数据
  31.     private boolean isHotData(String key) {
  32.         Long count = hotDataCounter.getCounter(key);
  33.         return count != null && count > HOT_THRESHOLD;
  34.     }
  35. }
复制代码
2.2 定时使命更新策略

  1. @Component
  2. public class HotDataScheduler {
  3.     @Autowired
  4.     private RedisTemplate<String, Object> redisTemplate;
  5.     @Scheduled(fixedRate = 300000) // 每5分钟执行一次
  6.     public void updateHotData() {
  7.         // 获取所有计数器
  8.         Set<String> counterKeys = redisTemplate.keys("counter:");
  9.         if (counterKeys == null) return;
  10.         // 更新热点数据过期时间
  11.         for (String counterKey : counterKeys) {
  12.             String dataKey = counterKey.substring("counter:".length());
  13.             Long count = (Long) redisTemplate.opsForValue().get(counterKey);
  14.             if (count != null && count > HOT_THRESHOLD) {
  15.                 // 延长热点数据过期时间
  16.                 redisTemplate.expire(dataKey, 1, TimeUnit.HOURS);
  17.             }
  18.         }
  19.     }
  20. }
复制代码
3. 多级缓存策略

3.1 本地缓存配合Redis

  1. @Service
  2. public class MultiLevelCache {
  3.     @Autowired
  4.     private RedisTemplate<String, Object> redisTemplate;
  5.     // 本地缓存
  6.     private final LoadingCache<String, Object> localCache = CacheBuilder.newBuilder()
  7.             .maximumSize(1000)
  8.             .expireAfterWrite(5, TimeUnit.MINUTES)
  9.             .build(new CacheLoader<String, Object>() {
  10.                 @Override
  11.                 public Object load(String key) {
  12.                     return getFromRedis(key);
  13.                 }
  14.             });
  15.     public Object get(String key) {
  16.         try {
  17.             return localCache.get(key);
  18.         } catch (ExecutionException e) {
  19.             return getFromRedis(key);
  20.         }
  21.     }
  22.     private Object getFromRedis(String key) {
  23.         Object value = redisTemplate.opsForValue().get(key);
  24.         if (value == null) {
  25.             value = getFromDB(key);
  26.             if (value != null) {
  27.                 redisTemplate.opsForValue().set(key, value);
  28.             }
  29.         }
  30.         return value;
  31.     }
  32. }
复制代码
4. 热门数据预加载

4.1 预热服务

  1. @Service
  2. public class HotDataPreloader {
  3.     @Autowired
  4.     private RedisTemplate<String, Object> redisTemplate;
  5.     @PostConstruct
  6.     public void preloadHotData() {
  7.         // 从统计数据中获取历史热点数据
  8.         List<String> historicalHotKeys = getHistoricalHotKeys();
  9.         // 预加载数据到Redis
  10.         for (String key : historicalHotKeys) {
  11.             Object value = getFromDB(key);
  12.             if (value != null) {
  13.                 redisTemplate.opsForValue().set(key, value, 1, TimeUnit.HOURS);
  14.             }
  15.         }
  16.     }
  17. }
复制代码
5. 缓存更新策略

5.1 更新服务

  1. @Service
  2. public class CacheUpdateService {
  3.     @Autowired
  4.     private RedisTemplate<String, Object> redisTemplate;
  5.     // 更新缓存数据
  6.     @Transactional
  7.     public void updateData(String key, Object value) {
  8.         // 更新数据库
  9.         updateDB(key, value);
  10.         // 判断是否为热点数据
  11.         if (isHotData(key)) {
  12.             // 直接更新缓存
  13.             redisTemplate.opsForValue().set(key, value, 1, TimeUnit.HOURS);
  14.         } else {
  15.             // 删除缓存
  16.             redisTemplate.delete(key);
  17.         }
  18.     }
  19. }
复制代码
6. 监控和告警

6.1 监控服务

  1. @Service
  2. public class CacheMonitorService {
  3.     @Autowired
  4.     private RedisTemplate<String, Object> redisTemplate;
  5.     // 监控缓存命中率
  6.     public double getHitRate() {
  7.         Long hits = (Long) redisTemplate.opsForValue().get("cache:hits");
  8.         Long misses = (Long) redisTemplate.opsForValue().get("cache:misses");
  9.         if (hits == null || misses == null) {
  10.             return 0.0;
  11.         }
  12.         return (double) hits / (hits + misses);
  13.     }
  14.     // 记录缓存访问
  15.     public void recordAccess(boolean isHit) {
  16.         String key = isHit ? "cache:hits" : "cache:misses";
  17.         redisTemplate.opsForValue().increment(key, 1);
  18.     }
  19. }
复制代码
7. 配置管理

7.1 动态配置

  1. @Configuration
  2. @RefreshScope
  3. public class CacheConfig {
  4.     @Value("${cache.hot.threshold:100}")
  5.     private long hotThreshold;
  6.     @Value("${cache.hot.expire:3600}")
  7.     private long hotExpireSeconds;
  8.     @Value("${cache.normal.expire:300}")
  9.     private long normalExpireSeconds;
  10. }
复制代码
8. 总结


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4