07-redis性能优化
第七章Redis性能优化7.1 内存优化数据结构选择1. String vs Hash# String存储对象SET user:1001{name:张三,age:25,email:zhangsanexample.com}# Hash存储对象推荐HSET user:1001 name张三HSET user:1001 age25HSET user:1001 emailzhangsanexample.com2. List vs ZSet# List存储有序数据适合简单列表LPUSH recent:itemsitem1LPUSH recent:itemsitem2# ZSet存储有序数据需要排序ZADD leaderboard100user1ZADD leaderboard95user2内存优化技巧1. 使用合适的数据编码# 查看编码OBJECT ENCODING key# String编码# int: 整数# embstr: 短字符串44字节# raw: 长字符串44字节# Hash编码# ziplist: 压缩列表元素少且值小# hashtable: 哈希表元素多或值大# List编码# ziplist: 压缩列表元素少且值小# linkedlist: 链表元素多或值大# quicklist: 快速列表Redis 3.2# Set编码# intset: 整数集合元素都是整数且数量少# hashtable: 哈希表元素多或包含非整数# ZSet编码# ziplist: 压缩列表元素少且分数小# skiplist: 跳跃表元素多或分数大2. 控制数据结构大小# Hash使用ziplist hash-max-ziplist-entries 512 hash-max-ziplist-value 64 # List使用ziplist list-max-ziplist-size -2 # Set使用intset set-max-intset-entries 512 # ZSet使用ziplist zset-max-ziplist-entries 128 zset-max-ziplist-value 643. 使用位操作# 使用Bitmap存储布尔值SETBIT user:1001:features01SETBIT user:1001:features10SETBIT user:1001:features21# 比使用多个String节省空间# SET user:1001:feature:0 1# SET user:1001:feature:1 0# SET user:1001:feature:2 14. 使用共享对象池# 共享对象池配置 # Redis默认会共享0-9999的整数 # 可以通过修改源码调整共享范围内存监控# 查看内存使用情况INFO memory# 关键指标used_memory_human# 已使用内存used_memory_peak_human# 峰值内存used_memory_rss_human# 系统分配内存mem_fragmentation_ratio# 内存碎片率# 查看大keyredis-cli--bigkeys# 查看内存使用redis-cli--memkeys7.2 命令优化避免使用KEYS命令# 不推荐KEYS命令会阻塞RedisKEYS user:*# 推荐使用SCAN命令SCAN0MATCH user:* COUNT100批量操作# 使用MGET替代多次GETMGET key1 key2 key3# 使用MSET替代多次SETMSET key1 value1 key2 value2 key3 value3# 使用HMSET替代多次HSETHMSET user:1001 name张三age25emailzhangsanexample.com# 使用Pipeline批量执行redis-cli--pipeEOF SET key1 value1 SET key2 value2 SET key3 value3 EOF使用Lua脚本-- 原子性执行多个命令localresult{}fori1,100doresult[i]redis.call(GET,key:..i)endreturnresult合理使用过期时间# 设置过期时间SETEX key3600value# 为已有key设置过期时间EXPIRE key3600# 设置精确过期时间EXPIREAT key1704067200避免大key操作# 拆分大Hash# 不推荐HSET big:hash field1 value1 HSET big:hash field2 value2# ...大量字段# 推荐HSET hash:1 field1 value1 HSET hash:2 field2 value2# 拆分大List# 不推荐LPUSH big:list item1 LPUSH big:list item2# ...大量元素# 推荐LPUSH list:1 item1 LPUSH list:2 item27.3 网络优化使用连接池importredisfromredis.connectionimportConnectionPool# 创建连接池poolConnectionPool(hostlocalhost,port6379,max_connections50)# 使用连接池rredis.Redis(connection_poolpool)# 使用连接r.set(key,value)valuer.get(key)减少网络往返importredis# 不推荐多次网络往返rredis.Redis(hostlocalhost,port6379)r.set(key1,value1)r.set(key2,value2)r.set(key3,value3)# 推荐使用Pipelinepiper.pipeline()pipe.set(key1,value1)pipe.set(key2,value2)pipe.set(key3,value3)pipe.execute()使用本地缓存importredisfromfunctoolsimportlru_cache rredis.Redis(hostlocalhost,port6379)lru_cache(maxsize1000)defget_user(user_id):returnr.get(fuser:{user_id})优化TCP参数# TCP backlog tcp-backlog 511 # TCP keepalive tcp-keepalive 300 # TCP缓冲区大小 # 在系统层面配置 # /proc/sys/net/core/somaxconn # /proc/sys/net/ipv4/tcp_max_syn_backlog7.4 配置优化基础配置# 最大客户端连接数 maxclients 10000 # 最大内存 maxmemory 2gb # 内存淘汰策略 maxmemory-policy allkeys-lru # 持久化策略 # 根据需求选择RDB、AOF或混合持久化性能相关配置# 关闭THP # 在系统层面配置 echo never /sys/kernel/mm/transparent_hugepage/enabled # 设置swapiness # 在系统层面配置 sysctl vm.swappiness10 # 文件描述符限制 # 在系统层面配置 ulimit -n 65535慢查询配置# 慢查询阈值 slowlog-log-slower-than 10000 # 慢查询日志长度 slowlog-max-len 128命令统计# 查看命令统计INFO commandstats# 查看热门命令redis-cli--latency7.5 性能监控基础监控# 查看Redis信息INFO# 关键指标# CPUused_cpu_sys# 系统CPU时间used_cpu_user# 用户CPU时间# 内存used_memory_human# 已使用内存used_memory_peak_human# 峰值内存mem_fragmentation_ratio# 内存碎片率# 连接connected_clients# 连接客户端数blocked_clients# 阻塞客户端数# 命令instantaneous_ops_per_sec# 每秒操作数total_commands_processed# 总命令数total_connections_received# 总连接数# 错误rejected_connections# 拒绝的连接数sync_full# 全量同步次数sync_partial_err# 部分同步错误次数延迟监控# 测量延迟redis-cli--latency# 延迟历史redis-cli --latency-history# 延迟分布redis-cli --latency-dist性能分析# 查看慢查询SLOWLOG GET10# 查看命令统计INFO commandstats# 分析热点keyredis-cli--hotkeys监控脚本#!/bin/bash# Redis监控脚本# 获取Redis信息INFO$(redis-cli INFO)# 提取关键指标MEMORY$(echo$INFO|grepused_memory_human|cut-d:-f2|tr-d\r)FRAGMENTATION$(echo$INFO|grepmem_fragmentation_ratio|cut-d:-f2|tr-d\r)OPS$(echo$INFO|grepinstantaneous_ops_per_sec|cut-d:-f2|tr-d\r)CLIENTS$(echo$INFO|grepconnected_clients|cut-d:-f2|tr-d\r)# 输出结果echo内存使用:$MEMORYecho内存碎片率:$FRAGMENTATIONecho每秒操作数:$OPSecho连接数:$CLIENTS# 检查异常if[$(echo$FRAGMENTATION 1.5|bc)-eq1];thenecho警告: 内存碎片率过高fiif[$OPS-gt100000];thenecho警告: 每秒操作数过高fi性能优化建议1. 内存使用定期监控内存使用情况及时清理无用数据合理设置过期时间避免大key2. 命令使用避免使用KEYS命令使用SCAN代替KEYS批量操作使用Pipeline合理使用Lua脚本3. 网络优化使用连接池减少网络往返使用本地缓存优化TCP参数4. 配置优化根据实际需求配置maxmemory选择合适的内存淘汰策略合理配置持久化策略优化系统参数5. 监控告警设置内存使用告警监控慢查询日志跟踪关键性能指标定期分析性能数据
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2417523.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!