优化RankService排行榜服务

This commit is contained in:
orgin
2022-11-19 16:00:16 +08:00
parent 95b4e2f8de
commit 5bea050f63
7 changed files with 457 additions and 230 deletions

View File

@@ -27,7 +27,6 @@ type RankData struct {
Key uint64 `protobuf:"varint,1,opt,name=Key,proto3" json:"Key,omitempty"`
SortData []int64 `protobuf:"varint,2,rep,packed,name=SortData,proto3" json:"SortData,omitempty"`
Data []byte `protobuf:"bytes,3,opt,name=Data,proto3" json:"Data,omitempty"`
ExpireMs int64 `protobuf:"varint,4,opt,name=expireMs,proto3" json:"expireMs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -87,17 +86,10 @@ func (m *RankData) GetData() []byte {
return nil
}
func (m *RankData) GetExpireMs() int64 {
if m != nil {
return m.ExpireMs
}
return 0
}
// RankPosData 排行数据——查询返回
type RankPosData struct {
Key uint64 `protobuf:"varint,1,opt,name=Key,proto3" json:"Key,omitempty"`
RankPos uint64 `protobuf:"varint,2,opt,name=RankPos,proto3" json:"RankPos,omitempty"`
Rank uint64 `protobuf:"varint,2,opt,name=Rank,proto3" json:"Rank,omitempty"`
SortData []int64 `protobuf:"varint,3,rep,packed,name=SortData,proto3" json:"SortData,omitempty"`
Data []byte `protobuf:"bytes,4,opt,name=Data,proto3" json:"Data,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -145,9 +137,9 @@ func (m *RankPosData) GetKey() uint64 {
return 0
}
func (m *RankPosData) GetRankPos() uint64 {
func (m *RankPosData) GetRank() uint64 {
if m != nil {
return m.RankPos
return m.Rank
}
return 0
}
@@ -172,6 +164,7 @@ type RankList struct {
SkipListLevel int32 `protobuf:"varint,2,opt,name=SkipListLevel,proto3" json:"SkipListLevel,omitempty"`
IsDec bool `protobuf:"varint,3,opt,name=IsDec,proto3" json:"IsDec,omitempty"`
MaxRank uint64 `protobuf:"varint,4,opt,name=MaxRank,proto3" json:"MaxRank,omitempty"`
ExpireMs int64 `protobuf:"varint,5,opt,name=ExpireMs,proto3" json:"ExpireMs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -238,6 +231,13 @@ func (m *RankList) GetMaxRank() uint64 {
return 0
}
func (m *RankList) GetExpireMs() int64 {
if m != nil {
return m.ExpireMs
}
return 0
}
// UpsetRankData 更新排行榜数据
type UpsetRankData struct {
RankId uint64 `protobuf:"varint,1,opt,name=RankId,proto3" json:"RankId,omitempty"`
@@ -294,7 +294,7 @@ func (m *UpsetRankData) GetRankDataList() []*RankData {
return nil
}
// DeleteByKey 更新排行榜数据
// DeleteByKey 删除排行榜数据
type DeleteByKey struct {
RankId uint64 `protobuf:"varint,1,opt,name=RankId,proto3" json:"RankId,omitempty"`
KeyList []uint64 `protobuf:"varint,2,rep,packed,name=KeyList,proto3" json:"KeyList,omitempty"`
@@ -454,27 +454,27 @@ func (m *FindRankDataByKey) GetKey() uint64 {
return 0
}
// FindRankDataByPos 查找排行信息
type FindRankDataByPos struct {
// FindRankDataByRank 查找排行信息
type FindRankDataByRank struct {
RankId uint64 `protobuf:"varint,1,opt,name=RankId,proto3" json:"RankId,omitempty"`
Pos uint64 `protobuf:"varint,2,opt,name=Pos,proto3" json:"Pos,omitempty"`
Rank uint64 `protobuf:"varint,2,opt,name=Rank,proto3" json:"Rank,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *FindRankDataByPos) Reset() { *m = FindRankDataByPos{} }
func (m *FindRankDataByPos) String() string { return proto.CompactTextString(m) }
func (*FindRankDataByPos) ProtoMessage() {}
func (*FindRankDataByPos) Descriptor() ([]byte, []int) {
func (m *FindRankDataByRank) Reset() { *m = FindRankDataByRank{} }
func (m *FindRankDataByRank) String() string { return proto.CompactTextString(m) }
func (*FindRankDataByRank) ProtoMessage() {}
func (*FindRankDataByRank) Descriptor() ([]byte, []int) {
return fileDescriptor_d5b64eda47521620, []int{7}
}
func (m *FindRankDataByPos) XXX_Unmarshal(b []byte) error {
func (m *FindRankDataByRank) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *FindRankDataByPos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
func (m *FindRankDataByRank) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_FindRankDataByPos.Marshal(b, m, deterministic)
return xxx_messageInfo_FindRankDataByRank.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
@@ -484,54 +484,54 @@ func (m *FindRankDataByPos) XXX_Marshal(b []byte, deterministic bool) ([]byte, e
return b[:n], nil
}
}
func (m *FindRankDataByPos) XXX_Merge(src proto.Message) {
xxx_messageInfo_FindRankDataByPos.Merge(m, src)
func (m *FindRankDataByRank) XXX_Merge(src proto.Message) {
xxx_messageInfo_FindRankDataByRank.Merge(m, src)
}
func (m *FindRankDataByPos) XXX_Size() int {
func (m *FindRankDataByRank) XXX_Size() int {
return m.Size()
}
func (m *FindRankDataByPos) XXX_DiscardUnknown() {
xxx_messageInfo_FindRankDataByPos.DiscardUnknown(m)
func (m *FindRankDataByRank) XXX_DiscardUnknown() {
xxx_messageInfo_FindRankDataByRank.DiscardUnknown(m)
}
var xxx_messageInfo_FindRankDataByPos proto.InternalMessageInfo
var xxx_messageInfo_FindRankDataByRank proto.InternalMessageInfo
func (m *FindRankDataByPos) GetRankId() uint64 {
func (m *FindRankDataByRank) GetRankId() uint64 {
if m != nil {
return m.RankId
}
return 0
}
func (m *FindRankDataByPos) GetPos() uint64 {
func (m *FindRankDataByRank) GetRank() uint64 {
if m != nil {
return m.Pos
return m.Rank
}
return 0
}
// FindRankDataListStartTo 查找排行信息,StartPos开始Count个
type FindRankDataListStartTo struct {
// FindRankDataList 查找排行信息
type FindRankDataList struct {
RankId uint64 `protobuf:"varint,1,opt,name=RankId,proto3" json:"RankId,omitempty"`
StartPos uint64 `protobuf:"varint,2,opt,name=StartPos,proto3" json:"StartPos,omitempty"`
StartRank uint64 `protobuf:"varint,2,opt,name=StartRank,proto3" json:"StartRank,omitempty"`
Count uint64 `protobuf:"varint,3,opt,name=Count,proto3" json:"Count,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *FindRankDataListStartTo) Reset() { *m = FindRankDataListStartTo{} }
func (m *FindRankDataListStartTo) String() string { return proto.CompactTextString(m) }
func (*FindRankDataListStartTo) ProtoMessage() {}
func (*FindRankDataListStartTo) Descriptor() ([]byte, []int) {
func (m *FindRankDataList) Reset() { *m = FindRankDataList{} }
func (m *FindRankDataList) String() string { return proto.CompactTextString(m) }
func (*FindRankDataList) ProtoMessage() {}
func (*FindRankDataList) Descriptor() ([]byte, []int) {
return fileDescriptor_d5b64eda47521620, []int{8}
}
func (m *FindRankDataListStartTo) XXX_Unmarshal(b []byte) error {
func (m *FindRankDataList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *FindRankDataListStartTo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
func (m *FindRankDataList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_FindRankDataListStartTo.Marshal(b, m, deterministic)
return xxx_messageInfo_FindRankDataList.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
@@ -541,33 +541,33 @@ func (m *FindRankDataListStartTo) XXX_Marshal(b []byte, deterministic bool) ([]b
return b[:n], nil
}
}
func (m *FindRankDataListStartTo) XXX_Merge(src proto.Message) {
xxx_messageInfo_FindRankDataListStartTo.Merge(m, src)
func (m *FindRankDataList) XXX_Merge(src proto.Message) {
xxx_messageInfo_FindRankDataList.Merge(m, src)
}
func (m *FindRankDataListStartTo) XXX_Size() int {
func (m *FindRankDataList) XXX_Size() int {
return m.Size()
}
func (m *FindRankDataListStartTo) XXX_DiscardUnknown() {
xxx_messageInfo_FindRankDataListStartTo.DiscardUnknown(m)
func (m *FindRankDataList) XXX_DiscardUnknown() {
xxx_messageInfo_FindRankDataList.DiscardUnknown(m)
}
var xxx_messageInfo_FindRankDataListStartTo proto.InternalMessageInfo
var xxx_messageInfo_FindRankDataList proto.InternalMessageInfo
func (m *FindRankDataListStartTo) GetRankId() uint64 {
func (m *FindRankDataList) GetRankId() uint64 {
if m != nil {
return m.RankId
}
return 0
}
func (m *FindRankDataListStartTo) GetStartPos() uint64 {
func (m *FindRankDataList) GetStartRank() uint64 {
if m != nil {
return m.StartPos
return m.StartRank
}
return 0
}
func (m *FindRankDataListStartTo) GetCount() uint64 {
func (m *FindRankDataList) GetCount() uint64 {
if m != nil {
return m.Count
}
@@ -633,8 +633,8 @@ func (m *RankDataList) GetRankPosDataList() []*RankPosData {
// RankResult
type RankResult struct {
AddCount int32 `protobuf:"varint,1,opt,name=AddCount,proto3" json:"AddCount,omitempty"`
RemoveCount int32 `protobuf:"varint,2,opt,name=RemoveCount,proto3" json:"RemoveCount,omitempty"`
ModifyCount int32 `protobuf:"varint,3,opt,name=ModifyCount,proto3" json:"ModifyCount,omitempty"`
ModifyCount int32 `protobuf:"varint,2,opt,name=ModifyCount,proto3" json:"ModifyCount,omitempty"`
RemoveCount int32 `protobuf:"varint,3,opt,name=RemoveCount,proto3" json:"RemoveCount,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -680,16 +680,16 @@ func (m *RankResult) GetAddCount() int32 {
return 0
}
func (m *RankResult) GetRemoveCount() int32 {
func (m *RankResult) GetModifyCount() int32 {
if m != nil {
return m.RemoveCount
return m.ModifyCount
}
return 0
}
func (m *RankResult) GetModifyCount() int32 {
func (m *RankResult) GetRemoveCount() int32 {
if m != nil {
return m.ModifyCount
return m.RemoveCount
}
return 0
}
@@ -702,8 +702,8 @@ func init() {
proto.RegisterType((*DeleteByKey)(nil), "rpc.DeleteByKey")
proto.RegisterType((*AddRankList)(nil), "rpc.AddRankList")
proto.RegisterType((*FindRankDataByKey)(nil), "rpc.FindRankDataByKey")
proto.RegisterType((*FindRankDataByPos)(nil), "rpc.FindRankDataByPos")
proto.RegisterType((*FindRankDataListStartTo)(nil), "rpc.FindRankDataListStartTo")
proto.RegisterType((*FindRankDataByRank)(nil), "rpc.FindRankDataByRank")
proto.RegisterType((*FindRankDataList)(nil), "rpc.FindRankDataList")
proto.RegisterType((*RankDataList)(nil), "rpc.RankDataList")
proto.RegisterType((*RankResult)(nil), "rpc.RankResult")
}
@@ -711,37 +711,37 @@ func init() {
func init() { proto.RegisterFile("proto/rpcproto/rank.proto", fileDescriptor_d5b64eda47521620) }
var fileDescriptor_d5b64eda47521620 = []byte{
// 468 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xdf, 0x8b, 0xd3, 0x40,
0x10, 0x26, 0x4d, 0x72, 0x2d, 0x93, 0x2b, 0x9e, 0xab, 0x68, 0xf4, 0xa1, 0x84, 0x45, 0xb0, 0x4f,
0x15, 0x15, 0x7c, 0x50, 0x44, 0x7a, 0x16, 0xe1, 0xb8, 0x2b, 0xc8, 0x54, 0x5f, 0xee, 0x2d, 0x66,
0x57, 0x0c, 0xad, 0xcd, 0x92, 0xec, 0x1d, 0xed, 0x7f, 0xe8, 0xa3, 0x7f, 0x82, 0xf4, 0x2f, 0x91,
0xd9, 0x64, 0xf3, 0xe3, 0x8e, 0xf4, 0x6d, 0xbe, 0x6f, 0xbe, 0xcc, 0x37, 0x3b, 0x33, 0x04, 0x9e,
0xa9, 0x3c, 0xd3, 0xd9, 0xab, 0x5c, 0x25, 0x55, 0x10, 0x6f, 0xd7, 0x33, 0x13, 0x32, 0x37, 0x57,
0x09, 0xff, 0x05, 0x23, 0x8c, 0xb7, 0xeb, 0x45, 0xac, 0x63, 0x76, 0x06, 0xee, 0xa5, 0xdc, 0x87,
0x4e, 0xe4, 0x4c, 0x3d, 0xa4, 0x90, 0x3d, 0x87, 0xd1, 0x2a, 0xcb, 0x35, 0x65, 0xc3, 0x41, 0xe4,
0x4e, 0x5d, 0xac, 0x31, 0x63, 0xe0, 0x19, 0xde, 0x8d, 0x9c, 0xe9, 0x29, 0x9a, 0x98, 0xf4, 0x72,
0xa7, 0xd2, 0x5c, 0x2e, 0x8b, 0xd0, 0x8b, 0x1c, 0xd2, 0x5b, 0xcc, 0x53, 0x08, 0xc8, 0xe9, 0x6b,
0x56, 0xf4, 0x98, 0x85, 0x30, 0xac, 0x04, 0xe1, 0xc0, 0xb0, 0x16, 0x76, 0xda, 0x70, 0x7b, 0xda,
0xf0, 0x9a, 0x36, 0xf8, 0xae, 0x7c, 0xd4, 0x55, 0x5a, 0x68, 0xf6, 0x04, 0x4e, 0x28, 0xbe, 0x10,
0x95, 0x55, 0x85, 0xd8, 0x0b, 0x18, 0xaf, 0xd6, 0xa9, 0x22, 0xcd, 0x95, 0xbc, 0x95, 0x1b, 0xe3,
0xe9, 0x63, 0x97, 0x64, 0x8f, 0xc1, 0xbf, 0x28, 0x16, 0x32, 0x31, 0xaf, 0x1c, 0x61, 0x09, 0xa8,
0xd3, 0x65, 0xbc, 0xa3, 0x42, 0xc6, 0xd6, 0x43, 0x0b, 0xf9, 0x35, 0x8c, 0xbf, 0xab, 0x42, 0xea,
0x7a, 0xa6, 0x7d, 0xf6, 0xaf, 0xe1, 0xd4, 0x6a, 0xc8, 0xcd, 0x4c, 0x37, 0x78, 0x33, 0x9e, 0xe5,
0x2a, 0x99, 0xd9, 0x04, 0x76, 0x24, 0xfc, 0x13, 0x04, 0x0b, 0xb9, 0x91, 0x5a, 0x9e, 0xef, 0x69,
0x5c, 0x7d, 0x95, 0x43, 0x18, 0x5e, 0xca, 0x7d, 0x5d, 0xd4, 0x43, 0x0b, 0xf9, 0x3b, 0x08, 0xe6,
0x42, 0xd4, 0x93, 0x79, 0x09, 0xc3, 0xb9, 0x10, 0x46, 0xe8, 0xdc, 0x71, 0x27, 0x12, 0x6d, 0x96,
0x7f, 0x84, 0x87, 0x5f, 0xd2, 0xad, 0xb0, 0xcd, 0x1c, 0xb7, 0xaf, 0xf6, 0x3a, 0xa8, 0xf7, 0x7a,
0xff, 0x73, 0x5a, 0xe9, 0x91, 0xcf, 0x9b, 0x03, 0xa0, 0x90, 0x27, 0xf0, 0xb4, 0xfd, 0x39, 0x75,
0xb4, 0xd2, 0x71, 0xae, 0xbf, 0x65, 0xbd, 0x45, 0xe8, 0x5e, 0x48, 0xd2, 0x54, 0xaa, 0x31, 0x6d,
0xf4, 0x73, 0x76, 0xb3, 0xd5, 0x66, 0xa3, 0x1e, 0x96, 0x80, 0xab, 0xee, 0x3a, 0xe8, 0x3a, 0x2c,
0x2e, 0xd5, 0xa5, 0x41, 0x97, 0x64, 0xef, 0xe1, 0x41, 0xeb, 0xa4, 0x5b, 0x7b, 0x3c, 0xab, 0x27,
0x59, 0xe5, 0xf0, 0xae, 0x90, 0x6f, 0x00, 0x88, 0x42, 0x59, 0xdc, 0x6c, 0x34, 0x75, 0x3c, 0x17,
0xa2, 0xb1, 0xf2, 0xb1, 0xc6, 0x2c, 0x82, 0x00, 0xe5, 0xef, 0xec, 0x56, 0x96, 0xe9, 0xf2, 0x4e,
0xdb, 0x14, 0x29, 0x96, 0x99, 0x48, 0x7f, 0xee, 0x9b, 0x97, 0xf9, 0xd8, 0xa6, 0xce, 0x1f, 0xfd,
0x39, 0x4c, 0x9c, 0xbf, 0x87, 0x89, 0xf3, 0xef, 0x30, 0x71, 0xae, 0xfd, 0xd9, 0x87, 0x5c, 0x25,
0x3f, 0x4e, 0xcc, 0x7f, 0xe0, 0xed, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x0e, 0xaf, 0x42,
0x24, 0x04, 0x00, 0x00,
// 470 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0x51, 0x8b, 0xd3, 0x40,
0x10, 0x66, 0x9b, 0xe4, 0x5a, 0x27, 0x57, 0xac, 0xab, 0x48, 0x14, 0x29, 0x61, 0x11, 0xec, 0x53,
0x45, 0x05, 0x1f, 0x14, 0xd1, 0x9e, 0x55, 0x38, 0xae, 0x05, 0xd9, 0xe2, 0xcb, 0x3d, 0x08, 0x31,
0xbb, 0x42, 0x68, 0x6d, 0x96, 0xcd, 0xde, 0x71, 0xfd, 0x1f, 0xfe, 0x28, 0x1f, 0xfd, 0x09, 0xd2,
0x5f, 0x22, 0xb3, 0xc9, 0xa6, 0xc9, 0x61, 0xfa, 0x36, 0xdf, 0x37, 0x5f, 0xe6, 0x9b, 0x9d, 0x19,
0x02, 0x8f, 0x94, 0xce, 0x4d, 0xfe, 0x5c, 0xab, 0xb4, 0x0a, 0x92, 0xed, 0x7a, 0x6a, 0x43, 0xea,
0x69, 0x95, 0xb2, 0x05, 0x0c, 0x78, 0xb2, 0x5d, 0xcf, 0x13, 0x93, 0xd0, 0x11, 0x78, 0x17, 0x72,
0x17, 0x91, 0x98, 0x4c, 0x7c, 0x8e, 0x21, 0x7d, 0x0c, 0x83, 0x55, 0xae, 0x0d, 0x66, 0xa3, 0x5e,
0xec, 0x4d, 0x3c, 0x5e, 0x63, 0x4a, 0xc1, 0xb7, 0xbc, 0x17, 0x93, 0xc9, 0x29, 0xb7, 0x31, 0x4b,
0x21, 0xc4, 0x6a, 0x5f, 0xf2, 0xa2, 0xa3, 0x20, 0x05, 0x1f, 0x05, 0x51, 0xcf, 0x52, 0x36, 0x6e,
0x99, 0x78, 0x1d, 0x26, 0x7e, 0xc3, 0xe4, 0x17, 0x29, 0x7b, 0x5e, 0x64, 0x85, 0xa1, 0x0f, 0xe1,
0x04, 0xe3, 0x73, 0x51, 0xb9, 0x54, 0x88, 0x3e, 0x85, 0xe1, 0x6a, 0x9d, 0x29, 0xd4, 0x2c, 0xe4,
0xb5, 0xdc, 0x58, 0xc7, 0x80, 0xb7, 0x49, 0xfa, 0x00, 0x82, 0xf3, 0x62, 0x2e, 0x53, 0xfb, 0x88,
0x01, 0x2f, 0x01, 0x8d, 0xa0, 0xbf, 0x4c, 0x6e, 0x6c, 0x9f, 0xbe, 0x2d, 0xea, 0x20, 0xb6, 0xfa,
0xe9, 0x46, 0x65, 0x5a, 0x2e, 0x8b, 0x28, 0x88, 0x09, 0xb6, 0xea, 0x30, 0xbb, 0x84, 0xe1, 0x57,
0x55, 0x48, 0x53, 0x8f, 0xb3, 0xab, 0xb5, 0x17, 0x70, 0xea, 0x34, 0xd8, 0x89, 0x1d, 0x6c, 0xf8,
0x72, 0x38, 0xd5, 0x2a, 0x9d, 0xba, 0x04, 0x6f, 0x49, 0xd8, 0x7b, 0x08, 0xe7, 0x72, 0x23, 0x8d,
0x3c, 0xdb, 0xe1, 0x14, 0xbb, 0x2a, 0x47, 0xd0, 0xbf, 0x90, 0xbb, 0xba, 0xa8, 0xcf, 0x1d, 0x64,
0xaf, 0x21, 0x9c, 0x09, 0x51, 0x4f, 0xed, 0x19, 0xf4, 0x67, 0x42, 0x58, 0x21, 0xb9, 0xe5, 0x8e,
0x24, 0x77, 0x59, 0xf6, 0x0e, 0xee, 0x7d, 0xce, 0xb6, 0xc2, 0x35, 0x73, 0xdc, 0xbe, 0x5a, 0x77,
0xaf, 0x5e, 0x37, 0xfb, 0x00, 0xb4, 0xfd, 0xb9, 0x9d, 0x62, 0xd7, 0xf7, 0xff, 0x39, 0x0e, 0xf6,
0x0d, 0x46, 0xcd, 0x0a, 0x47, 0x77, 0xfe, 0x04, 0xee, 0xac, 0x4c, 0xa2, 0x4d, 0xa3, 0xc8, 0x81,
0xc0, 0x5d, 0x7f, 0xcc, 0xaf, 0xb6, 0xc6, 0xee, 0xda, 0xe7, 0x25, 0x60, 0xaa, 0xbd, 0x0c, 0xbc,
0x1b, 0x87, 0x4b, 0x75, 0x69, 0xd1, 0x26, 0xe9, 0x1b, 0xb8, 0xdb, 0xb8, 0xf3, 0xc6, 0x16, 0x47,
0xf5, 0x1c, 0xab, 0x1c, 0xbf, 0x2d, 0x64, 0x1b, 0x00, 0xa4, 0xb8, 0x2c, 0xae, 0x36, 0x06, 0x2f,
0x6a, 0x26, 0xc4, 0xc1, 0x2a, 0xe0, 0x35, 0xa6, 0x31, 0x84, 0xcb, 0x5c, 0x64, 0x3f, 0x76, 0x65,
0xba, 0xbc, 0xe0, 0x26, 0x85, 0x0a, 0x2e, 0x7f, 0xe6, 0xd7, 0xf2, 0xf0, 0xb2, 0x80, 0x37, 0xa9,
0xb3, 0xfb, 0xbf, 0xf7, 0x63, 0xf2, 0x67, 0x3f, 0x26, 0x7f, 0xf7, 0x63, 0x72, 0x19, 0x4c, 0xdf,
0x6a, 0x95, 0x7e, 0x3f, 0xb1, 0x3f, 0x80, 0x57, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc9, 0xb1,
0x14, 0x9a, 0x1d, 0x04, 0x00, 0x00,
}
func (m *RankData) Marshal() (dAtA []byte, err error) {
@@ -768,11 +768,6 @@ func (m *RankData) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if m.ExpireMs != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.ExpireMs))
i--
dAtA[i] = 0x20
}
if len(m.Data) > 0 {
i -= len(m.Data)
copy(dAtA[i:], m.Data)
@@ -857,8 +852,8 @@ func (m *RankPosData) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i--
dAtA[i] = 0x1a
}
if m.RankPos != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.RankPos))
if m.Rank != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.Rank))
i--
dAtA[i] = 0x10
}
@@ -894,6 +889,11 @@ func (m *RankList) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if m.ExpireMs != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.ExpireMs))
i--
dAtA[i] = 0x28
}
if m.MaxRank != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.MaxRank))
i--
@@ -1096,7 +1096,7 @@ func (m *FindRankDataByKey) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *FindRankDataByPos) Marshal() (dAtA []byte, err error) {
func (m *FindRankDataByRank) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
@@ -1106,12 +1106,12 @@ func (m *FindRankDataByPos) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil
}
func (m *FindRankDataByPos) MarshalTo(dAtA []byte) (int, error) {
func (m *FindRankDataByRank) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *FindRankDataByPos) MarshalToSizedBuffer(dAtA []byte) (int, error) {
func (m *FindRankDataByRank) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
@@ -1120,8 +1120,8 @@ func (m *FindRankDataByPos) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if m.Pos != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.Pos))
if m.Rank != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.Rank))
i--
dAtA[i] = 0x10
}
@@ -1133,7 +1133,7 @@ func (m *FindRankDataByPos) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *FindRankDataListStartTo) Marshal() (dAtA []byte, err error) {
func (m *FindRankDataList) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
@@ -1143,12 +1143,12 @@ func (m *FindRankDataListStartTo) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil
}
func (m *FindRankDataListStartTo) MarshalTo(dAtA []byte) (int, error) {
func (m *FindRankDataList) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *FindRankDataListStartTo) MarshalToSizedBuffer(dAtA []byte) (int, error) {
func (m *FindRankDataList) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
@@ -1162,8 +1162,8 @@ func (m *FindRankDataListStartTo) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x18
}
if m.StartPos != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.StartPos))
if m.StartRank != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.StartRank))
i--
dAtA[i] = 0x10
}
@@ -1245,13 +1245,13 @@ func (m *RankResult) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if m.ModifyCount != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.ModifyCount))
if m.RemoveCount != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.RemoveCount))
i--
dAtA[i] = 0x18
}
if m.RemoveCount != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.RemoveCount))
if m.ModifyCount != 0 {
i = encodeVarintRank(dAtA, i, uint64(m.ModifyCount))
i--
dAtA[i] = 0x10
}
@@ -1294,9 +1294,6 @@ func (m *RankData) Size() (n int) {
if l > 0 {
n += 1 + l + sovRank(uint64(l))
}
if m.ExpireMs != 0 {
n += 1 + sovRank(uint64(m.ExpireMs))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@@ -1312,8 +1309,8 @@ func (m *RankPosData) Size() (n int) {
if m.Key != 0 {
n += 1 + sovRank(uint64(m.Key))
}
if m.RankPos != 0 {
n += 1 + sovRank(uint64(m.RankPos))
if m.Rank != 0 {
n += 1 + sovRank(uint64(m.Rank))
}
if len(m.SortData) > 0 {
l = 0
@@ -1350,6 +1347,9 @@ func (m *RankList) Size() (n int) {
if m.MaxRank != 0 {
n += 1 + sovRank(uint64(m.MaxRank))
}
if m.ExpireMs != 0 {
n += 1 + sovRank(uint64(m.ExpireMs))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@@ -1435,7 +1435,7 @@ func (m *FindRankDataByKey) Size() (n int) {
return n
}
func (m *FindRankDataByPos) Size() (n int) {
func (m *FindRankDataByRank) Size() (n int) {
if m == nil {
return 0
}
@@ -1444,8 +1444,8 @@ func (m *FindRankDataByPos) Size() (n int) {
if m.RankId != 0 {
n += 1 + sovRank(uint64(m.RankId))
}
if m.Pos != 0 {
n += 1 + sovRank(uint64(m.Pos))
if m.Rank != 0 {
n += 1 + sovRank(uint64(m.Rank))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
@@ -1453,7 +1453,7 @@ func (m *FindRankDataByPos) Size() (n int) {
return n
}
func (m *FindRankDataListStartTo) Size() (n int) {
func (m *FindRankDataList) Size() (n int) {
if m == nil {
return 0
}
@@ -1462,8 +1462,8 @@ func (m *FindRankDataListStartTo) Size() (n int) {
if m.RankId != 0 {
n += 1 + sovRank(uint64(m.RankId))
}
if m.StartPos != 0 {
n += 1 + sovRank(uint64(m.StartPos))
if m.StartRank != 0 {
n += 1 + sovRank(uint64(m.StartRank))
}
if m.Count != 0 {
n += 1 + sovRank(uint64(m.Count))
@@ -1504,12 +1504,12 @@ func (m *RankResult) Size() (n int) {
if m.AddCount != 0 {
n += 1 + sovRank(uint64(m.AddCount))
}
if m.RemoveCount != 0 {
n += 1 + sovRank(uint64(m.RemoveCount))
}
if m.ModifyCount != 0 {
n += 1 + sovRank(uint64(m.ModifyCount))
}
if m.RemoveCount != 0 {
n += 1 + sovRank(uint64(m.RemoveCount))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@@ -1680,25 +1680,6 @@ func (m *RankData) Unmarshal(dAtA []byte) error {
m.Data = []byte{}
}
iNdEx = postIndex
case 4:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field ExpireMs", wireType)
}
m.ExpireMs = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRank
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.ExpireMs |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipRank(dAtA[iNdEx:])
@@ -1774,9 +1755,9 @@ func (m *RankPosData) Unmarshal(dAtA []byte) error {
}
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field RankPos", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field Rank", wireType)
}
m.RankPos = 0
m.Rank = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRank
@@ -1786,7 +1767,7 @@ func (m *RankPosData) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
m.RankPos |= uint64(b&0x7F) << shift
m.Rank |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
@@ -2032,6 +2013,25 @@ func (m *RankList) Unmarshal(dAtA []byte) error {
break
}
}
case 5:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field ExpireMs", wireType)
}
m.ExpireMs = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRank
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.ExpireMs |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipRank(dAtA[iNdEx:])
@@ -2493,7 +2493,7 @@ func (m *FindRankDataByKey) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *FindRankDataByPos) Unmarshal(dAtA []byte) error {
func (m *FindRankDataByRank) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -2516,10 +2516,10 @@ func (m *FindRankDataByPos) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: FindRankDataByPos: wiretype end group for non-group")
return fmt.Errorf("proto: FindRankDataByRank: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: FindRankDataByPos: illegal tag %d (wire type %d)", fieldNum, wire)
return fmt.Errorf("proto: FindRankDataByRank: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
@@ -2543,9 +2543,9 @@ func (m *FindRankDataByPos) Unmarshal(dAtA []byte) error {
}
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Pos", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field Rank", wireType)
}
m.Pos = 0
m.Rank = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRank
@@ -2555,7 +2555,7 @@ func (m *FindRankDataByPos) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
m.Pos |= uint64(b&0x7F) << shift
m.Rank |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
@@ -2585,7 +2585,7 @@ func (m *FindRankDataByPos) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *FindRankDataListStartTo) Unmarshal(dAtA []byte) error {
func (m *FindRankDataList) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -2608,10 +2608,10 @@ func (m *FindRankDataListStartTo) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: FindRankDataListStartTo: wiretype end group for non-group")
return fmt.Errorf("proto: FindRankDataList: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: FindRankDataListStartTo: illegal tag %d (wire type %d)", fieldNum, wire)
return fmt.Errorf("proto: FindRankDataList: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
@@ -2635,9 +2635,9 @@ func (m *FindRankDataListStartTo) Unmarshal(dAtA []byte) error {
}
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field StartPos", wireType)
return fmt.Errorf("proto: wrong wireType = %d for field StartRank", wireType)
}
m.StartPos = 0
m.StartRank = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRank
@@ -2647,7 +2647,7 @@ func (m *FindRankDataListStartTo) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
m.StartPos |= uint64(b&0x7F) << shift
m.StartRank |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
@@ -2852,25 +2852,6 @@ func (m *RankResult) Unmarshal(dAtA []byte) error {
}
}
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field RemoveCount", wireType)
}
m.RemoveCount = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRank
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.RemoveCount |= int32(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field ModifyCount", wireType)
}
@@ -2889,6 +2870,25 @@ func (m *RankResult) Unmarshal(dAtA []byte) error {
break
}
}
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field RemoveCount", wireType)
}
m.RemoveCount = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowRank
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.RemoveCount |= int32(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipRank(dAtA[iNdEx:])

76
rpc/rank.proto Normal file
View File

@@ -0,0 +1,76 @@
syntax = "proto3";
package rpc;
option go_package = ".;rpc";
// RankData 排行数据
message RankData {
uint64 Key = 1; //数据主建
repeated int64 SortData = 2; //参与排行的数据
bytes Data = 3; //不参与排行的数据
}
// RankPosData 排行数据——查询返回
message RankPosData {
uint64 Key = 1; //数据主建
uint64 Rank = 2; //名次
repeated int64 SortData = 3; //参与排行的数据
bytes Data = 4; //不参与排行的数据
}
// RankList 排行榜数据
message RankList {
uint64 RankId = 1; //排行榜类型
int32 SkipListLevel = 2; //排行榜level-生成的跳表的level, 8/16/32/64等
bool IsDec = 3; //不参与排行的数据
uint64 MaxRank = 4; //最大排名
int64 ExpireMs = 5;//有效时间毫秒,0表示永不过期
}
// UpsetRankData 更新排行榜数据
message UpsetRankData {
uint64 RankId = 1; //排行榜的ID
repeated RankData RankDataList = 2; //排行数据
}
// DeleteByKey 删除排行榜数据
message DeleteByKey {
uint64 RankId = 1; //排行榜的分类ID
repeated uint64 KeyList = 2; //排行数据
}
// AddRankList 新增排行榜
message AddRankList {
repeated RankList AddList = 1; //添加的排行榜列表
}
// FindRankDataByKey 查找排行信息
message FindRankDataByKey {
uint64 RankId = 1; //排行榜的ID
uint64 Key = 2; //排行的key
}
// FindRankDataByRank 查找排行信息
message FindRankDataByRank {
uint64 RankId = 1; //排行榜的ID
uint64 Rank = 2; //排行名次
}
// FindRankDataList 查找排行信息
message FindRankDataList {
uint64 RankId = 1; //排行榜的ID
uint64 StartRank = 2; //排行的位置 0开始
uint64 Count = 3; //查询格式
}
// RankDataList
message RankDataList {
uint64 RankDataCount = 1; //排行长度
repeated RankPosData RankPosDataList = 2; //排行数据
}
// RankResult
message RankResult {
int32 AddCount = 1;//新增数量
int32 ModifyCount = 2; //修改数量
int32 RemoveCount = 3;//删除数量
}

View File

@@ -15,7 +15,7 @@ var RankDataPool = sync.NewPoolEx(make(chan sync.IPoolData, 10240), func() sync.
type RankData struct {
*rpc.RankData
bRelease bool
ref bool
compareFunc func(other skip.Comparator) int
}

View File

@@ -0,0 +1,127 @@
package rankservice
import (
"container/heap"
"github.com/duanhf2012/origin/util/sync"
"time"
)
var expireDataPool = sync.NewPoolEx(make(chan sync.IPoolData, 10240), func() sync.IPoolData {
return &ExpireData{}
})
type ExpireData struct {
Index int
Key uint64
RefreshTimestamp int64
ref bool
}
type rankDataHeap struct {
rankDatas []*ExpireData
expireMs int64
mapExpireData map[uint64]*ExpireData
}
var expireData ExpireData
func (ed *ExpireData) Reset(){
*ed = expireData
}
func (ed *ExpireData) IsRef() bool{
return ed.ref
}
func (ed *ExpireData) Ref(){
ed.ref = true
}
func (ed *ExpireData) UnRef(){
ed.ref = false
}
func (rd *rankDataHeap) Init(maxRankDataCount int32,expireMs time.Duration){
rd.rankDatas = make([]*ExpireData,0,maxRankDataCount)
rd.expireMs = int64(expireMs)
rd.mapExpireData = make(map[uint64]*ExpireData,512)
heap.Init(rd)
}
func (rd *rankDataHeap) Len() int {
return len(rd.rankDatas)
}
func (rd *rankDataHeap) Less(i, j int) bool {
return rd.rankDatas[i].RefreshTimestamp < rd.rankDatas[j].RefreshTimestamp
}
func (rd *rankDataHeap) Swap(i, j int) {
rd.rankDatas[i], rd.rankDatas[j] = rd.rankDatas[j], rd.rankDatas[i]
rd.rankDatas[i].Index,rd.rankDatas[j].Index = i,j
}
func (rd *rankDataHeap) Push(x interface{}) {
ed := x.(*ExpireData)
ed.Index = len(rd.rankDatas)
rd.rankDatas = append(rd.rankDatas,ed)
}
func (rd *rankDataHeap) Pop() (ret interface{}) {
l := len(rd.rankDatas)
var retData *ExpireData
rd.rankDatas, retData = rd.rankDatas[:l-1], rd.rankDatas[l-1]
retData.Index = -1
ret = retData
return
}
func (rd *rankDataHeap) PopExpireKey() uint64{
if rd.Len() <= 0 {
return 0
}
if rd.rankDatas[0].RefreshTimestamp+rd.expireMs > time.Now().UnixNano() {
return 0
}
rankData := heap.Pop(rd).(*ExpireData)
delete(rd.mapExpireData,rankData.Key)
return rankData.Key
}
func (rd *rankDataHeap) PushOrRefreshExpireKey(key uint64){
//1.先删掉之前的
expData ,ok := rd.mapExpireData[key]
if ok == true {
expData.RefreshTimestamp = time.Now().UnixNano()
heap.Fix(rd,expData.Index)
return
}
//2.直接插入
expData = expireDataPool.Get().(*ExpireData)
expData.Key = key
expData.RefreshTimestamp = time.Now().UnixNano()
rd.mapExpireData[key] = expData
heap.Push(rd,expData)
}
func (rd *rankDataHeap) RemoveExpireKey(key uint64){
expData ,ok := rd.mapExpireData[key]
if ok == false {
return
}
delete(rd.mapExpireData,key)
heap.Remove(rd,expData.Index)
expireDataPool.Put(expData)
}

View File

@@ -4,23 +4,13 @@ import "github.com/duanhf2012/origin/service"
type RankDataChangeType int8
const (
RankDataNone RankDataChangeType = 0
RankDataAdd RankDataChangeType = 1 //数据插入
RankDataUpdate RankDataChangeType = 2 //数据更新
RankDataDelete RankDataChangeType = 3 //数据删除
)
type IRankSkip interface {
GetRankID() uint64
GetRankLen() uint64
}
// RankDataChangeCallBack 排行数据变化时调用
//type RankDataChangeCallBack interface {
// CB(iRankService service.IService, rankSkip IRankSkip, changeType RankDataChangeType, changed []*RankData)
//}
type IRankModule interface {
service.IModule

View File

@@ -3,22 +3,12 @@ package rankservice
import (
"fmt"
"github.com/duanhf2012/origin/log"
"github.com/duanhf2012/origin/node"
"github.com/duanhf2012/origin/rpc"
"github.com/duanhf2012/origin/service"
"time"
)
func init() {
node.Setup(&RankService{})
}
const PreMapRankSkipLen = 10
const ManualAddRankSkip = "RPC_ManualAddRankSkip"
const UpsetRank = "RPC_UpsetRank"
const DeleteRankDataByKey = "RPC_DeleteRankDataByKey"
const FindRankDataByKey = "RPC_FindRankDataByKey"
const FindRankDataByPos = "RPC_FindRankDataByPos"
const FindRankDataListStartTo = "RPC_FindRankDataListStartTo"
type RankService struct {
service.Service
@@ -68,7 +58,7 @@ func (rs *RankService) RPC_ManualAddRankSkip(addInfo *rpc.AddRankList, addResult
return fmt.Errorf("RPC_AddRankSkip must has rank id")
}
newSkip := NewRankSkip(addRankListData.IsDec, transformLevel(addRankListData.SkipListLevel), addRankListData.MaxRank)
newSkip := NewRankSkip(addRankListData.IsDec, transformLevel(addRankListData.SkipListLevel), addRankListData.MaxRank,time.Duration(addRankListData.ExpireMs)*time.Millisecond)
rs.mapRankSkip[addRankListData.RankId] = newSkip
addList = append(addList, addRankListData.RankId)
}
@@ -91,7 +81,7 @@ func (rs *RankService) RPC_UpsetRank(upsetInfo *rpc.UpsetRankData, upsetResult *
return nil
}
// RPC_DeleteRankDataByKey 按排行的key进行删除
// RPC_DeleteRankDataByKey 按key从排行榜中进行删除
func (rs *RankService) RPC_DeleteRankDataByKey(delInfo *rpc.DeleteByKey, delResult *rpc.RankResult) error {
rankSkip, ok := rs.mapRankSkip[delInfo.RankId]
if ok == false || rankSkip == nil {
@@ -107,49 +97,49 @@ func (rs *RankService) RPC_DeleteRankDataByKey(delInfo *rpc.DeleteByKey, delResu
return nil
}
// RPC_FindRankDataByKey 按key查找
// RPC_FindRankDataByKey 按key查找,返回对应的排行名次信息
func (rs *RankService) RPC_FindRankDataByKey(findInfo *rpc.FindRankDataByKey, findResult *rpc.RankPosData) error {
rankObj, ok := rs.mapRankSkip[findInfo.RankId]
if ok == false || rankObj == nil {
return fmt.Errorf("RPC_FindRankDataByKey[", findInfo.RankId, "] no this rank type")
}
findRankData, rankPos := rankObj.GetRankNodeData(findInfo.Key)
findRankData, rank := rankObj.GetRankNodeData(findInfo.Key)
if findRankData != nil {
findResult.Data = findRankData.Data
findResult.Key = findRankData.Key
findResult.SortData = findRankData.SortData
findResult.RankPos = rankPos
findResult.Rank = rank
}
return nil
}
// RPC_FindRankDataByPos 按pos查找
func (rs *RankService) RPC_FindRankDataByPos(findInfo *rpc.FindRankDataByPos, findResult *rpc.RankPosData) error {
// RPC_FindRankDataByRank 按pos查找
func (rs *RankService) RPC_FindRankDataByRank(findInfo *rpc.FindRankDataByRank, findResult *rpc.RankPosData) error {
rankObj, ok := rs.mapRankSkip[findInfo.RankId]
if ok == false || rankObj == nil {
return fmt.Errorf("RPC_FindRankDataByKey[", findInfo.RankId, "] no this rank type")
}
findRankData, rankPos := rankObj.GetRankNodeDataByPos(findInfo.Pos)
findRankData, rankPos := rankObj.GetRankNodeDataByRank(findInfo.Rank)
if findRankData != nil {
findResult.Data = findRankData.Data
findResult.Key = findRankData.Key
findResult.SortData = findRankData.SortData
findResult.RankPos = rankPos
findResult.Rank = rankPos
}
return nil
}
// RPC_FindRankDataListStartTo 按pos查找,start开始count个排行数据
func (rs *RankService) RPC_FindRankDataListStartTo(findInfo *rpc.FindRankDataListStartTo, findResult *rpc.RankDataList) error {
// RPC_FindRankDataListStartRank查找,从StartRank开始count个排行数据
func (rs *RankService) RPC_FindRankDataList(findInfo *rpc.FindRankDataList, findResult *rpc.RankDataList) error {
rankObj, ok := rs.mapRankSkip[findInfo.RankId]
if ok == false || rankObj == nil {
return fmt.Errorf("RPC_FindRankDataListStartTo[", findInfo.RankId, "] no this rank type")
}
findResult.RankDataCount = rankObj.GetRankLen()
return rankObj.GetRankDataFromToLimit(findInfo.StartPos, findInfo.Count, findResult)
return rankObj.GetRankDataFromToLimit(findInfo.StartRank, findInfo.Count, findResult)
}
func (rs *RankService) deleteRankList(delIdList []uint64) {
@@ -187,9 +177,14 @@ func (rs *RankService) dealCfg() error {
level, _ := mapCfg["SkipListLevel"].(float64)
isDec, _ := mapCfg["IsDec"].(bool)
maxRank, _ := mapCfg["MaxRank"].(float64)
expireMs, _ := mapCfg["ExpireMs"].(float64)
newSkip := NewRankSkip(isDec, transformLevel(int32(level)), uint64(maxRank))
newSkip := NewRankSkip(isDec, transformLevel(int32(level)), uint64(maxRank),time.Duration(expireMs)*time.Millisecond)
rs.mapRankSkip[uint64(rankId)] = newSkip
}
return nil
}

View File

@@ -4,6 +4,7 @@ import (
"fmt"
"github.com/duanhf2012/origin/rpc"
"github.com/duanhf2012/origin/util/algorithms/skip"
"time"
)
type RankSkip struct {
@@ -12,19 +13,46 @@ type RankSkip struct {
skipList *skip.SkipList //跳表
mapRankData map[uint64]*RankData //排行数据map
maxLen uint64 //排行数据长度
expireMs time.Duration //有效时间
rankModule IRankModule
rankDataExpire rankDataHeap
}
const MaxPickExpireNum = 2
const (
RankDataNone RankDataChangeType = 0
RankDataAdd RankDataChangeType = 1 //数据插入
RankDataUpdate RankDataChangeType = 2 //数据更新
RankDataDelete RankDataChangeType = 3 //数据删除
)
// NewRankSkip 创建排行榜
func NewRankSkip(isDes bool, level interface{}, maxLen uint64) *RankSkip {
ret := &RankSkip{}
func NewRankSkip(isDes bool, level interface{}, maxLen uint64,expireMs time.Duration) *RankSkip {
rs := &RankSkip{}
ret.isDes = isDes
ret.skipList = skip.New(level)
ret.mapRankData = make(map[uint64]*RankData, 10240)
ret.maxLen = maxLen
rs.isDes = isDes
rs.skipList = skip.New(level)
rs.mapRankData = make(map[uint64]*RankData, 10240)
rs.maxLen = maxLen
rs.expireMs = expireMs
rs.rankDataExpire.Init(int32(maxLen),expireMs)
return ret
return rs
}
func (rs *RankSkip) pickExpireKey(){
if rs.expireMs == 0 {
return
}
for i:=1;i<MaxPickExpireNum;i++{
key := rs.rankDataExpire.PopExpireKey()
if key == 0 {
return
}
rs.DeleteRankData([]uint64{key})
}
}
func (rs *RankSkip) SetupRankModule(rankModule IRankModule) {
@@ -68,6 +96,8 @@ func (rs *RankSkip) UpsetRank(upsetRankData []*rpc.RankData) (addCount int32, mo
addCount = int32(len(addList))
modifyCount = int32(len(updateList))
rs.pickExpireKey()
return
}
@@ -90,13 +120,18 @@ func (rs *RankSkip) upsetRank(upsetData *rpc.RankData) (*RankData, RankDataChang
newRankData := NewRankData(rs.isDes, upsetData)
rs.skipList.Insert(newRankData)
rs.mapRankData[upsetData.Key] = newRankData
//刷新有效期
rs.rankDataExpire.PushOrRefreshExpireKey(upsetData.Key)
return newRankData, RankDataUpdate
}
if rs.checkCanInsert(upsetData) {
if rs.checkInsertAndReplace(upsetData) {
newRankData := NewRankData(rs.isDes, upsetData)
rs.skipList.Insert(newRankData)
rs.mapRankData[upsetData.Key] = newRankData
rs.rankDataExpire.PushOrRefreshExpireKey(upsetData.Key)
return newRankData, RankDataAdd
}
@@ -120,10 +155,12 @@ func (rs *RankSkip) DeleteRankData(delKeys []uint64) int32 {
//从排行榜中删除
for _, rankData := range removeRankData {
rs.skipList.Delete(rankData)
ReleaseRankData(rankData)
delete(rs.mapRankData, rankData.Key)
rs.rankDataExpire.RemoveExpireKey(rankData.Key)
ReleaseRankData(rankData)
}
rs.pickExpireKey()
return int32(len(removeRankData))
}
@@ -139,13 +176,13 @@ func (rs *RankSkip) GetRankNodeData(findKey uint64) (*RankData, uint64) {
}
// GetRankNodeDataByPos 获取,返回排名节点与名次
func (rs *RankSkip) GetRankNodeDataByPos(pos uint64) (*RankData, uint64) {
rankNode := rs.skipList.ByPosition(pos)
func (rs *RankSkip) GetRankNodeDataByRank(rank uint64) (*RankData, uint64) {
rankNode := rs.skipList.ByPosition(rank)
if rankNode == nil {
return nil, 0
}
return rankNode.(*RankData), pos
return rankNode.(*RankData), rank
}
// GetRankKeyPrevToLimit 获取key前count名的数据
@@ -166,7 +203,7 @@ func (rs *RankSkip) GetRankKeyPrevToLimit(findKey, count uint64, result *rpc.Ran
rankData := iter.Value().(*RankData)
result.RankPosDataList = append(result.RankPosDataList, &rpc.RankPosData{
Key: rankData.Key,
RankPos: rankPos - iterCount,
Rank: rankPos - iterCount,
SortData: rankData.SortData,
Data: rankData.Data,
})
@@ -194,7 +231,7 @@ func (rs *RankSkip) GetRankKeyNextToLimit(findKey, count uint64, result *rpc.Ran
rankData := iter.Value().(*RankData)
result.RankPosDataList = append(result.RankPosDataList, &rpc.RankPosData{
Key: rankData.Key,
RankPos: rankPos + iterCount,
Rank: rankPos + iterCount,
SortData: rankData.SortData,
Data: rankData.Data,
})
@@ -220,7 +257,7 @@ func (rs *RankSkip) GetRankDataFromToLimit(startPos, count uint64, result *rpc.R
rankData := iter.Value().(*RankData)
result.RankPosDataList = append(result.RankPosDataList, &rpc.RankPosData{
Key: rankData.Key,
RankPos: iterCount + startPos,
Rank: iterCount + startPos,
SortData: rankData.SortData,
Data: rankData.Data,
})
@@ -231,7 +268,7 @@ func (rs *RankSkip) GetRankDataFromToLimit(startPos, count uint64, result *rpc.R
}
// checkCanInsert 检查是否能插入
func (rs *RankSkip) checkCanInsert(upsetData *rpc.RankData) bool {
func (rs *RankSkip) checkInsertAndReplace(upsetData *rpc.RankData) bool {
//maxLen为0不限制长度
if rs.maxLen == 0 {
return true
@@ -254,9 +291,11 @@ func (rs *RankSkip) checkCanInsert(upsetData *rpc.RankData) bool {
//移除最后一位
//回调模块该RandData从排行中删除
rs.rankDataExpire.RemoveExpireKey(lastRankData.Key)
rs.rankModule.OnLeaveRank(rs, []*RankData{lastRankData})
rs.skipList.Delete(lastPosData)
delete(rs.mapRankData, lastRankData.Key)
ReleaseRankData(lastRankData)
return true
}