美文网首页
redis 常用命令及lua脚本

redis 常用命令及lua脚本

作者: 分享放大价值 | 来源:发表于2021-03-27 14:58 被阅读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>
    

    相关文章

      网友评论

          本文标题:redis 常用命令及lua脚本

          本文链接:https://www.haomeiwen.com/subject/mocyhltx.html