1. 简介
非关系型数据库 NoSQL = Not Only SQL (不仅仅是SQL),NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!
中文网站:http://redis.cn/
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
主流的两种方式:
(1)做mysql的缓存使用
(2)可以直接作为数据库来用,是一个高性能的key-value数据库。值(value)可以是 字符串(String), 哈希(Hash),列表(list),集合(sets) 和 有序集合(sorted sets)等类型。
2. redis的下载和安装
(1)redis软件下载
下载地址:https://redis.io/download
在此下载最新版 redis-5.0.8
(2)redis安装
通过SecureCAT软件中的SecureFX,将在Windows中下载好的软件压缩包放到Linux中
tar zxf redis-5.0.8.tar.gz 解压
yum install -y gcc 安装gcc编译器
make && make install 编译&&安装
utils/install_server.sh 脚本文件,控制服务
至此,redis安装成功!
(3)启动
(4)设置监听所有接口
由默认的bind 127.0.0.1修改为 bind 0.0.0.0
修改完成后,重新启动
其中 netstat -antlp : 用于显示各种网络信息,a (all)表示显示所有选项,n表示拒绝显示别名,t表示仅显示tcp相关选项,l表示仅列出有在 Listen (监听) 的服務状态,p表示显示建立相关链接的程序名。
redis-cli:连接本地的 redis 服务
3. redis常用命令
config get * //查看配置
select 1 //选择数据库
flushdb //清空当前数据库
flushall //清空所有数据库
move key 1 //移动key
del key //删除
rename oldkey newkey //改名
expire key 10 //设置过期时间
persist key //设置持久化
keys user* //查询
exists key //判断是否存在
4 redis主从复制
mysql通过二进制日志实现主从复制,而redis是通过快照来实现主从复制
slaveof/replicaof 192.168.0.100 6379 (ip地址和端口)
min-slaves-to-write <slave 数量>
min-slaves-max-lag <秒数> //当master在最小时间内收不到slave的心跳包和没有slave,则master失效
Redis 使用异步复制,因此无法确保 slave 是否实际接收到给定的写命令
(1)开启两台虚拟机,并都安装好redis
[root@server1 ~]# vim /etc/hosts
[root@server1 ~]# scp redis-5.0.8.tar.gz server2: //复制redis的压缩包到server2中
The authenticity of host 'server2 (192.168.0.200)' can't be established.
ECDSA key fingerprint is SHA256:CEBeiYEy1Lo/5YQ5Sc5iu6DPEy1I5WNS1uUHsWprq9U.
ECDSA key fingerprint is MD5:51:1f:32:63:71:66:16:12:11:d9:70:43:54:e3:fb:1c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server2,192.168.0.200' (ECDSA) to the list of known hosts.
root@server2's password:
redis-5.0.8.tar.gz 100% 1939KB 108.1MB/s 00:00
进入/etc/hosts 目录,解析两台虚拟机
至此,成功将server1中的redis软件包复制到server2中!接下来通过给server2下载yum源安装redis
[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server2 //设置免密
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# scp dvd.repo server2:/etc/yum.repos.d/ //将server1的dvd.repo复制到server2中
[root@server2 ~]# mount /dev/cdrom /media/ //将光驱文件挂载到media目录
mount: /dev/sr0 is write-protected, mounting read-only
[root@server2 ~]# yum repolist //安装yum源
This system is not registered with an entitlement server. You can use subscription-manager to register.
dvd | 4.3 kB 00:00:00
(1/2): dvd/group_gz | 146 kB 00:00:00
(2/2): dvd/primary_db | 4.2 MB 00:00:00
repo id repo name status
dvd rhel7.6 5,152
repolist: 5,152
[root@server2 ~]# yum install -y gcc //安装gcc
[root@server2 ~]# tar zxf redis-5.0.8.tar.gz //解压
[root@server2 ~]# ls
redis-5.0.8 redis-5.0.8.tar.gz
[root@server2 ~]# cd redis-5.0.8/
[root@server2 redis-5.0.8]# make && make install //安装redis
//安装完成后,源码包中utils目录下有一个install_server.sh文件,运行根据提示可初始化redis运行环境,包括启动脚本,端口号,根数据文件目录等
[root@server2 redis-5.0.8]# utils/install_server.sh
Installation successful!
[root@server2 redis-5.0.8]# vim /etc/redis/6379.conf //进入配置文件,修改为监听所有接口
[root@server2 redis-5.0.8]# /etc/init.d/redis_6379 restart //用脚本文件启动redis服务
Stopping ...
Redis stopped
Starting Redis server...
[root@server2 redis-5.0.8]# redis-cli //连接本地redis服务
127.0.0.1:6379>
至此,在server1和server2中均安装好了redis
(2)设置主从
主机server1
[root@server1 yum.repos.d]# redis-cli
127.0.0.1:6379> set name nzz //设置名字
OK
127.0.0.1:6379>
从机server2
127.001:6379> info //查看配置信息
# Replication
role:master //初始状态是master
127.0.0.1:6379> REPLICAOF 192.168.0.100 6379 //修改为server1的slave
OK
127.0.0.1:6379> info
# Replication
role:slave //现在的状态是server1的slave
master_host:192.168.0.100
master_port:6379
127.0.0.1:6379> get name
"nzz" //可以看出server1刚设置的数据nzz过来了
查看主机server1的配置
[root@server1 ~]# redis-cli
127.0.0.1:6379> info
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.0.200,port=6379,state=online,offset=2576,lag=1
可以看出连接了一个从机server2 (ip=192.168.0.200)
5. redis持久化
RDB 在指定的时间间隔能对数据进行快照存储(默认)
AOF 以追加的方式保存所有写操作
save 900 1 #当有一条Keys数据被改变时,900秒刷新到Disk一次
save 300 10 #当有10条Keys数据被改变时,300秒刷新到Disk一次
save 60 10000 #当有10000条Keys数据被改变时,60秒刷新到Disk一次
appendonly yes #启用AOF持久化方式
appendfsync everysec #每秒钟强制写入磁盘一次
- RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份。
- 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。
- 定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外, 使用 RDB 还可以避免 AOF 程序的 bug 。
6. Redis 的 Sentinel 分布式系统
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作(shutdown)时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器
7. redis集群
Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。
Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令。Redis 集群的优势:
- 自动分割数据到不同的节点上
- 整个集群的部分节点失败或者不可达的情况下能够继续处理命令
Redis 集群的数据分片:
Redis 集群没有使用一致性hash,,而是引入了 哈希槽的概念
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽,比如当前集群有3个节点,那么:
- 节点 A 包含 0 到 5500号哈希槽
- 节点 B 包含5501 到 11000 号哈希槽
- 节点 C 包含11001 到 16384号哈希槽
这种结构很容易添加或者删除节点。比如如果想新添加个节点D, 需要从节点 A,B,C中得部分槽到D上。如果想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可。由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。