Redis

Redis第3️⃣课 通用命令

2019-04-25  本文已影响9人  小超_8b2f

一、通用命令

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)其实不是单线程:
image.png
上一篇 下一篇

猜你喜欢

热点阅读