Redis企业级实战

1.Redis简介

1.Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储,NoSQL数据库产品;

2.Redis采用内存(ln-Memory)数据集(Dateset)。

3.支持多种数据类型

4.运行大多数POSIX系统,如Linux,*BSD,OS X等

官网链接地址:https://redis.io/

下载地址:http://download.redis.io/releases/

1.2功能特点

高速读写
数据类型丰富
支持持久化
多种内存分配及回收策略
支持事务
消息队列、消息订阅
支持高可用
支持分布式分片集群
Memcached:
优点:高性能读写,单一数据类型、支持客户端式分布式集群、一致性hash
缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高

Redis:
优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高
缺点:多线程读写较Memcached慢

Tair:
优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式集群、支撑了几乎所有淘宝业务的缓存。
缺点:单机情况下,读写性能较其他两种产品较慢

2.Redis安装部署

下载软件包
~]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz
#添加磁盘,非必须
~]# mkfs.ext4 /dev/sdb
~]# mkdir /nosql
~]# mount /dev/sdb /nosql/
~]# blkid
~]# vim /etc/fstab
UUID="edfd4148-4444-41e6-b2c2-c8175cb260ff"  /nosql   ext4    defaults        0 0
解压
~]# tar xvf redis-3.2.12.tar.gz -C /usr/local/
重命名
~]# cd /usr/local/
~]# mv redis-3.2.12 redis
cd redis/
yum install -y gcc
make MALLOC=libc
#启动
src/redis-server &
#设置环境变量
echo "export PATH=$PATH:/nosql/redis/src" >>/etc/profile
source /etc/profile
#连接redis
redis-cli

3.Redis基本管理操作

3.1基础配置文件介绍

#关闭redis
~]# redis-cli 
127.0.0.1:6379> SHUTDOWN

mkdir /nosql/6379

[root@linux-node1 ~]# vim /nosql/6379/redis.conf
daemonize yes          #守护进程的模式启动
port 6379              #端口
logfile /nosql/6379/redis.log  #日志文件
dir /nosql/6379        #持久化数据文件的位置
dbfilename dump.rdb    #RDB持久化数据文件

#启动redis
~]# redis-server /nosql/6379/redis.conf
[root@linux-node1 ~]# redis-cli 
127.0.0.1:6379> set foo bar  #设置一个键值对
OK
127.0.0.1:6379> get foo
"bar"

3.2安全配置

#禁止protected-mode
protected-mode yes/no    (保护模式,是否允许本地访问)
#bind
bind 0.0.0.0 127.0.0.1   (指定IP进行监听)
#添加requirepass(password)
requirepass root
#登录
redis-cli -a root

3.3在线修改配置

CONFIG GET *
CONFIG GET requirepass
CONFIG SET requirepass 123456

3.4Redis持久化

RDB持久化:
   可以在指定时间间隔内生成数据集的时间点快照(point-in-time snapshot)
   优点:速度快,适合于做备份,主从复制也是基于RDB持久化功能实现的
   缺点:会有数据丢失
rdb持久化核心参数配置:
dir /nosql/6379
dbfilename dump.rdb
save 900 1
save 300 10
save 60  10000
#配置分别表示:
900秒(15分钟)内有一个更改
300秒(5分钟)内有10更改
60秒内有10000个更改

AOF持久化:
   记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
   AOF文件中的命令全部以Redis协议的格式来保存,新命令会被追加到文件的末尾。
   优点:可以最大程度保证数据不丢
   缺点:日志记录量级较大
AOF持久化配置
appendonly yes
appendfsync always   #触发条件
appendfsync everysec
appendfsync no

3.5数据类型

字符类型(String):微博数,粉丝数;计数器incr,反计数器decr 

set mykey "test"  为键设置新值,并覆盖原有值
GETSET mycounter 0 设置值,取值同时进行
MSET id 10 name zs age 21 gender m 同时设置多个值
计数器
127.0.0.1:6379> incr num
127.0.0.1:6379> INCRBY num 10000
(integer) 10003

字典类型(Hash)  用户信息
127.0.0.1:6379> HmSET stu id 101 name zs age 21 gender m
OK

列表(List) 消息队列系统 微博 朋友圈
LPUSH wechat "very good!"
LRANGE wechat 0 -1

集合(Set)
118.190.201.11:6379> SADD s s1 s2 s3
(integer) 3
118.190.201.11:6379> sadd t s2 s3 s4
(integer) 3
118.190.201.11:6379> SMEMBERS s
118.190.201.11:6379> SINTER s t #共同字符交集
118.190.201.11:6379> SUNION s t #并集
118.190.201.11:6379> SDIFF s t  #差集
118.190.201.11:6379> SINTERSTORE gtd s t
(integer) 2
118.190.201.11:6379> SMEMBERS gtd
1) "s3"
2) "s2"

有序集合(Sorted Set) 排行榜应用
118.190.201.11:6379> ZADD phb 1000 timian 2000 thatgirl 3000 hehe
(integer) 3
118.190.201.11:6379> ZREVRANGE phb 0 -1
1) "hehe"
2) "thatgirl"
3) "timian"
118.190.201.11:6379> ZREVRANGE phb 0 -1 withscores
1) "hehe"
2) "3000"
3) "thatgirl"
4) "2000"
5) "timian"
6) "1000"
118.190.201.11:6379> ZINCRBY phb 10000 timian
"11000"

4.消息模式

Redis发布模式通常有两种方式:
    队列模式(queuing)
    发布-订阅模式(publish-subscribe)
任务队列:顾名思义,就是"传递消息的队列"。与任务队列进行交互的实体有两类,一类是生产者(producer),另一类是消费者(customer)
生产者将需要处理的任务放入任务队列中,而消费者则不断从任务独立中读入任务消息并执行
任务队列的好处:
    松耦合
生产者和消费者只需按照约定的任务描述格式,进行编写代码
    易于扩展
多消费者模式下,消费者可以分布在多个不同的服务器中,由此降低单台服务器的负载
PSUBSCRIBE * 模糊订阅

4.1事务类型

118.190.201.11:6379> MULTI
OK
118.190.201.11:6379> set a b
QUEUED
118.190.201.11:6379> set b c
QUEUED
118.190.201.11:6379> EXEC
1) OK
2) OK
事务命令:
DISCARD #取消事务,放弃执行事务块内的所有命令
EXEC #执行所有事务块内的命令
MULTI #标记一个事务块的开始
UNWATCH #取消WATCH命令对所有key的监控
WATCH key [key ...] #监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断

事务锁机制:
窗口1
set ticket 1
watch ticket
MULTI
set ticket 0
窗口2
multi
set ticket 0
exec
窗口1
exec

5.主从复制

主从复制原理:
1.从服务器向主服务器发送SYNC命令
2.接到SYNC命令的主服务器会调用BGSAVE命令,创建一个RDB文件,并使用缓冲区记录接下来执行的所有写命令
3.当主服务器执行完BGSAVE命令时,它会向从服务器发送RDB文件,而从服务器则会接收并载入这个文件
4.主服务器将缓冲去存储的所有写命令发送给从服务器执行

5.1主从复制构建

主从数据一致性保证
min-slaves-to-write 1
min-slaves-max-lag 1 #指定网络延时的最大值

1.环境
准备两个或两个以上redis实例
mkdir -p /nosql/638{0..2}
[root@linux-node1 ~]# vim redsconf.sh 
#!/bin/bash
#
for i in 638{0..2};do
cat >/nosql/$i/redis.conf <<EOF
daemonize yes
port $i
pidfile /nosql/$i/redis.pid
loglevel notice
logfile /nosql/$i/redis.log
dir /nosql/$i
dbfilename dump.rdb
protected-mode no
EOF
done
for p in {0..2};do
redis-server /nosql/638$p/redis.conf
done
[root@linux-node1 ~]# sh redsconf.sh

主节点:6380
从节点:6381、6382
2.开启主从
6381/6382命令行
[root@linux-node1 ~]# redis-cli -p 6381
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
[root@linux-node1 ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF 127.0.0.1 6380

3.查询主从状态
INFO replication

4.从库切换为主库
slaveof no one

5.2Redis-sentinel哨兵

1.监控
2.自动选主,切换(6381 slaveof no one)
3.2号从库(6382)指向新主库(6381)

sentinel搭建过程
mkdir /nosql/26380
cd /nosql/26380
vim sentinel.conf
port 26380  #自定义
dir "/nosql/26380"
sentinel monitor mymaster 127.0.0.1 6380 1   #监控主库地址端口,至少多少台sentinel服务认为down了
sentinel down-after-milliseconds mymaster 5000  #5秒联系不上,认为主down了

启动:
redis-sentinel /nosql/26380/sentinel.conf &

sentinel管理命令
redis-cli -p 26380
PING
sentinel masters
sentinet slaves
sentinel get-master-addr-by-name

6.Redis cluster分布式集群

高性能:
1.在分布式节点中,将16384个槽位,均匀分布到多个分片节点中
2.存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16283之间)
3.根据计算得出的槽位值,找到相应对应的分片节点的主节点,存储到相应槽位上
4.如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储
高可用:
在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveoff的功能,同时当主节点down,实现类似于sentinel的自动failover的功能

1.安装集群插件
EPEL源安装ruby支持
yum install -y rubygems
gem sources -a http://mirrors.aliyun.com/rubygems/ --remove https://rubygems.org/
gem install redis -v 3.3.3
gem source -l

2.集群节点准备
#!/bin/bash
#
mkdir -p /nosql/700{0..5}
for i in 700{0..5};do
cat >/nosql/$i/redis.conf<<EOF
port $i
daemonize yes
pidfile /nosql/$i/redis.pid
loglevel notice
logfile "/nosql/$i/redis.log"
dbfilename dump.rdb
dir /nosql/$i
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
done
for p in 700{0..5};do
 redis-server /nosql/$p/redis.conf
done

3.将节点加入集群管理
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
说明:
--replicas 1一个主带了一个从
redis-cli -p 7000 cluster nodes|grep master
redis-cli -p 7000 cluster nodes|grep slave

4.添加节点
vim /nosql/7006/redis.conf
port 7006
daemonize yes
pidfile /nosql/7006/redis.pid
loglevel notice
logfile "/nosql/7006/redis.log"
dbfilename dump.rdb
dir /nosql/7006
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

vim /nosql/7007/redis.conf
port 7007
daemonize yes
pidfile /nosql/7007/redis.pid
loglevel notice
logfile "/nosql/7007/redis.log"
dbfilename dump.rdb
dir /nosql/7007
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

启动
redis-server /nosql/7006/redis.conf
redis-server /nosql/7007/redis.conf

添加主节点:
redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

转移slot(重新分片)
redis-trib.rb reshard 127.0.0.1:7000
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? cb56b3cd8fa62969288c27a592c2962297a3aebc
Source node #1:all

添加从节点
redis-trib.rb add-node --slave --master-id cb56b3cd8fa62969288c27a592c2962297a3aebc 127.0.0.1:7007 127.0.0.1:7000

6.1删除节点

1.将需要删除节点slot移动走
redis-trib.rb reshard 127.0.0.1:7000
redis-trib.rb del-node ip:port '<node-id>'
redis-trob.rb del-node 127.0.0.1:7006 cb56b3cd8fa62969288c27a592c2962297a3aebc

7.命令小结

KEYS *  #查看已存在所有键的名字
TYPE    #查看数据类型
DEL     #删除一个key
EXPIRE\PEXPIRE #以秒\毫秒设定生存时间
TTL\PTTL #以秒\毫秒返回生存时间
EXISTS  #检查是否存在
RNAME  #变更key值
服务器管理命令:
INFO
client list
client kill ip:port
config get *
config resetstat 重置统计
config get/set 动态修改
dbseze
select 1  选择库0-15
flushall 清空所有数据
flushdb 情况当前库
monitor 监控实时指令
shutdown 关闭服务器

 

0
如无特殊说明,文章均为本站原创,转载请注明出处
  • 转载请注明来源:Redis企业级实战
  • 本文永久链接地址:https://www.xionghaier.cn/archives/1088.html

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论

Hi,请填写昵称和邮箱!

取消评论
代码 贴图 加粗 链接 删除线 签到