
Redis 用户指引
常用命令
使用 redis-cli 可以连接 Redis 服务器检查状态或确认 Cache 的内容。Redis 命令可以在 redis-cli 交互环境下运行,也可以作为 redis-cli 的命令行参数直接运行。
查询命令
KEYS * # 列出所有 Cache ID
TYPE <Cache ID> # 检查 Cache 内容的类型。
HGETALL <Cache ID> # 查看 Hash 类型 Cache
管理命令
brew services start redis # 启动 brew 安装得 redis
[redis-cli] ping # 查询节点状态,正常工作时返回 PONG
FLUSHALL # 刷新缓存
redis-cli KEYS 'key:00000n*' | xargs redis-cli DEL # 删除指定前缀 Key
redis-cli --scan --pattern key:00000n:* | xargs redis-cli DEL
基准测试命令
redis-benchmark 可以用来测试 Redis 服务器性能:
# 压测:200 客户端、1024 字节数据、set 命令、0-10W 随机生成 Key、连续发送 10W 指令
redis-benchmark -c 200 -d 1024 -t set -r 100000 -n 100000
常用配置
Redis 的配置可以通过 redis-cli 用 CONFIG SET 命令设置,然后用 CONFIG REWRITE 命令回写配置文件。也可以直接改写配置文件保存后重启 redis 服务生效。各 Linux 发行版配置文件位置如下:
redis.conf
Replication
SLAVEOF <Hostname> <Port> # 设置当前 Redis 节点为从节点,从指定的节点复制数据
SLAVEOF NO ONE # 设置当前 Redis 节点为主节点
INFO REPLICATION # 查看当前节点主从情况
Sentinel
Redis Sentinel 模式节点可用于监控主从模式 redis 节点,发生故障时主动完成主从节点切换。
Sentinel 启动后会在 sentinel.conf 里自动生成或更新 monitor、known-slave 和 known-sentinel 的配置,标识当前主节点、从节点和其他 sentinel 节点信息,并自动维护 redis.conf 中 slaveof 的当前值。节点配置需要手动改动时,monitor 的值需要更新到初始主节点,known-slave 和 known-sentinel 需要删除,让 Sentinel 启动时自动生成。
安装
# Ubuntu 16.04
sudo apt-get -y install redis-sentinel
常用命令
redis-cli -p 26379 #
INFO Sentinel # 查询 Sentinel 节点状态
twemproxy
通过 apt 安装的 twemproxy 还是半成品,需要手动补充启动文件及配置文件。
安装
# Ubuntu 16.04
sudo add-apt-repository -y ppa:twemproxy/stable
sudo apt-get update
sudo apt-get -y install twemproxy
配置
# 手动建立启动文件
sudo vim /lib/systemd/system/nutcracker.service
[Unit]
Description=nutcracker/nutcracker
After=network.target
[Service]
# 配置 Service 以 redis 用户运行
User=redis
Group=redis
PIDFile=/var/run/redis/nutcracker.pid
ExecStart=/usr/sbin/nutcracker -c /etc/redis/nutcracker.yaml -p /var/run/redis/nutcracker.pid -o /var/log/redis/nutcracker.log
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /var/run/redis/nutcracker.pid
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/var/run/redis
ReadWriteDirectories=-/etc/redis
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
# 设置 twemproxy 启动加载
sudo systemctl enable nutcracker.service
# 建立 twempower 配置文件,所有主节点放在 servers 项目下
# 该文件 owner 需要指定为 redis,Sentinel 在做故障转移时需要修改主节点信息
sudo vim /etc/redis/nutcracker.yaml
prd-redis-01:
listen: 0.0.0.0:6379
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 10.9.23.6:16379:1 # IP of master node.
# 允许 Redis Rentinel 故障切换时更新主节点信息
sudo chown redis:redis /etc/redis/nutcracker.yaml
# 建立主节点故障切换 nutcracker 配置更新脚本
sudo vim /etc/redis/nutcracker.yaml.sh
#!/bin/bash
master_old_ip="$4"
master_old_port="$5"
master_new_ip="$6"
master_new_port="$7"
logger "+++++ $0 +++++"
logger "+++++" $1 $2 $3 ${master_old_ip} ${master_old_port} ${master_new_ip} ${master_new_port}
tmp_yaml='/var/lib/redis/nutcracker.yaml'
conf_yaml='/etc/redis/nutcracker.yaml'
rm -f $tmp_yaml
#sed "s/${master_old_ip}:${master_old_port}/${master_new_ip}:${master_new_port}/" /etc/nutcracker/nutcracker.yaml > $tmp_yaml
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "${line//$master_old_ip:$master_old_port/$master_new_ip:$master_new_port}" >> $tmp_yaml
done < /etc/redis/nutcracker.yaml
cp -f $tmp_yaml $conf_yaml
killall nutcracker
/usr/sbin/nutcracker -c /etc/redis/nutcracker.yaml -p /var/run/redis/nutcracker.pid -o /var/log/redis/nutcracker.log &
exit 0
常见用例
各种高频存取数据都可以放在 Redis 中:
PHP 存放 Session
PHP 可以使用 Redis 处理 Session,激活 php-redis 库后在 PHP.ini 文件中修改以下两项配置,session 数据即会存于 Redis:
session.save_handler = redis
session.save_path = "tcp://localhost:6379?auth=<PASSWORD>"
Drupal 使用自定义类处理 Session,不受 php.ini 控制。如果需要使用 Redis 管理 Drupal Session,请安装 Session Proxy 模块,并参考以下设置。
为 Drupal 提供 Cache
安装 Redis 插件后,通过 settings.php 文件添加以下配置,启用 Redis 处理 Cache(注意 Redis 插件实际安装的位置):
$conf['redis_client_interface'] = 'PhpRedis';
$conf['redis_client_host'] = ''; # 设置服务器域名或 IP。
$conf['redis_client_port'] = 6379;
$conf['redis_client_password'] = ''; # 设置 Redis 连接密码。
$conf['lock_inc'] = 'sites/all/modules/contrib/redis/redis.lock.inc'; # 按 Redis 插件安装路径填写。
$conf['path_inc'] = 'sites/all/modules/contrib/redis/redis.path.inc';
$conf['cache_backends'][] = 'sites/all/modules/contrib/redis/redis.autoload.inc';
$conf['cache_default_class'] = 'Redis_Cache';
$conf['cache_prefix'] = 'xxx_xyz'; # 设置缓存前缀。
#$conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
$conf['cache_class_cache'] = 'Redis_Cache';
$conf['cache_class_cache_admin_menu'] = 'Redis_Cache';
$conf['cache_class_cache_block'] = 'Redis_Cache';
$conf['cache_class_cache_bootstrap'] = 'Redis_Cache';
$conf['cache_class_cache_entity_comment'] = 'Redis_Cache';
$conf['cache_class_cache_entity_field_collection_item'] = 'Redis_Cache';
$conf['cache_class_cache_entity_file'] = 'Redis_Cache';
$conf['cache_class_cache_entity_node'] = 'Redis_Cache';
$conf['cache_class_cache_entity_og_membership'] = 'Redis_Cache';
$conf['cache_class_cache_entity_og_membership_type'] = 'Redis_Cache';
$conf['cache_class_cache_entity_profile2'] = 'Redis_Cache';
$conf['cache_class_cache_entity_registration'] = 'Redis_Cache';
$conf['cache_class_cache_entity_registration_state'] = 'Redis_Cache';
$conf['cache_class_cache_entity_registration_type'] = 'Redis_Cache';
$conf['cache_class_cache_entity_taxonomy_term'] = 'Redis_Cache';
$conf['cache_class_cache_entity_taxonomy_vocabulary'] = 'Redis_Cache';
$conf['cache_class_cache_entity_user'] = 'Redis_Cache';
$conf['cache_class_cache_features'] = 'Redis_Cache';
$conf['cache_class_cache_field'] = 'Redis_Cache';
$conf['cache_class_cache_filter'] = 'Redis_Cache';
$conf['cache_class_cache_form'] = 'Redis_Cache';
$conf['cache_class_cache_image'] = 'Redis_Cache';
$conf['cache_class_cache_libraries'] = 'Redis_Cache';
$conf['cache_class_cache_menu'] = 'Redis_Cache';
$conf['cache_class_cache_page'] = 'Redis_Cache';
$conf['cache_class_cache_path'] = 'Redis_Cache';
$conf['cache_class_cache_rules'] = 'Redis_Cache';
$conf['cache_class_cache_sessions'] = 'Redis_Cache';
$conf['cache_class_cache_token'] = 'Redis_Cache';
$conf['cache_class_cache_update'] = 'Redis_Cache';
$conf['cache_class_cache_variable'] = 'Redis_Cache';
$conf['cache_class_cache_views'] = 'Redis_Cache';
$conf['cache_class_cache_views_data'] = 'Redis_Cache';
# 用 Redis 管理 Drupal Sessions
$conf['session_inc'] = 'sites/all/modules/contrib/session_proxy/session.inc';
$conf['session_storage_force_default'] = FALSE;
$conf['session_storage_class'] = 'SessionProxy_Storage_Cache';
$conf['session_storage_options']['cache_backend'] = 'Redis_Cache';
在 Performance 页(/admin/config/development/performance)设置 Cache 有效时间,Minimum cache lifetime 为 Cache 失效时间,设置过短,用户会自动登出系统。
主从高可用
主从双 redis 节点 + 三 Sentinel 节点组高可用 redis 服务,点击这里查看详情。
主从高可用(通过代理)
一主一从,双机通过 twemproxy 接入 VIP/LB,twemproxy 通过本机 Sentinel 维护,始终代理 redis 主节点。额外准备一台服务器部署 Sentinel,保持 Sentinel 节点数为奇数,实现 redis 主节点监控及故障转移。
配置清单
# prd-redis-01-01
sudo apt-get install -y redis-sentinel
sudo systemctl disable redis-server
三机高可用(通过代理)
Sentinel + twemproxy
Redis 配置
# prd-redis-01-01
sudo vim /etc/redis/redis.conf
bind 0.0.0.0 # 找到 bind 指令,修改 redis 为局域网内可访问
sudo vim /etc/redis/sentinel.conf
bind 0.0.0.0 # 找到 bind 指令,修改 sentinel 为局域网内可访问
# prd-redis-01-02
SLAVEOF prd-redis-01-01 6379 # 设置当前 redis 为 1 号机从节点
# prd-redis-01-03
SLAVEOF prd-redis-01-01 6379
Redis Sentinel 配置
# 主节点故障 2 秒后做主从切换
sentinel down-after-milliseconds prd-galera-01 2000
INFO REPLICATION # 查看当前服务器,主从复制中的角色
常见错误
OOM command not allowed
RedisException: OOM command not allowed when used memory > 'maxmemory'
解决方法
设置 maxmemory_policy,如:volatile-lfu。