1. Redis基础认知与Linux环境准备
Redis作为当下最流行的内存数据库之一,在Web开发、缓存优化、消息队列等场景中扮演着重要角色。我第一次在生产环境使用Redis是在2013年一个电商秒杀项目中,当时用简单的SET/GET命令就解决了高并发库存扣减的难题。本文将基于Linux环境,分享Redis最核心的20%功能,这些命令能解决80%的日常需求。
在主流Linux发行版(Ubuntu/CentOS)中安装Redis只需一条命令:
bash复制# Ubuntu/Debian
sudo apt update && sudo apt install redis-server
# CentOS/RHEL
sudo yum install epel-release && sudo yum install redis
安装完成后,三个关键控制命令需要掌握:
bash复制sudo systemctl start redis # 启动服务
sudo systemctl enable redis # 开机自启
redis-cli ping # 健康检查
注意:生产环境强烈建议修改默认的6379端口和bind设置,可通过编辑/etc/redis/redis.conf实现基础安全加固。
2. 核心数据操作实战
2.1 字符串类型基础操作
作为最基础的数据结构,字符串类型支持丰富的操作指令。这里演示一个电商商品缓存的典型场景:
bash复制# 设置商品信息(EX参数设置10秒过期)
127.0.0.1:6379> SET item:1001 "{\"name\":\"iPhone13\",\"price\":5999}" EX 10
# 获取值
127.0.0.1:6379> GET item:1001
# 原子性递增/递减
127.0.0.1:6379> INCR item:1001:views # 浏览次数统计
127.0.0.1:6379> DECR item:1001:stock # 库存扣减
实际项目中,我常用MSET/MGET批量操作提升效率:
bash复制MSET user:1001:name "张三" user:1001:age 30 user:1001:gender "男"
MGET user:1001:name user:1001:age
2.2 哈希类型应用技巧
当需要存储对象属性时,哈希类型比JSON字符串更高效。以用户信息存储为例:
bash复制# 存储用户信息
127.0.0.1:6379> HSET user:1002 name "李四" age 25 email "lisi@example.com"
# 获取单个字段
127.0.0.1:6379> HGET user:1002 name
# 获取所有字段
127.0.0.1:6379> HGETALL user:1002
# 字段递增
127.0.0.1:6379> HINCRBY user:1002 age 1
经验:当字段超过50个时,哈希的存储效率会明显优于字符串类型,实测内存占用可减少40%左右。
3. 高级特性实战
3.1 事务与管道技术
Redis的事务与关系型数据库有本质区别。以下是一个库存扣减的事务示例:
bash复制127.0.0.1:6379> MULTI
127.0.0.1:6379> WATCH item:1001:stock
127.0.0.1:6379> GET item:1001:stock
127.0.0.1:6379> DECR item:1001:stock
127.0.0.1:6379> EXEC
管道技术能显著提升批量操作性能。这是我常用的Python管道示例:
python复制import redis
r = redis.Redis()
pipe = r.pipeline()
for i in range(1000):
pipe.set(f'key:{i}', i)
pipe.execute()
3.2 发布订阅模式
构建实时通知系统时,Pub/Sub模式非常实用:
bash复制# 终端1:订阅频道
127.0.0.1:6379> SUBSCRIBE order_notice
# 终端2:发布消息
127.0.0.1:6379> PUBLISH order_notice "订单1002已支付"
4. 生产环境优化经验
4.1 持久化配置策略
在/etc/redis/redis.conf中,我通常这样配置混合持久化:
conf复制save 900 1 # 15分钟至少有1个key变化
save 300 10 # 5分钟至少有10个key变化
appendonly yes # 开启AOF
appendfsync everysec # 折衷的同步策略
4.2 内存优化技巧
- 使用
redis-cli --bigkeys分析大Key - 对长字符串采用压缩算法处理
- 设置合理的maxmemory-policy(通常用volatile-lru)
bash复制# 内存使用分析示例
127.0.0.1:6379> INFO memory
used_memory_human:1.2G
mem_fragmentation_ratio:1.5
5. 常见问题排查实录
5.1 连接数暴增问题
现象:客户端报"max number of clients reached"
解决方案:
bash复制# 查看连接数
127.0.0.1:6379> CLIENT LIST
# 修改最大连接数(临时)
127.0.0.1:6379> CONFIG SET maxclients 10000
# 永久生效需修改redis.conf
5.2 慢查询分析
bash复制# 设置阈值(微秒)
127.0.0.1:6379> CONFIG SET slowlog-log-slower-than 10000
# 查看慢查询
127.0.0.1:6379> SLOWLOG GET 10
在多年的Redis使用中,我发现80%的性能问题都源于不合理的Key设计。建议遵循"业务前缀:实体ID:字段"的命名规范,如order:1001:status,既避免冲突又便于维护。