使用Pipeline批量执行命令,避免多次网络往返:redis-cli --pipe 或在代码中使用pipeline = redis.pipeline(); pipeline.set('key1', 'value1'); pipeline.get('key2'); results = pipeline.execute();
索引优化
对于大数据量查询,建议使用有序集合(ZSET)代替KEYS或SCAN,ZADD key score member,然后用ZRANGEBYSCORE或ZREVRANGE快速范围查询,避免全表扫描。
连接池配置
配置合适的连接池大小,如JedisPoolConfig.setMaxTotal(20); setMaxIdle(10); 减少连接创建开销,重用连接提升吞吐。
数据结构选择
用HASH代替多个STRING键存储对象,如HMSET user:1 name tom age 25,比多KEY SET快10倍;LIST用于队列,SET去重,ZSET排序。
避免大KEY
拆分大KEY,如一个KEY存100万member,用1000个子KEY每个1000个;监控bigkeys命令,定期拆分,防止内存碎片和慢查询。
持久化调优
关闭AOF或调大appendfsync everysec,避免RDB阻塞主线程;用no-appendfsync-on-rewrite关重写时同步。
集群分片
用HASH TAG {user123}key确保同一用户数据落同一槽,减少跨槽查询;合理设置slots分布均匀。
FAQ
Q: KEYS * 为什么慢?
A: KEYS阻塞服务器,遍历全库,线上禁用,用SCAN迭代。
Q: Pipeline怎么用在Java?
A: Jedis jedis = new Jedis(); Pipeline p = jedis.pipelined(); p.set("key","val"); p.sync();
Q: 大KEY怎么检测?
A: redis-cli --bigkeys采样,或INFO memory监控used_memory。
Q: 慢查询怎么排查?
A: 配置slowlog-log-slower-than 10000,SLOWLOG GET查看。