redis 常用命令及lua脚本

2021-03-27  本文已影响0人  分享放大价值

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
  1. 查看状态信息
redis-cli -h ip -p 9379 info replication
  1. 如何获取集群所有key
对于单机redis:keys *
对于集群: redis-cli -c  --cluster call 127.3.0.1:7101 keys "*"
  1. 更多命令
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 列表

问题

  1. key中hash tag用处
    用于将key hash到不同的slot。当一个key包含 {} 的时候,就不对整个key做hash,而仅对 {} 包括的字符串做hash。这就是 hash tag
    假设hash算法为sha1。对user:{user1}:ids和user:{user1}:tweets,其hash值都等同于sha1(user1)。

  2. 集群模式下进行多键操作报错
    当在集群模式下进行多键操作, 同时操作的键中有部分不在该节点时,会报如下错误 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>
上一篇下一篇

猜你喜欢

热点阅读