This commit is contained in:
finley
2022-08-21 05:30:00 +08:00
parent 9da335811f
commit dddf9a8f6b
4 changed files with 71 additions and 2 deletions

View File

@@ -281,7 +281,7 @@ func (skiplist *skiplist) getLastInScoreRange(min *ScoreBorder, max *ScoreBorder
/*
* return removed elements
*/
func (skiplist *skiplist) RemoveRangeByScore(min *ScoreBorder, max *ScoreBorder) (removed []*Element) {
func (skiplist *skiplist) RemoveRangeByScore(min *ScoreBorder, max *ScoreBorder, limit int) (removed []*Element) {
update := make([]*node, maxLevel)
removed = make([]*Element, 0)
// find backward nodes (of target range) or last node of each level
@@ -308,6 +308,9 @@ func (skiplist *skiplist) RemoveRangeByScore(min *ScoreBorder, max *ScoreBorder)
removedElement := node.Element
removed = append(removed, &removedElement)
skiplist.removeNode(node, update)
if limit > 0 && len(removed) == limit {
break
}
node = next
}
return removed

View File

@@ -204,13 +204,29 @@ func (sortedSet *SortedSet) RangeByScore(min *ScoreBorder, max *ScoreBorder, off
// RemoveByScore removes members which score within the given border
func (sortedSet *SortedSet) RemoveByScore(min *ScoreBorder, max *ScoreBorder) int64 {
removed := sortedSet.skiplist.RemoveRangeByScore(min, max)
removed := sortedSet.skiplist.RemoveRangeByScore(min, max, 0)
for _, element := range removed {
delete(sortedSet.dict, element.Member)
}
return int64(len(removed))
}
func (sortedSet *SortedSet) PopMin(count int) []*Element {
first := sortedSet.skiplist.getFirstInScoreRange(negativeInfBorder, positiveInfBorder)
if first == nil {
return nil
}
border := &ScoreBorder{
Value: first.Score,
Exclude: false,
}
removed := sortedSet.skiplist.RemoveRangeByScore(border, border, count)
for _, element := range removed {
delete(sortedSet.dict, element.Member)
}
return removed
}
// RemoveByRank removes member ranking within [start, stop)
// sort by ascending order and rank starts from 0
func (sortedSet *SortedSet) RemoveByRank(start int64, stop int64) int64 {