当前位置: 首页 > news >正文

Redsync 多 Redis 实例使用 demo

完整代码传送门

package mainimport ("context""fmt""net/http""redis-distributed-lock/redis_client""strconv""github.com/go-redsync/redsync/v4""github.com/go-redsync/redsync/v4/redis/goredis/v9"
)const port = 9981func main() {http.HandleFunc("/inventory/sale", sale)fmt.Printf("service start, port: %v\n", port)if err := http.ListenAndServe(fmt.Sprintf(":%v", port), nil); err != nil {panic(err)}
}const mutexName = "redlock"func sale(w http.ResponseWriter, r *http.Request) {pool1 := goredis.NewPool(redis_client.NewClientWithAddr("localhost:6380"))pool2 := goredis.NewPool(redis_client.NewClientWithAddr("localhost:6381"))pool3 := goredis.NewPool(redis_client.NewClientWithAddr("localhost:6382"))rs := redsync.New(pool1, pool2, pool3)mutex := rs.NewMutex(mutexName)if err := mutex.Lock(); err != nil {fmt.Printf("lock failed, err: %v\n", err)}reduceInventory()if ok, err := mutex.Unlock(); !ok || err != nil {fmt.Printf("unlock failed, err: %v\n", err)}
}const inventoryKey = "inventory"func reduceInventory() (string, error) {client := redis_client.NewClient()val, err := client.Get(context.Background(), inventoryKey).Result()if err != nil {fmt.Printf("redis get failed, err: %v, key: %v\n", err, inventoryKey)return "", err}inventory, err := strconv.ParseInt(val, 10, 64)if err != nil {fmt.Printf("parse int failed, err: %v, val: %v\n", err, inventory)return "", err}var msg stringif inventory > 0 {if err := client.Set(context.Background(), inventoryKey, inventory-1, 0).Err(); err != nil {fmt.Printf("redis set failed, err: %v, key: %v\n", err, inventoryKey)return "", err}msg = fmt.Sprintf("inventory: %v, port: %v", inventory-1, port)} else {msg = fmt.Sprintf("product slod out, port: %v", port)}fmt.Println(msg)return msg, nil
}
http://www.lryc.cn/news/215235.html

相关文章:

  • Docker(1)——安装Docker以及配置阿里云镜像加速
  • MCU HardFault_Handler调试方法
  • 【深度学习】AUTOMATIC1111 / stable-diffusion-webui docker
  • [Hive] 查询结果保存
  • Es中出现unassigned shards问题解决
  • RT-DERT:在实时目标检测上,DETRs打败了yolo
  • uniapp/H5富文本复制文本功能
  • 通付盾Web3专题 | 智能账户:数字时代基础单元
  • java网上阅读网站系统eclipse定制开发mysql数据库BS模式java编程jdbc
  • 人工智能基础_机器学习007_高斯分布_概率计算_最小二乘法推导_得出损失函数---人工智能工作笔记0047
  • 开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化
  • 安卓手机数据恢复工具 DiskDigger Pro 中文版-适用于已获得 root 权限的设备!可以从您的存储卡或内存恢复数据
  • Python 生成Android不同尺寸的图标
  • PHP使用GuzzleHttp进行HTTP请求
  • pytorch笔记:allclose,isclose,eq,equal
  • YoloV8修改检测框为中心点
  • 文言一心中将C语言归类为低级语言,这对么?
  • [补题记录] Codeforces Round 906 (Div. 2)(A~D)
  • Kubernetes yaml文件
  • Linux——切换CUDA版本
  • 利用云计算和微服务架构开发可扩展的同城外卖APP
  • 数据结构详细笔记——二叉树
  • react实现列表增删改查的小demo(class组件版)
  • 运行批处理文件,Windows 10至少提供了三种方法,有的可以设置定时运行
  • C++ detach线程的归属权和控制权交给runtime library的原因
  • Android应用集成RabbitMQ消息处理指南
  • 爆改86㎡户型,中式禅意,自然诗意!福州中宅装饰,福州装修
  • LVGL库入门 02 - 布局
  • 利用Vue2实现印章徽章组件
  • 金麟国际用工-全新蓝领跨境就业服务平台