1.前言

当我们的系统接入 redis 作为缓存数据库的时候,如何评价接入 redis 后对系统的性能有多大的提升,系统的抗并发性有多大的提升,这可以参考一下 redis 的命中率指标。通常来说,命中率越高表示使用缓存的效果越好,应用的性能越好,抗并发的能力越强。

2.概念介绍

命中率 = 命中次数 / ( 命中次数 + 不命中次数 )

命中次数:当使用指令向 redis 中查询某个 key 的数据时,数据存在 redis 中,并返回,命中次数加 1,redis 中使用 keyspace_hits 表示。

不命中次数:当使用指令向 redis 中查询某个 key 的数据时,数据不存在 redis 中,并null,不命中次数加 1,redis 中使用 keyspace_misses 表示。

3.如何获取 Redis 命中率情况

redis 提供了 info 这个命令,能够随时监控服务器的状态相关信息,内容如下,在这些信息中找到 keyspace_hits、keyspace_misses 这两个指标。

# Server
redis_version:3.2.100
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:dd26f1f93c5130ee
redis_mode:standalone
os:Windows  
arch_bits:64
multiplexing_api:WinSock_IOCP
process_id:4492
run_id:5d6bd70bf528b9b1c45aea81be6c89256dcfea0b
tcp_port:6379
uptime_in_seconds:111
uptime_in_days:0
hz:10
lru_clock:5336283
executable:C:\Users\Administrator\Desktop\Redis-x64-3.2.100\redis-server.exe
config_file:

# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:7415936
used_memory_human:7.07M
used_memory_rss:7378160
used_memory_rss_human:7.04M
used_memory_peak:7415936
used_memory_peak_human:7.07M
total_system_memory:0
total_system_memory_human:0B
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:0.99
mem_allocator:jemalloc-3.6.0

# Persistence
loading:0
rdb_changes_since_last_save:1
rdb_bgsave_in_progress:0
rdb_last_save_time:1615948908
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
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:1
total_commands_processed:9
instantaneous_ops_per_sec:0
total_net_input_bytes:284
total_net_output_bytes:6520
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:1
keyspace_misses:1
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
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:0.09
used_cpu_user:0.25
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=2,expires=0,avg_ttl=0

4.提高命中率方案

从数学方面来看,我们尽可能减少不命中次数就可以提高命中率了,可以理解为应用每次需要从 redis 中获取数据时,都可以拿到。这就要求一开始就需要将缓存数据主动放到 redis 中,并避免其失效。

但是,在实际工作中,并没有这么简单,这往往需要我们在业务需求,缓存粒度,缓存策略,技术选型等各个方面去通盘考虑并做权衡。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐