go redis 计数
在 Go 中使用 Redis 做计数最常用的库是github.com/redis/go-redis/v9。以下是核心用法和常见场景1. 基础计数操作gopackage main import ( context fmt github.com/redis/go-redis/v9 ) func main() { ctx : context.Background() rdb : redis.NewClient(redis.Options{ Addr: localhost:6379, }) key : page:view:home // INCR - 自增 1 val, err : rdb.Incr(ctx, key).Result() fmt.Println(INCR:, val, err) // INCRBY - 自增指定数值 val, err rdb.IncrBy(ctx, key, 10).Result() fmt.Println(INCRBY:, val, err) // DECR - 自减 1 val, err rdb.Decr(ctx, key).Result() fmt.Println(DECR:, val, err) // DECRBY - 自减指定数值 val, err rdb.DecrBy(ctx, key, 5).Result() fmt.Println(DECRBY:, val, err) }2. 带过期时间的计数如每日统计go// 每日点赞数凌晨自动过期 func incrDailyLike(ctx context.Context, rdb *redis.Client, itemID string) (int64, error) { key : fmt.Sprintf(like:daily:%s:%s, time.Now().Format(2006-01-02), itemID) // 使用 Pipeline 原子执行 INCR EXPIRE pipe : rdb.Pipeline() incr : pipe.Incr(ctx, key) pipe.Expire(ctx, key, 25*time.Hour) // 留点余量 _, err : pipe.Exec(ctx) return incr.Val(), err }3. 限流计数滑动窗口go// 固定窗口限流每分钟内最多 100 次 func rateLimit(ctx context.Context, rdb *redis.Client, userID string) (bool, error) { key : fmt.Sprintf(ratelimit:%s:%d, userID, time.Now().Unix()/60) current, err : rdb.Incr(ctx, key).Result() if err ! nil { return false, err } if current 1 { // 第一次访问设置过期时间 rdb.Expire(ctx, key, time.Minute) } return current 100, nil }4. Hash 字段计数多维度统计go// 统计文章的多维度数据 rdb.HIncrBy(ctx, post:stats:123, views, 1) rdb.HIncrBy(ctx, post:stats:123, likes, 1) rdb.HIncrBy(ctx, post:stats:123, comments, 1) // 获取全部 stats, _ : rdb.HGetAll(ctx, post:stats:123).Result()5. 批量计数Pipelinegopipe : rdb.Pipeline() for i : 0; i 1000; i { pipe.Incr(ctx, fmt.Sprintf(counter:%d, i)) } _, err : pipe.Exec(ctx)关键注意点表格问题方案并发安全Redis 单线程INCR 天然原子无需加锁首次计数key 不存在时 INCR 自动从 0 开始返回 1溢出Redis 整数上限为 64 位有符号整数2^63-1持久化若数据极重要建议开启 AOF 或定期落库如果你有具体场景比如高并发计数、去重计数、分布式 ID 生成可以告诉我我给出更针对性的方案。在 Go 中使用go-redis获取计数值主要用GET系列命令。以下是常见场景的完整示例1. 基础获取gopackage main import ( context fmt strconv github.com/redis/go-redis/v9 ) func main() { ctx : context.Background() rdb : redis.NewClient(redis.Options{Addr: localhost:6379}) // 获取单个计数 val, err : rdb.Get(ctx, page:view:home).Result() if err redis.Nil { fmt.Println(key 不存在计数为 0) } else if err ! nil { panic(err) } else { count, _ : strconv.ParseInt(val, 10, 64) fmt.Println(当前计数:, count) } // 直接获取 int64推荐 count, err : rdb.Get(ctx, page:view:home).Int64() if err redis.Nil { count 0 } fmt.Println(计数:, count) }2. 批量获取多个计数go// MGET 一次性获取多个 key keys : []string{counter:a, counter:b, counter:c} vals, err : rdb.MGet(ctx, keys...).Result() // vals 是 []interface{}不存在的 key 对应 nil for i, v : range vals { if v nil { fmt.Printf(%s 0 (不存在)\n, keys[i]) } else { fmt.Printf(%s %v\n, keys[i], v) } }3. Hash 结构中的计数获取go// HGET 获取单个字段 views, _ : rdb.HGet(ctx, post:stats:123, views).Int64() // HMGET 获取多个字段 fields : []string{views, likes, comments} vals, _ : rdb.HMGet(ctx, post:stats:123, fields...).Result() // HGETALL 获取全部字段 all, _ : rdb.HGetAll(ctx, post:stats:123).Result() fmt.Println(all[views], all[likes])4. 获取并设置过期时间原子操作go// 获取计数同时刷新过期时间如会话活跃统计 pipe : rdb.Pipeline() get : pipe.Get(ctx, session:active:1001) pipe.Expire(ctx, session:active:1001, 30*time.Minute) _, err : pipe.Exec(ctx) count, _ : get.Int64()5. 获取时的类型转换方法go-redis的StringCmd提供了便捷转换表格方法说明.Result()返回(string, error).Int64()直接转int64key 不存在返回redis.Nil错误.Uint64()转uint64.Float64()转float64用于浮点计数.Bool()转bool6. 完整工具函数示例go// GetCounter 安全获取计数key 不存在返回 0 func GetCounter(ctx context.Context, rdb *redis.Client, key string) int64 { n, err : rdb.Get(ctx, key).Int64() if err redis.Nil { return 0 } if err ! nil { // 可打日志或上报 return 0 } return n } // GetCounters 批量获取返回 map[key]count func GetCounters(ctx context.Context, rdb *redis.Client, keys ...string) map[string]int64 { result : make(map[string]int64, len(keys)) if len(keys) 0 { return result } vals, err : rdb.MGet(ctx, keys...).Result() if err ! nil { return result } for i, v : range vals { if v ! nil { if n, ok : v.(string); ok { result[keys[i]], _ strconv.ParseInt(n, 10, 64) } } else { result[keys[i]] 0 } } return result }核心注意点Redis 中INCR等命令存储的是字符串Get返回的是字符串需用.Int64()转换key 不存在时Get返回redis.Nil错误不是返回0。

相关新闻

sql优化建议

sql优化建议

SELECT count(*) FROM "fsrs_cards" WHERE "fsrs_cards"."deleted_at" IS NULL and exist (select 1 from vocab_words where vocab_id 1001 and obj_id word_id and deleted_at is null) AND (user_id 1983799923358830592) AND (要分析这条S…

2026/7/30 20:59:33 阅读更多 →
RAGFlow、LightRAG 还是 GraphRAG?9 个维度帮你一次选对

RAGFlow、LightRAG 还是 GraphRAG?9 个维度帮你一次选对

从文档解析、关系推理到全局归纳,三套方案选型不靠参数对比,靠看清自己的核心约束 你的场景决定选哪个,没有银弹。 一、为什么需要它们:传统 RAG 的三道坎 问一句「过去半年设计评审中团队的主要分歧是什么」,传统 RA…

2026/7/30 20:59:33 阅读更多 →
三步掌握开源资源嗅探器:从零开始解锁全网音视频自由

三步掌握开源资源嗅探器:从零开始解锁全网音视频自由

三步掌握开源资源嗅探器:从零开始解锁全网音视频自由 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否曾为无…

2026/7/30 20:58:33 阅读更多 →

最新新闻

tbz文件怎么打开?TBZ文件是什么格式,用Win解压缩轻松处理

tbz文件怎么打开?TBZ文件是什么格式,用Win解压缩轻松处理

在日常下载资源时,偶尔会遇到后缀为 .tbz 的文件。很多人第一反应是它和 .zip 类似,但尝试用常规解压工具打开却会失败。TBZ 其实是一种来自类 Unix 系统的归档压缩格式,多数情况下是 TAR 归档经过 BZIP2 压缩后的短后缀写法。它常见于 Linux…

2026/7/30 21:11:36 阅读更多 →
BZ2文件怎么打开?详解bzip2压缩格式及Windows解压方法

BZ2文件怎么打开?详解bzip2压缩格式及Windows解压方法

很多人下载Linux源码包或旧备份文件时,会遇到后缀为.bz2的文件,双击后Windows却提示无法打开。BZ2是bzip2压缩格式的产物,在Linux生态中非常常见,但在Windows上需要借助合适的工具才能提取内容。它和ZIP、RAR这类“容器式”压缩格…

2026/7/30 21:11:36 阅读更多 →
终极指南:如何让Android投屏工具scrcpy性能提升300%

终极指南:如何让Android投屏工具scrcpy性能提升300%

终极指南:如何让Android投屏工具scrcpy性能提升300% 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 你是不是也遇到过这样的场景?用scrcpy连接手机进行开发调试&…

2026/7/30 21:11:36 阅读更多 →
Twitter Web Exporter终极指南:无需API密钥的Twitter数据批量导出解决方案

Twitter Web Exporter终极指南:无需API密钥的Twitter数据批量导出解决方案

Twitter Web Exporter终极指南:无需API密钥的Twitter数据批量导出解决方案 【免费下载链接】twitter-web-exporter Export tweets, bookmarks, lists and much more from Twitter(X) web app. (推文/书签/收藏/列表导出工具) 项目地址: https://gitcode.com/gh_mi…

2026/7/30 21:11:36 阅读更多 →
三分钟解锁Steam创意工坊:跨平台模组下载终极指南

三分钟解锁Steam创意工坊:跨平台模组下载终极指南

三分钟解锁Steam创意工坊:跨平台模组下载终极指南 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为GOG、Epic等平台的游戏无法使用Steam创意工坊的丰富模组而烦…

2026/7/30 21:11:36 阅读更多 →
物联网安全防护体系构建与实战案例分析

物联网安全防护体系构建与实战案例分析

1. 物联网安全现状与挑战物联网设备数量正以惊人的速度增长,预计到2025年全球联网设备将超过750亿台。但安全防护水平却远远跟不上这种扩张速度。我在过去三年处理过的物联网安全事件中,90%以上都源于基础防护措施的缺失。常见攻击手段包括:默…

2026/7/30 21:10:36 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻