1.集群状态
redis-cli -h ip -p 9379 -a password cluster info
2.集群节点信息
redis-cli -h ip -p 9379 -a password cluster nodes
3.节点内存、cpu、key数量等信息(每个节点都需查看)
redis-cli -h ip -p 9379 -a password info
4.从redis集群中查看key(只需要连接master节点查看)
a.查看该节点的所有key
redis-cli -h ip -p 9379 -a password keys *
b.查看key的value值
redis-cli -h ip -p 9379 -a password -c get key
c.查看key值的有效期
redis-cli -h ip -p 9379 -a password -c ttl key
- 查看状态信息
redis-cli -h ip -p 9379 info replication
- 如何获取集群所有key
对于单机redis:keys *
对于集群: redis-cli -c --cluster call 127.3.0.1:7101 keys "*"
- 更多命令
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
CLUSTER SLAVES node-id 返回一个master节点的slaves 列表
问题
-
key中hash tag用处
用于将key hash到不同的slot。当一个key包含 {} 的时候,就不对整个key做hash,而仅对 {} 包括的字符串做hash。这就是 hash tag
假设hash算法为sha1。对user:{user1}:ids和user:{user1}:tweets,其hash值都等同于sha1(user1)。 -
集群模式下进行多键操作报错
当在集群模式下进行多键操作, 同时操作的键中有部分不在该节点时,会报如下错误 CROSSSLOT Keys in request don't hash to the same slot。
解决办法是保证同时操作的key中hash tag是一样的,即key的花括号中的值必须相同。
eval操作
通过eval命令执行脚本
127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
#添加key
127.0.0.1:6379> eval "return redis.call('set',KEYS[1],'bar')" 1 foo
OK
#获取key
127.0.0.1:6379> eval "return redis.call('get','foo')" 0
"bar"
#删除key
127.0.0.1:6379> eval "return redis.call('del',KEYS[1])" 1 foo
(integer) 1
#再次获取key
127.0.0.1:6379> eval "return redis.call('get','foo')" 0
(nil)
也可以将脚本写到lua脚本文件中执行。
#a.lua
redis.call("set", KEYS[1], ARGV[1])
local value=redis.call("get", KEYS[1])
return value
#a.lua 后面的是传给lua脚本的参数,其中","前面的node1可以在脚本中用KEYS[]取到,后面的可以用ARGV[]取到。
#注意","前后都得有空格
root@58ea94024130:/data# redis-cli --eval ./a.lua key1 , value1
"value1"
创建一个redis容器,用来做实验
//下载redis镜像
docker pull redis
//启动redis容器,挂载本地目录 /root/lua 到容器,方便在本地编辑lua脚本
docker run -itd --name redis-server -p 6379:6379 -v /root/lua:/data redis
//进入容器
docker exec -it redis-server /bin/bash
//执行redis-cli即可进入redis运行环境
root@58ea94024130:/data# redis-cli
127.0.0.1:6379>
网友评论