美文网首页Redis
Redis第3️⃣课 通用命令

Redis第3️⃣课 通用命令

作者: 小超_8b2f | 来源:发表于2019-04-25 11:12 被阅读9次

    一、通用命令

    1. keys

    一般不在生产环境使用,因为生产环境数据一般会比较多,耗性能而且redis是单线程的,若运行慢会阻塞其它命令的执行。
    1) 热备从节点上使用
    2) scan 命令替代

    127.0.0.1:6379> keys *  #遍历所有的key
    1) "key2"
    2) "php"
    3) "hello"
    4) "hehe"
    5) "key3"
    6) "phe"
    127.0.0.1:6379> mset hello world hehe haha php good phe his
    OK
    127.0.0.1:6379> keys he* # 遍历所有以he开头的key
    1) "hello"
    2) "hehe"
    127.0.0.1:6379> keys he[h-l]*  #遍历前两个字符是he,第三个字符是h到l的字符的所有key
    1) "hello"
    2) "hehe"
    127.0.0.1:6379> keys ph? # 遍历前2个字符ph,第三个字符不定且仅有3个字符的key
    1) "php"
    2) "phe"
    

    2. dbsize

    dbsize: redis内部维护了一个计数器,所以不需要遍历,可以线上使用此命令

    127.0.0.1:6379> dbsize
    (integer) 6
    

    3. exists命令 (检查key是否存在)

    127.0.0.1:6379> exists key1  #不存在返回0
    (integer) 0
    127.0.0.1:6379> exists key2   #存在返回1
    (integer) 1
    

    4. del命令(删除指定的key-value)

    127.0.0.1:6379> del key2
    (integer) 1
    127.0.0.1:6379> del key2
    (integer) 0
    127.0.0.1:6379> del key1 key2
    (integer) 1
    127.0.0.1:6379> del key3 key4
    (integer) 2
    

    二、过期时间相关命令

    5. expire命令 (为key设置生存时间【秒】)
    6. ttl命令 (time to live:查看key剩余的过期时间)
    7. persist命令(去掉key的过期时间)

    # expire [ɪkˈspaɪə(r)]  (因到期而) 失效,终止; 到期; 届满; 逝世; 去世; 故去;
    127.0.0.1:6379> expire key1 1000 
    (integer) 1
    127.0.0.1:6379> ttl key1
    (integer) 991
    127.0.0.1:6379> ttl key1
    (integer) 987
    127.0.0.1:6379> persist key1
    (integer) 1
    127.0.0.1:6379> ttl key1
    (integer) -1                  #(-1 代表key存在,但没有设置过期时间)
    127.0.0.1:6379> persist key1
    (integer) 0
    127.0.0.1:6379> ttl noExistKey
    (integer) -2                  # (-2 代表key不存在)
    

    8 type key (查看key的数据类型)

    #  string | hash  |  set  | zset  |  list  | none
    127.0.0.1:6379> set key2 helloworld
    OK
    127.0.0.1:6379> type key2
    string
    127.0.0.1:6379> sadd mySet 1 2 3
    (integer) 3
    127.0.0.1:6379> type mySet
    set
    

    9. info memory 查看内存使用情况

    127.0.0.1:6379> info memory
    # Memory
    used_memory:1039904
    used_memory_human:1015.53K
    used_memory_rss:3375104
    used_memory_rss_human:3.22M
    used_memory_peak:1039904
    used_memory_peak_human:1015.53K
    used_memory_peak_perc:100.00%
    used_memory_overhead:1037334
    used_memory_startup:987120
    used_memory_dataset:2570
    used_memory_dataset_perc:4.87%
    allocator_allocated:1006560
    allocator_active:3337216
    allocator_resident:3337216
    total_system_memory:8589934592
    total_system_memory_human:8.00G
    used_memory_lua:37888
    used_memory_lua_human:37.00K
    used_memory_scripts:0
    used_memory_scripts_human:0B
    number_of_cached_scripts:0
    maxmemory:0
    maxmemory_human:0B
    maxmemory_policy:noeviction
    allocator_frag_ratio:3.32
    allocator_frag_bytes:2330656
    allocator_rss_ratio:1.00
    allocator_rss_bytes:0
    rss_overhead_ratio:1.01
    rss_overhead_bytes:37888
    mem_fragmentation_ratio:3.35
    mem_fragmentation_bytes:2368544
    mem_not_counted_for_evict:0
    mem_replication_backlog:0
    mem_clients_slaves:0
    mem_clients_normal:49694
    mem_aof_buffer:0
    mem_allocator:libc
    active_defrag_running:0
    lazyfree_pending_objects:0
    

    三、时间复杂度

    命令 时间复杂度
    keys O(n)
    dbsize O(1)
    del O(1)
    exists O(1)
    expire O(1)
    type O(1)

    四、数据结构和内部编码

    数据结构和内部编码示例图 image.png redis单线程图解

    五、单线程为什么这么快?

    1. 纯内存 (主要原因)
    2. 非阻塞IO(NIO)
    3. 避免线程切换和竞态消耗
      (1)一次只运行一条命令
      (2)拒绝长(慢)命令
      keys,flushall,flushdb,show lua script,multi/exec,operate big value(collection)
      (3)其实不是单线程:
    • fysnc file descriptor
    • close file descriptor
    image.png

    相关文章

      网友评论

        本文标题:Redis第3️⃣课 通用命令

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