Redis User Guide

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 发行版配置文件位置如下:

操作系统及版本 位置
Ubuntu 16.04+ /etc/redis/redis.conf

redis.conf

项目 功能 参考示例
maxmemory 最大可用内存 384mb/5gb

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 第三 Sentinel Sentinel
prd-redis-01-02 Redis 初始主节点 Redis, Sentinel, twemproxy
prd-redis-01-03 Redis 初始从节点 Redis, Sentinel, twemproxy

配置清单

实例名 IP 服务 侦听地址及端口
prd-redis-01-01 10.16.0.1 Sentinel 0.0.0.0:26379
prd-redis-01-02 10.16.0.2 Redis 0.0.0.0:16379
Sentinel 0.0.0.0:26379
twemproxy 0.0.0.0:6379
prd-redis-01-03 10.16.0.3 Redis 0.0.0.0:16379
Sentinel 0.0.0.0:26379
twemproxy 0.0.0.0:6379
# prd-redis-01-01

sudo apt-get install -y redis-sentinel
sudo systemctl disable redis-server

三机高可用(通过代理)

Sentinel + twemproxy

实例名 作用 安装软件
prd-redis-01-01 Redis 主节点 Redis, Redis Sentinel, twemproxy
prd-redis-01-02 Redis 从节点 Redis, Redis Sentinel, twemproxy
prd-redis-01-03 Redis 从节点 Redis, Redis 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。

Author: liuxun
liuxun's picture
Updated: 2023/02/04