kvrocks icon indicating copy to clipboard operation
kvrocks copied to clipboard

SRANDMEMBER returns a list from kvrocks when it returns a string on redis

Open Rafiot opened this issue 1 year ago • 6 comments

Search before asking

  • [X] I had searched in the issues and found no similar issues.

Version

Ubuntu 24.04 / kvrocks 2.10 / valkey 8.0

Minimal reproduce step


from redis import Redis
r.sadd('foo', 'bar')
r.srandmember('foo')

# returns [b'bar'] from kvrocks, b'bar' from valkey

What did you expect to see?

The same output against both backends.

What did you see instead?

[b'bar'] from kvrocks, b'bar' from valkey

Anything Else?

I cannot say who's wrong, it's just super confusing to have two different responses.

The solution I'll go for to have a consistent output is to pass r.srandmember('foo', 1) which returns a list against both backends.

Are you willing to submit a PR?

  • [ ] I'm willing to submit a PR!

Rafiot avatar Oct 18 '24 19:10 Rafiot

@Rafiot Thanks for your report. Redis did have a different reply behavior when count is 1.

git-hulk avatar Oct 19 '24 01:10 git-hulk

yep. I don't know if it is something to change or not, I don't see a good solution to that, as you will either break existing kvrocks-only tools in a very weird way, or keep the difference.

It would probably make sense to document the difference somewhere so people don't spend hours debugging it, and make sure to always pass the count parameter.

Rafiot avatar Oct 19 '24 11:10 Rafiot

I'm ok with changing this to same as redis 🤔

mapleFU avatar Oct 19 '24 12:10 mapleFU

Yes, we can fix it to align with Redis.

git-hulk avatar Oct 19 '24 15:10 git-hulk

That's an option, but it will break existing codebases:

from redis import Redis
r.sadd('foo', 'bar')
if member := r.srandmember('foo'):
    print(member[0])
    # do something with member[0]

That call was getting the one element from the list and will now get the first char of the response, and it won't even fail.

Rafiot avatar Oct 19 '24 15:10 Rafiot

@Rafiot Good point. It'd be better to document explicitly instead of silently breaking old behaviors in some programming languages. And always return the array format makes sense whether the count is bigger than 1 or not.

git-hulk avatar Oct 20 '24 02:10 git-hulk