diff --git a/cluster/router.go b/cluster/router.go index 93536e2..d053b12 100644 --- a/cluster/router.go +++ b/cluster/router.go @@ -46,6 +46,7 @@ func makeRouter() map[string]CmdFunc { routerMap["incrbyfloat"] = defaultFunc routerMap["decr"] = defaultFunc routerMap["decrby"] = defaultFunc + routerMap["randomkey"] = randomkey routerMap["lpush"] = defaultFunc routerMap["lpushx"] = defaultFunc diff --git a/cluster/utils.go b/cluster/utils.go index 422ef68..6b850f8 100644 --- a/cluster/utils.go +++ b/cluster/utils.go @@ -15,6 +15,10 @@ func info(cluster *Cluster, c redis.Connection, cmdLine CmdLine) redis.Reply { return cluster.db.Exec(c, cmdLine) } +func randomkey(cluster *Cluster, c redis.Connection, cmdLine CmdLine) redis.Reply { + return cluster.db.Exec(c, cmdLine) +} + /*----- utils -------*/ func makeArgs(cmd string, args ...string) [][]byte { diff --git a/database/string.go b/database/string.go index f8e3957..d7318aa 100644 --- a/database/string.go +++ b/database/string.go @@ -827,6 +827,16 @@ func execBitPos(db *DB, args [][]byte) redis.Reply { return protocol.MakeIntReply(offset) } +// GetRandomKey Randomly return (do not delete) a key from the godis +func getRandomKey(db *DB, args [][]byte) redis.Reply { + k := db.data.RandomKeys(1) + if len(k) == 0 { + return &protocol.NullBulkReply{} + } + var key []byte + return protocol.MakeBulkReply(strconv.AppendQuote(key, k[0])) +} + func init() { RegisterCommand("Set", execSet, writeFirstKey, rollbackFirstKey, -3, flagWrite) RegisterCommand("SetNx", execSetNX, writeFirstKey, rollbackFirstKey, 3, flagWrite) @@ -852,5 +862,6 @@ func init() { RegisterCommand("GetBit", execGetBit, readFirstKey, nil, 3, flagReadOnly) RegisterCommand("BitCount", execBitCount, readFirstKey, nil, -2, flagReadOnly) RegisterCommand("BitPos", execBitPos, readFirstKey, nil, -3, flagReadOnly) + RegisterCommand("Randomkey", getRandomKey, readAllKeys, nil, 1, flagReadOnly) } diff --git a/database/string_test.go b/database/string_test.go index 10bd114..1c4b814 100644 --- a/database/string_test.go +++ b/database/string_test.go @@ -802,3 +802,13 @@ func TestBitPos(t *testing.T) { actual = testDB.Exec(nil, utils.ToCmdLine("BitPos", key, "-1")) asserts.AssertErrReply(t, actual, "ERR bit is not an integer or out of range") } + +func TestRandomkey(t *testing.T) { + testDB.Flush() + for i := 0; i < 10; i++ { + key := utils.RandString(10) + testDB.Exec(nil, utils.ToCmdLine2("SET", key, key)) + } + actual := testDB.Exec(nil, utils.ToCmdLine("Randomkey")) + asserts.AssertNotError(t, actual) +}