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。