简介:本文提供Redis的全面使用手册,涵盖安装配置、数据结构操作、集群部署及性能优化,帮助开发者快速掌握Redis核心技能。
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对存储系统,支持多种数据结构(字符串、哈希、列表、集合、有序集合等)。其核心优势包括高性能(读写速度可达10万次/秒)、持久化支持、主从复制和集群功能,广泛应用于缓存、消息队列、分布式锁等场景。
# 下载Redis稳定版wget https://download.redis.io/releases/redis-7.0.12.tar.gztar xzf redis-7.0.12.tar.gzcd redis-7.0.12make# 启动服务(前台运行)src/redis-server# 后台运行配置vim redis.conf# 修改daemonize为yes# 启动命令src/redis-server redis.conf
关键配置项:
bind 127.0.0.1:限制访问IPprotected-mode yes:启用保护模式requirepass yourpassword:设置认证密码maxmemory 1gb:设置最大内存appendonly yes:启用AOF持久化
# 设置键值SET user:1000:name "Alice"# 获取值GET user:1000:name# 数值增减INCR user:1000:score # +1DECRBY user:1000:score 5 # -5
应用场景:缓存用户信息、计数器、分布式锁(SETNX)
# 存储对象HSET user:1001 name "Bob" age 30 email "bob@example.com"# 获取字段HGET user:1001 name# 获取所有字段HGETALL user:1001
优势:相比多个String键,哈希可减少内存碎片。
# 从左侧插入LPUSH messages "msg1" "msg2"# 从右侧弹出RPOP messages# 获取范围LRANGE messages 0 -1
典型场景:消息队列、最新消息排行。
# 添加元素SADD tags "redis" "database" "nosql"# 获取交集SINTER tags:article1 tags:article2# 随机获取元素SPOP tags 1
应用:标签系统、共同好友计算。
# 添加带分数的元素ZADD rankings 100 "Alice" 200 "Bob" 150 "Charlie"# 获取排名范围ZRANGE rankings 0 2 WITHSCORES# 按分数增量更新ZINCRBY rankings 50 "Alice"
核心场景:排行榜、优先级队列。
SAVE(阻塞)或BGSAVE(后台)save 900 1表示900秒内至少1次修改)always:每次修改都写入磁盘(最安全但性能最低)everysec(默认):每秒同步一次no:由操作系统决定BGREWRITEAOF压缩日志体积推荐配置:
appendonly yesappendfsync everysec
# 从节点配置slaveof 192.168.1.100 6379# 启动后自动同步主节点数据
特点:读写分离,从节点只读,主节点故障时需手动切换。
# sentinel.conf 示例sentinel monitor mymaster 192.168.1.100 6379 2sentinel down-after-milliseconds mymaster 5000sentinel failover-timeout mymaster 60000
工作流程:
# 启动集群节点(示例)redis-server --cluster-enabled yes --cluster-config-file nodes.conf \--port 7000 --cluster-node-timeout 5000# 创建集群(需至少3个主节点)redis-cli --cluster create 192.168.1.100:7000 192.168.1.101:7001 \192.168.1.102:7002 --cluster-replicas 1
关键特性:
list-max-ziplist-entries 512
// Jedis连接池示例JedisPoolConfig poolConfig = new JedisPoolConfig();poolConfig.setMaxTotal(100);poolConfig.setMaxIdle(30);JedisPool pool = new JedisPool(poolConfig, "localhost", 6379);
Pipeline pipeline = jedis.pipelined();for (int i = 0; i < 1000; i++) {pipeline.set("key" + i, "value" + i);}pipeline.sync();
# 配置慢查询阈值(微秒)CONFIG SET slowlog-log-slower-than 10000# 查看慢查询日志SLOWLOG GET 10
现象:单个键值过大导致内存不均
解决方案:
OBJECT ENCODING key检查编码类型原因:网络分区导致多个主节点存在
预防措施:
min-slaves-to-write 1min-slaves-max-lag 10检测命令:
INFO memory# 关注mem_fragmentation_ratio(>1.5需整理)
整理方法:
activedefrag yes
-- 原子性操作示例:限流local current = redis.call("incr", KEYS[1])if tonumber(current) == 1 thenredis.call("expire", KEYS[1], ARGV[1])endreturn current
执行方式:
EVAL "script内容" 1 rate_limit:user1001 60
# 添加消息XADD mystream * field1 value1 field2 value2# 消费者组XGROUP CREATE mystream mygroup $ MKSTREAM# 读取消息XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >
应用场景:消息队列、事件溯源
# redis.confrequirepass StrongPassword123!
# 仅允许特定IP访问iptables -A INPUT -p tcp --dport 6379 -s 192.168.1.0/24 -j ACCEPTiptables -A INPUT -p tcp --dport 6379 -j DROP
# 禁用危险命令rename-command FLUSHALL ""rename-command CONFIG "config-disabled"
keyspace_hits / (keyspace_hits + keyspace_misses))connected_clients)blocked_clients)
# prometheus.yml 配置scrape_configs:- job_name: 'redis'static_configs:- targets: ['redis:9121']
使用redis_exporter暴露指标,配合Grafana可视化。
本手册系统梳理了Redis从基础操作到高级集群管理的完整知识体系,建议开发者结合实际业务场景进行针对性优化。对于生产环境,建议定期进行压力测试(如使用memtier_benchmark工具)和故障演练,确保系统稳定性。