全局命令:
查看所有键:
keys *
键总数:
dbsize
检查键是否存在:
exists key
删除键:
del key [key...]
键过期:
expire key seconds
键的数据类型:
type key
通过object encoding命令查询内部编码
Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务
1)纯内存访问
2)非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现
3)单线程避免了线程切换和竞态产生的消耗
键重命名:
rename key newkey
迁移键:
move key db 用于在Redis内部进行数据迁移
dump key + restore key ttl value 可以实现在不同的Redis实例之间进行数据迁移
127.0.0.1:6379> dump name
"\x00\x05allen\a\x00\x82\x9a*T/\xb9\x9b\x87"
127.0.0.1:6379> dump age
"\x00\xc0!\a\x006.9\xfaQ\x06\xe8\r"
127.0.0.1:6379> dump pass
"\x00\x06abc123\a\x00\x90\t\xe8\x1b\xf2\xd4\x8b\xec"
192.168.1.122:6379> restore name 0 "\x00\x05allen\a\x00\x82\x9a*T/\xb9\x9b\x87"
OK
192.168.1.122:6379> restore age 0 "\x00\xc0!\a\x006.9\xfaQ\x06\xe8\r"
OK
192.168.1.122:6379> restore pass 0 "\x00\x06abc123\a\x00\x90\t\xe8\x1b\xf2\xd4\x8b\xec"
OK
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key ...]]
127.0.0.1:6379> migrate 192.168.1.122 6379 name 0 5000 默认是删除源库的键值
OK
127.0.0.1:6379> migrate 192.168.1.122 6379 "" 0 5000 copy keys age pass 加copy和replace源库不删除键值
OK
遍历键:
keys *
scan命令可以解决keys命令可能带来的阻塞问题,同时Redis还提供了hscan、sscan、zscan渐进式遍历hash、zset、zset
慢查询分析:
慢查询两个参数slowlog-log-slower-than,单位是微秒,默认是10000微秒,即10毫秒。slowlog-max-len建议设置为1000以上。
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
config rewrite
将Redis配置持久化到本地配置文件,需要执行config rewrite命令
获取慢查询日志长度:
slowlog len
获取慢查询日志:
slowlog get [n]
慢查询日志重置:
slowlog reset
Redis Shell:
redis-cli -r 5 -i 1 ping
redis-cli -r 10 -i 1 info | grep used_memory_human
echo "world" | redis-cli -x set hello -x选项代表从标准输入读取数据作为redis-cli的最后一个参数
redis-cli --latency 可以测试客户端到目标Redis的网络延迟
redis-cli --bigkeys 使用scan命令对Redis的键进行采样,从中找到内存占用比较大的键值,这些键值可能是系统的瓶颈
Redis服务器命令
Redis 服务器命令主要是用于管理 redis 服务
获取redis服务器的统计信息:
[root@mysql1 src]# ./redis-cli
127.0.0.1:6379> info
# Server
redis_version:3.2.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:edc5a285ff373c21
redis_mode:standalone
os:Linux 2.6.32-431.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:50131
run_id:5cda11ef7fb37e28d22a6458ecb292eaeb147ea8
tcp_port:6379
uptime_in_seconds:14723
uptime_in_days:0
hz:10
lru_clock:11206608
executable:/software/redis-3.2.3/src/./redis-server
config_file:
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:824104
used_memory_human:804.79K
used_memory_rss:8224768
used_memory_rss_human:7.84M
used_memory_peak:824104
used_memory_peak_human:804.79K
total_system_memory:2087575552
total_system_memory_human:1.94G
used_memory_lua:65536
used_memory_lua_human:64.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:9.98
mem_allocator:jemalloc-4.0.3
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1470824081
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:3
total_commands_processed:113
instantaneous_ops_per_sec:0
total_net_input_bytes:4648
total_net_output_bytes:18026300
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:29
keyspace_misses:3
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:1232
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:12.56
used_cpu_user:7.47
used_cpu_sys_children:0.01
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=11,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0
db2:keys=1,expires=0,avg_ttl=0
127.0.0.1:6379> bgrewriteaof //异步执行一个 AOF(AppendOnly File)文件重写操作
Background append only file rewriting started
127.0.0.1:6379> bgsave //在后台异步保存当前数据库的数据到磁盘
Background saving started
127.0.0.1:6379> client list //获取连接到服务器的客户端连接列表
id=4 addr=127.0.0.1:59487 fd=6 name= age=301 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
127.0.0.1:6379> command
127.0.0.1:6379> command count
127.0.0.1:6379> dbsize //返回当数据库的key数量
(integer) 11
127.0.0.1:6379> flushall //删除所有数据库的所有key
127.0.0.1:6379> flushdb //删除当前数据库的所有key
127.0.0.1:6379> info //获取redis服务器的各种信息和统计数值
127.0.0.1:6379> lastsave //返回最近一次redis将数据保存到磁盘上的时间
127.0.0.1:6379> role //返回主从实例所属的角色
127.0.0.1:6379> save //异步保存数据到硬盘
127.0.0.1:6379> slaveof host port //将当前服务器转变为指定服务器的从属服务器
127.0.0.1:6379> sync //用于复制的内部命令
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass "abc123"
OK
127.0.0.1:6379> exit
[root@mysql1 src]# ./redis-cli
127.0.0.1:6379> auth "abc123"
OK
客户端最先感知阻塞等Redis超时行为,加入日志监控报警工具可快速定位阻塞问题,同事需要对Redis进程和机器做全面监控。
阻塞的内在原因:确认主线程是否存在阻塞,检查慢查询等信息,发现不合理使用API或数据结构的情况,如keys、sort、hgetall等。关注CPU使用率防止单核跑满。当硬盘IO资源紧张时,AOF追加也会阻塞主线程。
阻塞的外在原因:从CPU竞争、内存交换、网络问题等方面入手排查是否因为系统层面问题引起的阻塞。
内存使用统计:
info memory详细解释
used_memory Redis分配的内存总量
used_memory_human
used_memory_rss 从操作系统的角度显示Redis进程占用的物理内存总量
mem_fragmentation_ratio 内存碎片率,>1时,说明碎片严重。<1时,说明操作系统把Redis内存交换(Swap)到硬盘导致
内存消耗划分:
对象内存-是Redis占用最大的一块,存储着用户所有的数据
缓冲内存-客户端缓冲、复制积压缓冲区、AOF缓冲区
内存碎片
内存管理:
设置内存上限,使用maxmemory参数限制最大可用内存
动态调整内存上限,config set maxmemory 6GB
内存回收策略:删除到达过期时间的键对象,内存使用达到maxmemory上限时触发内存溢出控制策略
控制键的数量,过多的键会消耗大量内存