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 关闭服务器
如无特殊说明,文章均为本站原创,转载请注明出处
- 转载请注明来源:Redis企业级实战
- 本文永久链接地址:https://www.xionghaier.cn/archives/1088.html