Showing Posts From

Redis

Redis 在 Windows 上注册为系统服务的两种方式

Redis 官方本身不出 Windows 版,只能靠社区移植版或者 WSL / Docker。想让它随开机启动,两条路。 方式一:tporadowski 移植版自带的服务参数 先下载 tporadowski/redis 的 zip,解压到 D:\Redis,目录里应该有: redis-server.exe redis-cli.exe redis.windows.conf管理员打开 CMD: cd /d D:\Redis redis-server.exe --service-install redis.windows.conf --service-name Redis redis-server.exe --service-start查看服务状态: sc query Redis或者 services.msc 里能看到"Redis"服务。 设置自动启动(默认就是): sc config Redis start= auto注意 start= 和 auto 之间必须有空格。 测试: redis-cli.exe ping返回 PONG 说明装好了。 停止 / 卸载: redis-server.exe --service-stop redis-server.exe --service-uninstall版本不支持 --service-install 的情况 装某些新版本时(例如 Redis 7.4.x 的某些 Windows 编译版)执行 --service-install 会报: *** FATAL CONFIG FILE ERROR (Redis 7.4.7) *** Reading the configuration file, at line 2 >>> 'service-install "redis.conf"' Bad directive or wrong number of arguments原因:这个版本不支持 --service-* 参数,redis-server.exe 直接把 --service-install 当成配置项塞进 conf 里解析,才报"错误指令"。 验证一下: redis-server.exe --help帮助里没有 --service-install / --service-start 就说明确实不支持。这时候上方式二。 方式二:NSSM 包装(通用兜底) NSSM 是个通用的 "把任何程序包成 Windows 服务" 的小工具。 管理员 CMD: nssm install redis弹出 GUI,填三项: Path: D:\Redis\redis-server.exe Startup directory: D:\Redis Arguments: D:\Redis\redis.conf保存后: nssm start redis日志、重启策略、依赖都能在 NSSM 里配。 验证 Redis 真的在监听 netstat -ano | findstr 6379看到: TCP 0.0.0.0:6379 LISTENING就通了。 一句话总结 有 --service-install 就用它、没有就用 NSSM,Windows 上把 Redis 装成开机服务这事就这两条路。

Redis Windows 安装为系统服务:service-install 命令与 Bad directive 报错修复

安装 Redis 为 Windows 服务 将 Redis 解压到目录(如 D:\Redis),管理员身份打开 CMD: cd /d D:\Redisredis-server.exe --service-install redis.windows.conf --service-name Redis注意:配置文件必须用 redis.windows.conf,不能用 redis.conf。 启动服务: redis-server.exe --service-start停止服务: redis-server.exe --service-stop卸载服务: redis-server.exe --service-uninstall验证连接: redis-cli.exe ping # 返回 PONG 表示成功查看 Redis 是否在监听: netstat -ano | findstr 6379报错:Bad directive *** FATAL CONFIG FILE ERROR (Redis 7.4.x) *** Reading the configuration file, at line 2 >>> 'service-install "redis.conf"' Bad directive or wrong number of arguments原因:Redis 7.x 对 --service-install 参数解析方式改变,直接写 redis.conf 会被误解析为配置文件内容。 修复方案:使用 Redis Windows 专用配置文件 redis.windows.conf(发行包中已包含): redis-server.exe --service-install redis.windows.conf --service-name Redis如果发行包只有 redis.conf,复制一份并重命名为 redis.windows.conf 即可。 设置开机自启 安装服务后默认为自动启动,查看启动类型: sc qc Redis若不是 AUTO_START,手动设置: sc config Redis start= auto注意 start= 后面必须有一个空格。 查看服务状态(或在 services.msc 图形界面查找 "Redis"): sc query RedisNSSM 替代方案 NSSM(Non-Sucking Service Manager)适合管理任何 exe 为 Windows 服务,不依赖 Redis 自带的 service 参数: nssm install Redis在弹出的图形界面中配置: Application Path: D:\Redis\redis-server.exe Arguments: D:\Redis\redis.windows.conf然后: nssm start RedisNSSM 还支持标准输出/错误重定向到日志文件,适合需要记录 Redis 日志的场景。

下载量统计:滑动窗口 vs 整点分桶与 Redis 分钟桶方案

两种统计方式 滑动窗口(实时系统首选) 统计"当前往前推 N 小时"的下载数: -- 1 小时下载量 SELECT COUNT(*) FROM downloads WHERE download_time >= NOW() - INTERVAL 1 HOUR;-- 3 小时下载量 SELECT COUNT(*) FROM downloads WHERE download_time >= NOW() - INTERVAL 3 HOUR;特点:平滑、不会整点突变,适合实时热榜、推荐系统、CDN 统计。 自然时间段(BI 报表常用) 按整点分桶,例如现在 15:37,统计范围是 15:00~15:59: SELECT COUNT(*) FROM downloads WHERE HOUR(download_time) = HOUR(NOW()) AND DATE(download_time) = CURDATE();适合财务报表、数据仓库场景,不适合实时排行——整点会出现排名抽搐。 Redis 分钟桶(高并发推荐) 生产环境不会每次扫大表,而是用 Redis 分钟桶: Key 格式:download:item:{id}:{yyyyMMddHHmm} 例如:download:item:123:202605281537每次下载: INCR download:item:123:202605281537 EXPIRE download:item:123:202605281537 86400查询 1 小时:累加最近 60 个分钟 Key 查询 3 小时:累加最近 180 个分钟 Key 逻辑上是滑动窗口,底层是时间桶——抖音、B站、Steam 热榜的标准做法。 热度分值 单纯看 1 小时容易被刷量,实际排行榜通常组合多个时间窗口: score = download_1h * 0.5 + download_3h * 0.3 + download_24h * 0.2再叠加时间衰减因子防止老内容永远霸榜。 方案选型场景 推荐方案普通业务后台 MySQL NOW() - INTERVAL高并发下载统计 Redis 分钟桶 + 定时汇总热门排序 1h + 3h + 24h 三个窗口组合历史分析 / BI ClickHouse 聚合

Redis 下载量统计:滑动窗口、时间桶与热度排名

两种时间口径 滑动窗口:统计 now() - INTERVAL 到 now() 的下载量,精确反映最近一段时间,但每次查询结果都在变化。 自然时间段:按整点(今天 0 点至今、本小时 0 分至今)统计,实现简单,但整点后计数归零,会出现明显跳变。 大多数业务选择自然时间段作为展示口径,滑动窗口用于后台热度计算。 Redis 分钟级时间桶 每次下载触发 INCR,key 包含资源 ID 和分钟级时间戳: download:item:123:202605281537时间戳格式:yyyyMMddHHmm,精度到分钟。 import redis from datetime import datetimer = redis.Redis()def record_download(item_id: int): minute_key = datetime.utcnow().strftime("%Y%m%d%H%M") key = f"download:item:{item_id}:{minute_key}" r.incr(key) r.expire(key, 86400 * 2) # 保留 2 天,超过不再需要EXPIRE 设为 2 天,避免 key 无限堆积。 查询最近 1 小时下载量 累加过去 60 个分钟 key: from datetime import datetime, timedeltadef get_downloads_1h(item_id: int) -> int: now = datetime.utcnow() keys = [] for i in range(60): t = now - timedelta(minutes=i) minute_key = t.strftime("%Y%m%d%H%M") keys.append(f"download:item:{item_id}:{minute_key}") counts = r.mget(keys) return sum(int(c) for c in counts if c)同理,3 小时累加 180 个 key,24 小时累加 1440 个 key。 热度排名分数 加权组合多个时间窗口,近期权重更高: def get_hot_score(item_id: int) -> float: h1 = get_downloads_1h(item_id) h3 = get_downloads_3h(item_id) h24 = get_downloads_24h(item_id) return h1 * 0.5 + h3 * 0.3 + h24 * 0.2定时任务(如每 5 分钟)批量计算所有资源的热度分,写入 Redis Sorted Set: r.zadd("hot:items", {str(item_id): score})查询热度榜: top10 = r.zrevrange("hot:items", 0, 9, withscores=True)写入性能优化 下载量高时,单个 key 的 INCR 有热点风险。可以用 Pipeline 批量写: pipe = r.pipeline() for item_id in download_batch: key = f"download:item:{item_id}:{minute_key}" pipe.incr(key) pipe.expire(key, 172800) pipe.execute()或者在应用层做本地聚合,每 30 秒一次性写入 Redis,减少 INCR 频率。 离线统计:ClickHouse 实时热度用 Redis 时间桶,历史下载量分析(按天/按地区)用 ClickHouse:每次下载写入 Kafka,消费后落表到 ClickHouse ClickHouse 按 item_id + date 聚合,查询速度远快于 MySQLRedis 时间桶适合实时排行榜,ClickHouse 适合报表和长周期分析,两者互补。