Redis服务端相关

时间:2021-11-30 02:44:04

全局命令:

查看所有键:

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上限时触发内存溢出控制策略

控制键的数量,过多的键会消耗大量内存