Redis介绍
Remote Dictionary Server
(远程字典服务器)- 是一款高性能的
(Key/Values)
分布式内存数据库 - 支持数据持久化(定期把内存里数据存储到硬盘)
- 支持多种数据类型
- 支持
master-slave
模式数据备份
安装软件
源码编译安装
tar -xzvf redis-4.0.8.tar.gz
cd redis-4.0.8
make
make install
初始化配置
配置服务运行参数
- 端口:
6379
- 主配置文件:
/etc/redis/6379.conf
- 日志文件:
/var/log/redis_6379.log
- 数据库目录:
/var/lib/redis/6379
- 服务启动程序:
/usr/local/bin/redis-server
- 命令行连接命令:
/usr/local/bin/redis-cli
./utils/install_server.sh
管理服务
/etc/init.d/redis_6379 stop # 停止服务
/etc/init.d/redis_6379 start # 启动服务
ps -C redis-server # 查看进程
netstat -tunlp | grep :6379 # 查看端口
连接服务
访问redis
服务,redis-cli
默认连接本机的redis
服务
redis-cli
>ping
>keys * # 列出所有变量
>set name bob # 存数据
>get name # 取数据
>exit # 断开连接
常用命令
set key value
# 存储一个值mset key value key value ..
# 存储多个值get key
# 获取key值mget
# 获取多个值select index
# 切换库默认0,范围1-15keys name
# 获取指定key名exists key
# 测试变量是否存在ttl key
# 查看key生存时间(1为永不过期)expire key time(s)
# 设置key生存时间del key
# 删除keytype key
# 查看key类型(set存储的数据为string)lpush key item item item
# 存储数组move key db
# 将当前库的key移动到指定数据库flushdb
# 删除所在库的所有keyflushall
# 删除内存里所有keysave
# 保存数据shutdown
#停止服务
配置文件解析
配置分类:
名称 | 说明 |
---|---|
NETWORK | 网络 |
GENERAL | 常规 |
SNAPSHOTTING | 快照 |
REPLICATION | 复制 |
SECURITY | 安全 |
CLIENTS | 客户端 |
MEMORY MANAGEMENT | 内存管理 |
数据单位 |
1k==1000bytes
1kb==1024bytes
.. .. ..
常用配置
port 6379
端口bind IP
IP地址daemonize yes
守护进程方式运行databases 16
数据库个数logfile /var/log/redis_6379.log
日志文件maxclients 10000
并发连接数量dir /var/lib/redis/6379
数据库目录
内存管理
-
内存清除策略
volatile-lru
最近最少使用(针对设置了TTL的key)allkeys-lru
删除最少使用的key(针对所有的key)allkeys-lfu
从所有key中清除使用频率最少的keyvolatile-lfu
从所有配置了过期时间的key中清除使用频率最少的keyvolatile-random
在设置了TTL的key里随机移除allkeys-random
随机移除keyvolatile-ttl (minor TTL)
移除最近过期的keynoeviction
不删除
-
优化设置
maxmemory-policy noeviction
定义使用策略maxmemory
最大内存maxmemory-samples
选取key模板的个数(针对lru和ttl策略),定义最近最少使用的标准
连接密码
requirepass 123456
连接
redis-cli -h IP -p port
>auth 123456
部署LNMP+Redis服务
- 部署LNMP环境
- 配置支持redis
- 部署redis服务
- 安装php扩展(php-redis)
yum -y install php php-devel
rpm -q autoconf automake
tar -zxvf php-redis-2.2.4.tar.gz
cd phpredis-2.2.4/
phpize # 生成配置文件php-config及configure命令
./configure --with-php-config=/usr/bin/php-config
make
make install
- 修改配置文件
# vim /etc/php.ini
728: extension_dir = "目录名"; # 模块目录
730: extension = "模块名"; # 模块名
- 重启php-redis服务
Redis集群
集群环境
- redis服务器6台
- 管理主机1台
- 客户端1台
IP地址规划
- client:192.168.4.50
- redisA:192.168.4.51:6351
- redisB:192.168.4.52:6352
- redisC:192.168.4.53:6353
- redisD:192.168.4.54:6354
- redisE:192.168.4.55:6355
- redisF:192.168.4.56:6356
- MGM:192.168.4.57
工作原理
graph TB
A(object1)-->B((CRC16算法))
C(object2)-->B
D(object3)-->B
E(object4)-->B
F(object5)-->B
G(object6)-->B
B-->H(slot 0--5460)
B-->I(slot 5461--10922)
B-->J(slot 10923--16383)
H-->K(Node1:object1,object2)
I-->L(Node2:object3,object4)
J-->M(Node3:object5,object6)
解释:一个Redis
集群包含16384
个哈希槽(hash slot)
,数据库中的每个键都属于这16384
个哈希槽的其中一个,集群使用公式CRC16(key) % 16384
来计算键key
属于哪个槽,其中CRC16(key)
语句用于计算键 key
的CRC16
校验和,集群中的每个节点负责处理一部分哈希槽。
创建集群
- 部署管理主机(也可以部署在任意一台
redis
服务器上)- 部署
ruby
脚本运行环境 - 创建管理集群脚本
redis-trib.rb
- 部署
yum -y install rubygems ruby
gem install redis-3.2.1.gem
mkdir /root/bin # 创建命令检索目录
tar -xzvf redis-4.0.8.tar.gz
cp redis-4.0.8/src/redis-trib.rb /root/bin/ # 创建管理集群脚本
chmod +x /root/bin/redis-trib.rb
redis-trib.rb help # 查看命令帮助
redis-trib
脚本
redis-trib.rb <command> <options> <arguments ...>
命令 | 描述 |
---|---|
create | 创建集群 |
check | 检查集群 |
info | 查看集群信息 |
reshard | 重新分片 |
del-node | 删除主机 |
add-node --slave | 添加slave 主机 |
add-node | 添加master 主机 |
rebalance | 平均分配hash slots |
- 配置
6
台redis
服务器- 启用集群功能
- 查看服务信息
# vim /etc/redis/6379.conf
luster-enabled yes # 启用集群功能
cluster-config-file nodes-6379.conf # 存储集群信息文件
cluster-node-timeout 5000 # 超时时间(单位毫秒)
/etc/init.d/redis_6379 restart # 重启服务
netstat -tunlp | grep redis-server
# 集群通信端口:默认服务端口+10000
- 创建集群
redis-trib.rb create --replicas 1 \ # replicas 定义从服务器个数
192.168.4.51:6351 192.168.4.52:6352 \
192.168.4.53:6353 192.168.4.54:6354 \
192.168.4.55:6355 192.168.4.56:6356
- 查看集群信息(在管理主机查看)
# redis-trib.rb info ip地址:端口 # 查看集群信息
redis-trib.rb info 192.168.4.53:6353
# 检查集群详细信息
redis-trib.rb check 192.168.4.51:6351
# 在每一台redis服务器本机查看
redis-cli -h 192.168.4.51 -p 6351
> cluster info # 查看集群信息
>cluster nodes # 查看集群节点信息
- 访问集群
- 在客户端可以连接集群中任意一台
redis
服务器 - 命令格式:
redis-cli -c -h ip地址 -p 端口号
- 选项:
-c
集群模式
- 在客户端可以连接集群中任意一台
redis-cli -c -h 192.168.4.56 -p 6356
> set school tarena # 存数据
> get school # 取数据
管理集群
测试集群功能
故障切换测试
- 停止
master
主机的redis
服务master
宕机后对应的slave
自动被选举为master
- 原
master
启动后会自动配置为当前master
的slave
- 检测集群
- 在管理主机查看信息
redis-trib.rb check 192.168.4.52:6352
redis-trib.rb info 192.168.4.52:6352
添加服务器
添加master
服务器
- 部署一台新的
redis
服务器(运行服务并启用集群配置) - 添加
master
主机步骤- 添加
master
主机 - 分配hash槽
(slots)
- 添加
- 添加
master
主机- 添加时不指定主机角色,默认新主机被选为
master
- 添加的
master
主机,需手动分配solts
(槽)
- 添加时不指定主机角色,默认新主机被选为
redis-trib.rb add-node 192.168.4.58:6358 192.168.4.51:6351
- 重新分片
- 移出
hash
槽个数 - 接收
hash
槽主机ID
- 移出
hash
槽主机ID
- 同意配置
- 移出
redis-trib.rb reshard 192.168.4.51:6351 # 重新分片
How many slots do you want to move(from 1 to 16384)?4096
What is the receiving node ID?
ID值
Source node #1:all
Do you want to proceed with the proposed reshard plan(yes/no)? yes
添加slave服务器
- 部署一台新
redis
服务器(运行服务并启用集群配置) - 添加
slave
主机
redis-trib.rb add-node --slave [--master-id id值] ip地址:端口 192.168.4.51:6351
# 如果不指定主节点的id值,会把新节点随机添加为从节点最少的主库
移除服务器
- 移除
slave
主机- 从服务器没有
hash
槽,直接移除即可 - 移除时指定从服务器
id
值
- 从服务器没有
redis-trib.rb del-node 192.168.4.51:6351 \
f689h22f2oq29fqpofpqufh923hfqijn
- 移除
master
服务器- 释放占用的
hash
槽 - 移除
master
主机
- 释放占用的
redis-trib.rb reshard 192.168.4.51:6351 # 重新分片
How many slots do you want to move(from 1 to 16384)?4096
What is the receiving node ID?
fwfhui9d893rodnponcaphf
Source node #1:hdqwio3hr7q237fhqpwfqiwn37
Source node #2:done
Do you want to proceed with the proposed reshard plan(yes/no)? yes
# 移除master主机
redis-trib.rb del-node 192.168.4.51:6351 \
hdqwio3hr7q237fhqpwfqiwn37
主从复制
主从复制结构模式:
一主一从、一主多从、主从从
主从复制工作原理
- slave向master发送sync命令
- master启动后台存盘进程,并收集所有修改数据命令
- master完成后台存盘后,传送整个数据文件到slave
- slave接收数据文件,加载到内存中完成首次完全同步
- 后续有新数据产生时,master继续收集数据修改命令依次传给slave,完成同步
配置主从复制
拓扑结构:一主一从
配置从库(redis服务运行后,默认都是master服务器)
redis-cli -h ip:端口
> info replication # 查看复制信息
# Replication
role: # 角色
master_host: # 主库ip地址
master_port: # 主库端口号
master_link_status: # 与主库连接状态
redis-cli -h 192.168.4.52
# slaveof 主库IP地址 端口号
> slaveof 192.168.4.51 6351 # 命令行配置
# vim /etc/redis/6379.conf
slaveof 192.168.4.51 6351 # 永久配置
反客为主(将从库恢复为主库)
redis-cli -h 192.168.4.52
slaveof no one # 命令行临时设置
# vim /etc/redis/6379.conf
# slaveof 192.168.4.51 6351
配置带验证的主从复制
配置master:
设置连接密码,重启服务
sed -n '501p' /etc/redis/6379.conf
requirepass 123456 # 定义连接密码
配置slave:
设置连接密码。重启服务
# vim +289 /etc/redis/6379.conf
masterauth 123456 # 主库密码
哨兵服务
哨兵服务介绍:
- 监视master服务器
- 发现master宕机后,将从服务器升级为主服务器
- 主配置文件:sentinel.conf
- 模板文件:redis-4.0.8/sentinel.conf
graph TB
A(master:51)-->B(哨兵:57)
C(slave:52)-->B
配置哨兵服务
- 安装redis软件
- 创建主配置文件
- 启动哨兵服务
# vim /etc/sentinel.conf
# sentinel monitor 主机名 ip地址 端口 票数
setinel monitor server51 192.168.4.51 6351 1
bind 0.0.0.0 # 服务地址
sentinel auth-pass server51 123456 # 连接服务密码
redis-sentinel /etc/sentinel.conf # 启动服务
持久化
RDB
RDB介绍(redis数据库文件,全称Redis Database)
- 数据持久化方式之一
- 数据持久化默认方式
- 按照指定时间间隔,将内存中的数据集快照写入硬盘
定义RDB文件名
dbfilename "dump.rdb" # 文件名
使用RDB文件恢复数据
- 备份数据(备份dump.rdb文件到其他位置)
cp 数据库目录/dump.rdb 备份目录
- 恢复数据(拷贝备份文件到数据库目录,启动redis服务)
cp 备份目录/dump.rdb 数据库目录/
优化设置
- 数据从内存保存到硬盘的频率
save 900 1
# 15分钟且有一个key
改变即存盘save 300 10
# 5分钟且有10个key
改变即存盘save 60 10000
# 1分钟且有10000个key
改变即存盘
- 手动存盘
save
# 阻塞写存盘bgsave
# 不阻塞写存盘
RDB优点:
- 高性能的持久化实现—创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件;过程中主进程不做任何IO操作
- 比较适合大规模数据恢复,且多数据完整性要求不是非常高的场合
RDB缺点:
- 意外宕机时,丢失最后一次持久化的所有数据
AOF
AOF介绍(Append Only File)
- 追加方式记录写操作的文件
- 记录redis服务所有写操作
- 不断的将新的写操作,追加到文件的末尾
- 默认没有启用
- 使用cat命令可以查看文件内容
启用AOF
> config set appendonly yes # 启用
> config rewrite # 写进配置文件
使用AOF文件恢复数据
- 备份数据(备份appendonly.aof文件到其他位置)
cp 数据库目录/appendonly.aof 备份目录
- 恢复数据(拷贝备份文件到数据库目录,启动redis服务)
cp 备份目录/appendonly.aof 数据库目录
优化配置
- 定义文件名
appendonly yes # 启用aof,默认no
appendefilename "appendonly.aof" # 指定文件名
- AOF文件记录写操作的方式
appendfsync always # 时时记录,并完成磁盘同步
appendfsync everysec # 每秒记录一次,并完成磁盘同步
appendfsync no 写入aof,不执行磁盘同步
- 日志文件会不断增大,何时触发日志重写?
auto-aof-rewrite-min-size 64mb # 首次重写触发值
auto-aof-rewrite-percentage 100 # 再次重写,增长百分比
- 修复AOF文件(把文件恢复到最后一次的正确操作)
redis-check-aof --fix appendonly.aof
AOF优点
- 可以灵活设置持久化方式
- 出现意外宕机时,仅可能丢失1秒的数据
AOF缺点
- 持久化文件的体积通常会大于RDB方式
- 执行fsync策略时的速度可能会比RDB方式慢
数据类型
String字符串
字符串操作
set key value [ex seconds] [px milliseconds] [nx|xx]
:设置key及值,过期时间可以使用秒或毫秒为单位setrange key sffset value
:从偏移量开始复写key的特定位的值
set first "hello world"
setrange first 6 "Redis" # 改写为hello Redis
strlen key
:统计字符串长度
strlen first
append key value
:存在则追加,不存在则创建key及value,返回key长度setbit key offset value
- 对key所存储字符串,设置或清除特定偏移量上的位(bit)
- value值可以为1或0,offset为0–2^32之间
- key不存在,则创建新key
setbit bit 0 1 # 设置bit第0位为1
setbit bit 1 0 # 设置bit第1位为0
bitcount key
:统计字符串中被设置为1的比特位数量
setbit bits 0 1
setbit bits 3 1
bitcount bits # 结果为2
# 场景说明:记录网站用户上线频率
decr key
:将key中的值减1,key不存在则先初始化为0,再减1decrby key decrement
:将key中的值,减去decrementget key
:返回key存储的字符串值,若key不存在则返回null;若key的值不是字符串,则返回错误,get只能处理字串getrange key start end
:返回字串值中的子字串,截取范围为start和end;负数偏移量表示从末尾开始计数,-1表示最后一个字符,-2表示倒数第二字符incr key
:将key的值加1,如果key不存在,则初始化为0后再加1;主要应用为计数器incrby key increment
:将key的值增加incrementincrbyfloat key increment
:为key中所储存的值加上浮点数增量incrementmget key [key...]
:获取一个或多个key的值,空格分隔,具有原子性mset key value [key value...]
:设置多个key及值,空格分隔,具有原子性
List列表
List列表简介
- Redis的list是一个字符队列
- 先进后出
- 一个key可以有多个值
List列表操作
lpush key value [value...]
:将一个或多个值value插入列表key的表头;key不存在,则创建key
lpush list a b c
lrange list key start stop
:从开始位置读取key的值到stop结束
lrange list 0 2
lrange list 0 -1
lrange list 0 -2
lpop key
:移除并返回列表头元素数据,key不存在则返回nilllen key
:返回列表key的长度lindex key index
:返回列表中第index个值
lindex key 0
lindex key -2
lset key index value
:将key中index位置的值修改为valuerpush key value [value...]
:将value插入到key的末尾rpop key
:删除并返回key末尾的值
Hash表
Hash表简介
Redis hash
- 是一个string类型的field和value的映射表
- 一个key可对应多个field,一个field对应一个value
- 将一个对象存储为hash类型,较于每个字段都存储成string类型更能节省内存
Hash表操作
hset key field value
:将hash表中field值设置为value
hset site google 'www,g.cn'
hget key field
:获取hash表中field的值
hget site google
hmset key field value [field value...]
:同时给hash表中的多个field赋值hmget key field [field...]
:返回hash表中的多个field的值hkeys key
:返回hash表中所有field名称hgetall key
:返回hash表中所有的field的值hvals key
:返回hash表中所有field的值hdel key field [field...]
:删除hash表中多个field的值,不存在则忽略