房间号生成器
在写游戏服务器中, 特别是卡牌一类的游戏, 经常需要让用户手动输入房间号加入一个房间, 为了用户友好, 这个房间号通常需要限定长度, 比如4位或者6位数字. 因此用数据库的auto_increment对用户不太友好, 其一是长度不固定, 其二是后期房间号会很长, 所以专门写了一个房间号生成器服务器, 其满足以下需求:
- 指定生成的的房间号范围: 比如
[100000, 1000000) - 租借过期: 当一个房间号被生成后, 若超时未续期, 则自动释放(冻结)
- 房间号冻结: 当一个房间号被归还后, 在指定时间范围内不会被重新分配
安装
项目地址: 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) 相关推荐
darren0zdc 2020-10-16
ltstud 2020-07-24
Erick 2020-07-18
wujingsheng0 2020-06-16
xmwang0 2020-06-14
极品小肥羊 2020-05-31
小小书童 2020-05-20
极品小肥羊 2020-04-23
小小书童 2020-04-10
君小黑 2020-03-04
naiwenw 2020-02-18
小小书童 2020-02-22
dabaoge 2020-02-16
小小书童 2019-12-23
dabaoge 2020-01-25
MAC2007 2020-01-17
duanlove技术路途 2019-12-28