Fix requestTimeout & memory store
This commit is contained in:
@@ -704,15 +704,17 @@ func (p *memoryPipeliner) LRem(key string, count int64, value any) {
|
||||
newList := make([]string, 0, len(list))
|
||||
removed := int64(0)
|
||||
for _, v := range list {
|
||||
if count != 0 && v == capturedValue && (count < 0 || removed < count) {
|
||||
shouldRemove := v == capturedValue && (count == 0 || removed < count)
|
||||
if shouldRemove {
|
||||
removed++
|
||||
continue
|
||||
} else {
|
||||
newList = append(newList, v)
|
||||
}
|
||||
newList = append(newList, v)
|
||||
}
|
||||
item.value = newList
|
||||
})
|
||||
}
|
||||
|
||||
func (p *memoryPipeliner) HSet(key string, values map[string]any) {
|
||||
capturedKey := key
|
||||
capturedValues := make(map[string]any, len(values))
|
||||
@@ -762,17 +764,31 @@ func (p *memoryPipeliner) ZAdd(key string, members map[string]float64) {
|
||||
p.ops = append(p.ops, func() {
|
||||
item, ok := p.store.items[capturedKey]
|
||||
if !ok || item.isExpired() {
|
||||
item = &memoryStoreItem{value: make(map[string]float64)}
|
||||
item = &memoryStoreItem{value: make([]zsetMember, 0)}
|
||||
p.store.items[capturedKey] = item
|
||||
}
|
||||
zset, ok := item.value.(map[string]float64)
|
||||
zset, ok := item.value.([]zsetMember)
|
||||
if !ok {
|
||||
zset = make(map[string]float64)
|
||||
item.value = zset
|
||||
zset = make([]zsetMember, 0)
|
||||
}
|
||||
for member, score := range capturedMembers {
|
||||
zset[member] = score
|
||||
membersMap := make(map[string]float64, len(zset))
|
||||
for _, z := range zset {
|
||||
membersMap[z.Value] = z.Score
|
||||
}
|
||||
for memberVal, score := range capturedMembers {
|
||||
membersMap[memberVal] = score
|
||||
}
|
||||
newZSet := make([]zsetMember, 0, len(membersMap))
|
||||
for val, score := range membersMap {
|
||||
newZSet = append(newZSet, zsetMember{Value: val, Score: score})
|
||||
}
|
||||
sort.Slice(newZSet, func(i, j int) bool {
|
||||
if newZSet[i].Score == newZSet[j].Score {
|
||||
return newZSet[i].Value < newZSet[j].Value
|
||||
}
|
||||
return newZSet[i].Score < newZSet[j].Score
|
||||
})
|
||||
item.value = newZSet
|
||||
})
|
||||
}
|
||||
func (p *memoryPipeliner) ZRem(key string, members ...any) {
|
||||
@@ -784,13 +800,21 @@ func (p *memoryPipeliner) ZRem(key string, members ...any) {
|
||||
if !ok || item.isExpired() {
|
||||
return
|
||||
}
|
||||
zset, ok := item.value.(map[string]float64)
|
||||
zset, ok := item.value.([]zsetMember)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
for _, member := range capturedMembers {
|
||||
delete(zset, fmt.Sprintf("%v", member))
|
||||
membersToRemove := make(map[string]struct{}, len(capturedMembers))
|
||||
for _, m := range capturedMembers {
|
||||
membersToRemove[fmt.Sprintf("%v", m)] = struct{}{}
|
||||
}
|
||||
newZSet := make([]zsetMember, 0, len(zset))
|
||||
for _, z := range zset {
|
||||
if _, exists := membersToRemove[z.Value]; !exists {
|
||||
newZSet = append(newZSet, z)
|
||||
}
|
||||
}
|
||||
item.value = newZSet
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user