房间号生成器

在写游戏服务器中, 特别是卡牌一类的游戏, 经常需要让用户手动输入房间号加入一个房间, 为了用户友好, 这个房间号通常需要限定长度, 比如4位或者6位数字. 因此用数据库的auto_increment对用户不太友好, 其一是长度不固定, 其二是后期房间号会很长, 所以专门写了一个房间号生成器服务器, 其满足以下需求:

  1. 指定生成的的房间号范围: 比如[100000, 1000000)
  2. 租借过期: 当一个房间号被生成后, 若超时未续期, 则自动释放(冻结)
  3. 房间号冻结: 当一个房间号被归还后, 在指定时间范围内不会被重新分配

安装

项目地址: https://github.com/acrazing/uno

安装:

go get -u github.com/acrazing/uno

使用

接口很简单:

import "github.com/acrazing/uno"
import "context"

// 创建一个worker
w := uno.NewWorker()

// 配置
w.Init(&uno.Options{
    MinValue: 1e5,
    MaxValue: 1e6,
})
// 启动服务
go w.Run(context.Background())
// 生成ID
no := w.Rent()
if no == 0 {
    // 如果返回0, 则表示生成房间号失败
    panic("")
}
// 释放ID
w.Return(no)
// 续租ID
ok := w.Relet(no)
if ok {
    // 如果返回false, 表示续租失败
}

gRPC

gRPC的服务和消息都已经定义好, 可以直接取用:

    addr := "127.0.0.1:1234"

    // server
    listener, err := net.Listen("tcp", addr)
    if err != nil {
        panic(err)
    }
    server := grpc.NewServer()
    uno.RegisterUnoServer(server, uno.Service)
    uno.Service.Init(&uno.Options{
        MinValue: 2,
        MaxValue: 5,
        TTF:      time.Second,
        TTL:      time.Second,
    })
    go uno.Service.Run(context.Background())
    go server.Serve(listener)

    // client
    conn, _ := grpc.Dial(addr, grpc.WithInsecure())
    client := uno.NewUnoClient(conn)
    no, err := client.Rent(context.Background(), &uno.Empty{})
    log.Printf("rent: %v, err: %v", no, err)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值