Redis是一款基于内存的高性能键值数据库,凭借极快的读写速度和丰富的数据结构,被广泛用于缓存、消息队列、分布式锁等场景。Redis6.0是一个里程碑式的版本,它首次引入了多线程IO处理、ACL用户权限管理、客户端缓存等新特性,同时保留了以往版本简洁易用的特点。对新手来说,掌握Redis6.0的安装、基本命令和配置方法是进入后端开发领域绕不开的一步,本文将从零开始把这些内容讲清楚。

Redis6.0的安装与启动
Redis官方主要支持Linux环境,推荐使用源码编译方式安装。首先需要确保系统已安装gcc编译环境,然后从官网下载Redis6.0的源码包,解压后执行编译和安装命令即可。整个过程非常简单,一般几分钟就能完成。
# 下载并解压源码包 wget https://download.redis.io/releases/redis-6.0.9.tar.gz tar -zxvf redis-6.0.9.tar.gz cd redis-6.0.9 # 编译并安装到指定目录 make && make PREFIX=/usr/local/redis install # 启动Redis服务 /usr/local/redis/bin/redis-server
直接运行redis-server会以前台模式启动,关闭终端服务就停了,实际使用中通常需要修改配置文件让它以守护进程方式在后台运行。可以复制源码目录下的redis.conf到安装目录,修改daemonize参数为yes,再通过指定配置文件的方式启动。启动后使用redis-cli命令即可连接到本地的Redis服务,输入ping命令返回PONG说明服务一切正常。
# 修改配置后以后台模式启动 cp redis.conf /usr/local/redis/bin/ vim /usr/local/redis/bin/redis.conf # 将 daemonize no 改为 daemonize yes /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf # 连接测试 /usr/local/redis/bin/redis-cli 127.0.0.1:6379> ping PONG
Windows用户如果只是本地学习,可以通过微软维护的Redis分支或者WSL子系统来安装。WSL方案更值得推荐,因为它运行的是标准Linux环境下的Redis,行为与生产环境完全一致,能避免很多因平台差异造成的奇怪问题。
五种基础数据类型与常用命令
Redis并不是简单的键值存储,它支持字符串、哈希、列表、集合、有序集合五种基础数据类型,每种类型都有对应的操作命令。字符串是最常用的类型,可以存放文本、数字甚至序列化后的对象,set和get命令负责写入和读取,incr命令可以对数值进行原子自增,非常适合做计数器。
# 字符串操作 127.0.0.1:6379> set name "zhangsan" 127.0.0.1:6379> get name "zhangsan" 127.0.0.1:6379> set count 100 127.0.0.1:6379> incr count (integer) 101 # 哈希操作,适合存储对象 127.0.0.1:6379> hset user:1 name lisi age 25 127.0.0.1:6379> hget user:1 name "lisi" 127.0.0.1:6379> hgetall user:1 # 列表操作,可用于简单消息队列 127.0.0.1:6379> lpush tasklist task1 task2 127.0.0.1:6379> rpop tasklist "task1"
哈希类型适合存储对象的多个字段,比如用户信息中的姓名、年龄、邮箱等,hset写入字段,hgetall一次性取出所有字段,避免了把整个对象序列化成一个大字符串带来的局部更新困难。列表是一个双向链表结构,lpush和rpop组合可以实现简单的队列功能,lrange命令可以按范围查看元素。
集合类型的特点是元素不重复,支持交并差集运算,常用于标签系统、共同好友计算等场景。有序集合在集合的基础上为每个元素关联了一个分数,元素会按分数自动排序,zadd添加元素,zrange按分数范围查询,排行榜功能用它实现最为合适。掌握这五种类型的适用场景,比死记硬背命令重要得多。
# 集合操作 127.0.0.1:6379> sadd tags:1 java redis 127.0.0.1:6379> smembers tags:1 # 有序集合实现排行榜 127.0.0.1:6379> zadd ranking 95 xiaoming 88 xiaohong 100 xiaogang 127.0.0.1:6379> zrevrange ranking 0 2 withscores
Redis6.0新特性:多线程与ACL权限
Redis6.0最引人关注的变化是引入了多线程IO。需要澄清一个常见误解:Redis的处理命令依然是单线程的,多线程只用于网络数据的读取和协议解析,以及结果数据的回写。这样做既利用了多核CPU的网络处理能力,又避免了多线程操作数据带来的锁竞争和复杂性,官方数据显示在网络吞吐大的场景下性能可以提升一倍左右。开启方式很简单,在配置文件中设置相关参数即可。
# redis.conf 中开启多线程IO io-threads-do-reads yes io-threads 4
io-threads参数建议设置为机器CPU核心数的一半左右,一般2到4个就够用了,设置过大反而会因为线程切换带来额外开销。如果你的Redis实例QPS不高,网络不是瓶颈,完全可以不开多线程,保持默认的单线程模式更简单稳定。
另一个实用的新特性是ACL访问控制列表。在Redis6.0之前,所有客户端共享同一个密码,无法做细粒度权限控制。现在可以创建多个用户,分别限制它们能执行的命令和能访问的键,大大提升了安全性。比如可以创建一个只读用户给报表系统使用,防止业务代码误删数据。
# 在redis-cli中使用ACL命令创建用户 127.0.0.1:6379> ACL SETUSER report on >report123 ~app:* +get +mget 127.0.0.1:6379> ACL LIST # 上述命令创建了一个名为report的用户 # 密码为report123,只能访问以app:开头的键 # 且只允许执行get和mget两个命令
持久化机制的选择与配置
Redis的数据存在内存里,一旦进程重启数据就会丢失,因此持久化是必须理解的知识点。Redis提供RDB和AOF两种持久化方式。RDB是定时把内存数据快照写到磁盘上,文件紧凑、恢复速度快,但两次快照之间的数据在宕机时会丢失。AOF则是把每一条写命令追加到日志文件中,数据安全性更高,最多丢失一秒的数据,但文件体积更大、恢复也慢一些。
对于大多数业务场景,推荐两种方式同时开启:RDB用于快速恢复和备份,AOF用于保证数据尽量不丢。AOF还支持重写机制,当日志文件过大时会自动根据当前内存数据生成精简的新文件。配置文件中的关键参数如下。
# RDB快照策略:900秒内至少1次修改、 # 300秒内至少10次修改、60秒内至少10000次修改时触发 save 900 1 save 300 10 save 60 10000 # 开启AOF appendonly yes # 每秒刷盘一次,兼顾性能与安全 appendfsync everysec
appendfsync参数有三个可选值:always表示每条命令都刷盘,最安全但性能最差;everysec每秒刷一次,是官方推荐的折中方案;no表示由操作系统决定何时刷盘,性能最好但风险最大。新手建议固定使用everysec,在性能和可靠性之间取得平衡。
新手常见问题与避坑指南
第一个常见问题是内存满了怎么办。Redis通过maxmemory参数限制最大内存,达到上限后会根据淘汰策略删除部分键。常用的策略有noeviction拒绝写入、allkeys-lru淘汰最近最少使用的键、volatile-lru只在设置了过期时间的键中淘汰等。作为缓存使用时,推荐设置allkeys-lru策略,并根据服务器实际内存合理规划maxmemory的大小,一般不要超过物理内存的百分之七十。
第二个坑是键名设计不规范。有些新手把所有数据都堆在零号数据库里,键名随意取,时间一长没人知道某个键是干什么用的。建议按照业务前缀加冒号的方式命名,例如user:1:profile表示用户的资料,order:2024:count表示订单计数,这样便于排查问题和管理。同时要避免使用keys命令遍历所有键,这个命令会阻塞主线程,键数量大时会导致服务卡死,应该改用scan命令渐进式遍历。
# 危险操作:阻塞主线程,生产环境禁用 # keys * # 安全的渐进式遍历方式 127.0.0.1:6379> scan 0 match user:* count 100
第三个问题是过期时间与缓存穿透。给缓存键设置过期时间时要加入随机值,避免大量键同一时刻失效造成数据库瞬间压力激增,也就是常说的缓存雪崩。对于查询不存在的数据的场景,可以在Redis中缓存一个空值并设置较短的过期时间,防止恶意请求反复打到数据库上。此外,Redis6.0默认关闭了远程访问,如果需要从其他机器连接,除了修改bind配置外,务必设置requirepass密码或使用ACL用户,否则把没有认证的Redis暴露在公网上会被扫描利用,造成数据泄露甚至服务器被植入挖矿程序,这类安全事件在实际中非常常见,一定要引起重视。