9人参与 • 2025-06-10 • Redis
我们有一个 logmediaadidcache
类,用于缓存广告位 id,并定期从 redis 刷新数据。原始实现使用 set 存储数据,结构如下:
set logscraping:mediaadid [id1, id2, id3, ...]
但随着业务发展,我们需要存储更多元信息(如广告位名称、状态、更新时间等),仅用 set 已无法满足需求。
name
, status
, updatetime
)。因此,我们决定将数据结构从 set 改为 hash:
hash logscraping:mediaadid id1 -> { "name": "广告位1", "status": "active" } id2 -> { "name": "广告位2", "status": "inactive" }
特性 | set | hash |
---|---|---|
存储方式 | 无序唯一集合 | 键值对存储(field-value) |
适用场景 | 去重、集合运算(交集、并集) | 结构化数据,需存储额外属性 |
查询效率 | o(1) 判断元素是否存在 | o(1) 按 field 查询 value |
扩展性 | 只能存储单一值 | 可存储复杂对象(json、map) |
结论:
@component @slf4j @requiredargsconstructor public class logmediaadidcache { private final redistemplate<string, string> redistemplate; private volatile set<long> cachedlogmediaadids = collections.emptyset(); public static final string log_redis_key = "logscraping:mediaadid"; @postconstruct public void init() { refreshcache(); } @scheduled(fixedrate = 5 * 1000) // 每5秒刷新一次 public void refreshcache() { try { map<object, object> idmap = redistemplate.opsforhash().entries(log_redis_key); if (idmap != null) { set<long> newcache = idmap.keyset().stream() .map(key -> long.valueof(key.tostring())) .collect(collectors.toset()); this.cachedlogmediaadids = newcache; log.info("广告位id缓存刷新成功,数量: {}", newcache.size()); } } catch (exception e) { log.error("刷新广告位id缓存失败", e); } } public set<long> getlogmediaadids() { return collections.unmodifiableset(cachedlogmediaadids); } public boolean contains(long mediaadid) { return cachedlogmediaadids.contains(mediaadid); } // 新增方法:获取广告位详情 public string getadinfo(long mediaadid) { return redistemplate.<string, string>opsforhash().get(log_redis_key, mediaadid.tostring()); } // 新增方法:更新广告位信息 public void updateadinfo(long mediaadid, string info) { redistemplate.opsforhash().put(log_redis_key, mediaadid.tostring(), info); refreshcache(); // 立即刷新缓存 } }
opsforhash()
操作 redis hash,支持结构化存储。getadinfo()
方法,按广告位 id 查询详情。updateadinfo()
方法,支持动态更新数据。@component @slf4j @requiredargsconstructor public class logstatsmonitorjob { private final redistemplate<string, string> redistemplate; private static final string log_stats_key = "log:stats:1635474646"; @scheduled(fixedrate = 10 * 1000) // 每10秒执行一次 public void monitorlogstats() { string currenttimekey = getformattedtime(); string fullkey = log_stats_key + ":" + currenttimekey; try { map<object, object> stats = redistemplate.opsforhash().entries(fullkey); if (stats == null || stats.isempty()) { log.warn("未找到统计信息: {}", fullkey); return; } log.info("----- 统计信息监控(key: {})-----", fullkey); stats.foreach((field, value) -> log.info("{}: {}", field, value)); // 业务处理示例 int total = integer.parseint(stats.getordefault("total", "0").tostring()); if (total > 1000) { log.warn("警告:数据量过大({}条)", total); } } catch (exception e) { log.error("监控统计信息失败", e); } } private string getformattedtime() { // 生成格式化的时间戳,如 20250609175050 return localdatetime.now() .format(datetimeformatter.ofpattern("yyyymmddhhmmss")); } }
(见上文 3.1 节)
(见上文 4.1 节)
@configuration @enablescheduling public class schedulingconfig { // 启用定时任务 }
本文通过一个实际案例,演示了如何将 redis 数据结构从 set 迁移到 hash,并实现高效定时监控。合理的数据结构选择 + 定时任务优化,可以显著提升系统性能和可维护性。
以上就是redis定时监控与数据处理实践指南的详细内容,更多关于redis定时监控与数据处理的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论