Namespace
Like the Redis database, Apache Kvrocks™ uses the namespace to isolate the data between users. But unlike Redis, each namespace has its own password. The data would be stored in the default namespace when using requirepass
. The namespace would have no effect when the cluster mode was enabled like the Redis DB.
Manage Namespace
requirepass
must be set if you want to add namespaces since we treat the requirepass
user as administrator.
# Auth with the requirepass
redis-cli -p 6666 -a ${REQUIREPASS}
# Add a new namespace with the token, the namespace name must be unique.
127.0.0.1:6666> namespace add ${NEW NAMESPACE} ${NEW TOKEN}
# Update the namespace's token
127.0.0.1:6666> namespace set ${NAMESPACE} ${NEW TOKEN}
# Delete the namespace, the namespace's data WOULD NOT be deleted,
# unless you use the `flushdb` command to flush the DB data.
127.0.0.1:6666> namespace del ${NAMESPACE}
# Get the namespace's token
127.0.0.1:6666> namespace get ${NAMESPACE}
# List namespaces
127.0.0.1:6666> namespace get *
Be careful that you must use the config rewrite
command to persist the new namespaces into the config file.
Switch Namespace
Firstly, we use the namespace add
command to create namespace ns1
and ns2
with the corresponding tokens token1
and token2
.
127.0.0.1:6666> namespace add ns1 token1
127.0.0.1:6666> namespace add ns2 token2
Then we can use token1
and token2
, operate data between namespaces would NOT affect each other like below:
# Use token1 to switch to ns1
127.0.0.1:6666> auth token1
OK
127.0.0.1:6666> set key 100
OK
127.0.0.1:6666> get key
"100"
# Use token2 to switch to ns2
127.0.0.1:6666> auth token2
OK
127.0.0.1:6666> set key 200
OK
127.0.0.1:6666> get key
"200"
# Use token1 to switch to ns1 again, the value is still 100
127.0.0.1:6666> auth token1
OK
127.0.0.1:6666> get key
"100"
How Kvrocks implements namespace
Kvrocks simply prepend the namespace prefix to the user key and remove it before retrieving.
For example, we create a new namespace foo
with token bar
, then the foo
would prepend to the user key. Another way was to split the namespace into different rocksdb column families, but we didn't do that for the sake of simplicity.