2、Redis入门:Redis简介、Redis与Memcached对比、Redis安装与启动、Redis基本配置
2.1 什么是Redis?先聊聊我的第一印象
我第一次接触Redis,是在一个电商项目的秒杀场景里。数据库扛不住高并发,老板急得直跺脚。当时我就在想:有没有一种东西,能把数据放在内存里,读写飞快?
Redis就是干这个的。全名叫Remote Dictionary Server,说白了就是一个基于内存的键值存储系统。它把数据存在内存里,所以读写速度能达到每秒十万甚至百万级别。嗯,这里要注意:它不是数据库的替代品,而是数据库前面的“缓冲层”。
我个人习惯把Redis看作一个“超级HashMap”。你往里面存个字符串、列表、集合,它都能搞定。而且它还支持数据持久化——就算服务器重启了,数据也不会丢。这一点,很多新手容易忽略。
2.2 Redis vs Memcached:到底选哪个?
很多同学问我:“老师,Memcached也是内存缓存,跟Redis有啥区别?”
我直接说结论:选Redis,别犹豫。为什么?看下面这张对比表你就明白了。
| 对比维度 | Redis | Memcached |
|---|---|---|
| 数据结构 | 支持字符串、列表、集合、有序集合、哈希等 | 仅支持字符串 |
| 持久化 | 支持RDB和AOF两种持久化方式 | 不支持持久化 |
| 主从复制 | 原生支持 | 不支持 |
| 事务支持 | 支持简单事务 | 不支持 |
| 内存使用效率 | 较高(有压缩机制) | 高(但功能单一) |
| 适用场景 | 缓存、队列、排行榜、分布式锁等 | 纯缓存场景 |
我在项目中遇到过这样一个坑:用Memcached做缓存,结果服务器宕机,所有缓存数据全丢了。数据库瞬间被打爆。后来换成Redis,开启了AOF持久化,重启后缓存自动恢复,再也没出过类似问题。
说白了,Memcached能做的,Redis都能做。但Redis能做的,Memcached不一定行。你想想看,一个支持列表、集合、发布订阅的缓存工具,是不是比一个只能存字符串的“高级Map”香多了?
核心结论:新项目直接上Redis。老项目如果只用纯字符串缓存,Memcached还能凑合用。但如果你需要做排行榜、消息队列、分布式锁,Redis是唯一选择。
2.3 Redis安装与启动:手把手带你搞定
安装Redis其实很简单。我以Linux环境为例,Windows用户可以用WSL或者Docker。
2.3.1 从源码安装(推荐)
# 下载源码
wget https://download.redis.io/releases/redis-7.0.12.tar.gz
# 解压
tar xzf redis-7.0.12.tar.gz
# 进入目录
cd redis-7.0.12
# 编译
make
# 安装到系统
make install
编译完成后,你会看到几个关键文件:redis-server(服务端)、redis-cli(客户端)、redis.conf(配置文件)。
2.3.2 用包管理器安装(省事)
# Ubuntu/Debian
sudo apt-get install redis-server
# CentOS/RHEL
sudo yum install redis
# macOS
brew install redis
我个人习惯用源码安装。为什么?因为可以指定安装路径,方便管理多个版本。有一次我在生产环境用apt安装,结果版本太旧,不支持某个新特性,折腾了半天才升级。从那以后,我都是源码编译了。
2.3.3 启动Redis
# 前台启动(调试用)
redis-server
# 后台启动(生产用)
redis-server /path/to/redis.conf &
# 或者用systemd管理
sudo systemctl start redis
sudo systemctl enable redis # 开机自启
小技巧:第一次启动时,建议用前台模式。这样你能看到启动日志,确认有没有报错。等确认没问题了,再切到后台模式。
2.3.4 验证是否启动成功
# 用客户端连接
redis-cli
# 测试一下
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
看到PONG就说明Redis跑起来了。默认端口是6379,这个端口号有点意思——是手机键盘上“MERZ”对应的数字。据说这是Redis作者喜欢的意大利女歌手的名字。
2.4 Redis基本配置:这些参数你必须知道
Redis的配置文件是redis.conf。我挑几个最常用的参数讲讲,其他的你用到再查。
2.4.1 网络配置
# 绑定IP,默认只允许本机访问
bind 127.0.0.1
# 如果需要远程访问,改成0.0.0.0
# bind 0.0.0.0
# 端口号
port 6379
# 保护模式,建议开启
protected-mode yes
警告:千万不要在生产环境把bind设为0.0.0.0还不设密码!我曾经见过一个团队,Redis直接暴露在公网上,结果被黑客植入挖矿程序,CPU跑满100%。血的教训啊。
2.4.2 安全配置
# 设置密码
requirepass your_strong_password_here
# 重命名危险命令(防止误操作)
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
设置密码后,客户端连接时需要认证:
redis-cli -a your_strong_password_here
2.4.3 内存管理
# 最大内存限制,建议设为物理内存的70%
maxmemory 2gb
# 内存淘汰策略
# volatile-lru:从设置了过期时间的key中淘汰最近最少使用的
# allkeys-lru:从所有key中淘汰最近最少使用的
# volatile-ttl:从设置了过期时间的key中淘汰即将过期的
# noeviction:不淘汰,内存满时写入报错
maxmemory-policy allkeys-lru
你想想看,如果不设置maxmemory,Redis会一直吃内存,直到系统OOM。我建议至少留30%的内存给操作系统和其他进程。
2.4.4 持久化配置
# RDB持久化(快照)
save 900 1 # 900秒内至少1个key变化,就保存
save 300 10 # 300秒内至少10个key变化,就保存
save 60 10000 # 60秒内至少10000个key变化,就保存
# AOF持久化(追加日志)
appendonly yes
appendfsync everysec # 每秒同步一次
我的建议:生产环境同时开启RDB和AOF。RDB用于快速恢复,AOF保证数据不丢。但要注意,AOF文件会越来越大,记得定期执行BGREWRITEAOF重写。
2.4.5 其他常用配置
# 日志文件
logfile /var/log/redis/redis.log
# 数据库数量,默认16个
databases 16
# 慢查询日志,超过100毫秒的查询会被记录
slowlog-log-slower-than 100000
2.5 验证配置是否生效
修改完配置文件后,重启Redis:
# 优雅关闭
redis-cli shutdown
# 重新启动
redis-server /path/to/redis.conf
然后用CONFIG GET命令查看配置:
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "2147483648"
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "your_strong_password_here"
嗯,到这里,Redis的安装和基本配置就搞定了。下一章我们会深入Redis的五大数据结构,到时候我会分享一些实战中的骚操作。
课后练习:动手装一个Redis,修改配置文件,设置密码和内存限制。然后用redis-benchmark工具压测一下,看看你的机器能跑多少QPS。