一、通用命令
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单线程图解五、单线程为什么这么快?
- 纯内存 (主要原因)
- 非阻塞IO(NIO)
- 避免线程切换和竞态消耗
(1)一次只运行一条命令
(2)拒绝长(慢)命令
keys,flushall,flushdb,show lua script,multi/exec,operate big value(collection)
(3)其实不是单线程:
- fysnc file descriptor
- close file descriptor
网友评论