部署Redis服务

24 篇文章 0 订阅
7 篇文章 0 订阅
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-15
  • keys name # 获取指定key名
  • exists key # 测试变量是否存在
  • ttl key # 查看key生存时间(1为永不过期)
  • expire key time(s) # 设置key生存时间
  • del key # 删除key
  • type key # 查看key类型(set存储的数据为string)
  • lpush key item item item # 存储数组
  • move key db # 将当前库的key移动到指定数据库
  • flushdb # 删除所在库的所有key
  • flushall # 删除内存里所有key
  • save # 保存数据
  • 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中清除使用频率最少的key
    • volatile-lfu 从所有配置了过期时间的key中清除使用频率最少的key
    • volatile-random 在设置了TTL的key里随机移除
    • allkeys-random 随机移除key
    • volatile-ttl (minor TTL) 移除最近过期的key
    • noeviction 不删除
  • 优化设置

    • maxmemory-policy noeviction 定义使用策略
    • maxmemory 最大内存
    • maxmemory-samples 选取key模板的个数(针对lru和ttl策略),定义最近最少使用的标准

连接密码

requirepass 123456

连接

redis-cli -h IP -p port
>auth 123456
部署LNMP+Redis服务
  1. 部署LNMP环境
  2. 配置支持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
  1. 修改配置文件
# vim /etc/php.ini
728: extension_dir = "目录名"; # 模块目录
730: extension = "模块名"; # 模块名
  1. 重启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) 语句用于计算键 keyCRC16校验和,集群中的每个节点负责处理一部分哈希槽。

创建集群
  • 部署管理主机(也可以部署在任意一台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
  • 配置6redis服务器
    • 启用集群功能
    • 查看服务信息
# 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启动后会自动配置为当前masterslave
  • 检测集群
    • 在管理主机查看信息
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
    1. 对key所存储字符串,设置或清除特定偏移量上的位(bit)
    2. value值可以为1或0,offset为0–2^32之间
    3. 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,再减1
  • decrby key decrement:将key中的值,减去decrement
  • get 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的值增加increment
  • incrbyfloat key increment:为key中所储存的值加上浮点数增量increment
  • mget 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不存在则返回nil
  • llen key:返回列表key的长度
  • lindex key index:返回列表中第index个值
lindex key 0
lindex key -2
  • lset key index value:将key中index位置的值修改为value
  • rpush 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的值,不存在则忽略
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值