Skip to content

Commit 1dfc277

Browse files
committed
quicker SPOP
1 parent fb75409 commit 1dfc277

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

cmd_set.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,12 +400,14 @@ func (m *Miniredis) cmdSpop(c *server.Peer, cmd string, args []string) {
400400
}
401401

402402
var deleted []string
403+
members := db.setMembers(opts.key)
403404
for i := 0; i < opts.count; i++ {
404-
members := db.setMembers(opts.key)
405405
if len(members) == 0 {
406406
break
407407
}
408-
member := members[m.randIntn(len(members))]
408+
i := m.randIntn(len(members))
409+
member := members[i]
410+
members = delElem(members, i)
409411
db.setRem(opts.key, member)
410412
deleted = append(deleted, member)
411413
}
@@ -702,3 +704,12 @@ func (m *Miniredis) cmdSscan(c *server.Peer, cmd string, args []string) {
702704

703705
})
704706
}
707+
708+
func delElem(ls []string, i int) []string {
709+
// this swap+truncate is faster but changes behaviour:
710+
// ls[i] = ls[len(ls)-1]
711+
// ls = ls[:len(ls)-1]
712+
// so we do the dumb thing:
713+
ls = append(ls[:i], ls[i+1:]...)
714+
return ls
715+
}

cmd_set_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,3 +870,10 @@ func TestSscan(t *testing.T) {
870870
),
871871
)
872872
}
873+
874+
func TestDelElem(t *testing.T) {
875+
equals(t, []string{"b", "c", "d"}, delElem([]string{"a", "b", "c", "d"}, 0))
876+
equals(t, []string{"a", "c", "d"}, delElem([]string{"a", "b", "c", "d"}, 1))
877+
equals(t, []string{"a", "b", "d"}, delElem([]string{"a", "b", "c", "d"}, 2))
878+
equals(t, []string{"a", "b", "c"}, delElem([]string{"a", "b", "c", "d"}, 3))
879+
}

0 commit comments

Comments
 (0)