Redis
Redis是NoSQL(非关系性数据库的一种)
安装Redis
Redis 的官方下载站是 http://redis.io/download,可以去上面下载最新的安装程序
redis中文网站 http://redis.cn/
- windows下的安装和使用
1.下载redis程序软件
使用redisbin32 或redisbin64
https://github.com/microsoftarchive/redis/releases
2.绿色软件,不需要安装,直接使用
3.启动redis服务(带配置文件启动,和不带配置文件启动)
直接点击redis-cli.exe是不带配置文件启动
4.连接到redis进行操作
cmd>{%redis%}/redis-cli -h ip地址 -p 端口号
ip 默认为本地 -p 默认6379
Redis集群&&分布式
集群:多个服务器 都去处理同一个业务
分布式:多个服务器 去处理不同的业务
redis为什么要集群
1.处理高并发
2.防止单点故障
3.处理大量数据
集群具备的特性
集群应该具有如下特性:
- 可扩展性 : 方便的增加集群中的机器 , 动态扩容缩容
- 高可用性 :从性能,相应等方面提升效率,不会挂掉,不影响结果
1.6.集群的能力
集群应该具备如下能力:
-
负载均衡
把请求根据某种算法相对平衡的路由到集群的应用
-
错误恢复
集群下的某个应用挂了需要找到能用的服务继续处理请求
-
主备切换
对于应用的集群,某个应用挂掉了,集群中需要有其他的应用顶上以处理请求
redis集群方案
(1)主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器
。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
写请求到主Redis,读请求到从Redis
,读/写的路由需要负载均衡器(主Twemproxy/从Twemproxy) ,而主从Redis的负载均衡器需要做主备切换(keeplived)
优点:处理高并发 完成 主从同步 读写分离 主备切换
主redis具有读写能力,从redis只有读
缺点:比如服务宕机之后,需要手动启动,会造成一些数据的丢失
(2)哨兵模式
当主服务器中断服务后,可以将一个从服务器升级为主服务器`,以便继续提供服务,但是这个过程需要人工手动来操作。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。
主观下线:当某个哨兵通过ping主redis发现没有回应,那么这个哨兵主观认为 主redis挂掉;
客观下线:半数以上的哨通过ping主redis发现没有回应,那么这个是客观下线;
故障转移:当客观下线,会自动选择一个从Redis提升为主。
优点:处理高并发 完成 主从同步 读写分离 主备切换 自动切换
缺点:服务里面存储的数据都是一样,占用内存比较大 ,扩容比较麻烦
(3)redis-cluster(推荐)
1.为什么要使用Redis-Cluster
redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容
。
2.什么是Redis-Cluster
Redis-Cluster采用无中心结构,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接
,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据
。
3.数据分散存储
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)
的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16
算法来取模得到所属的slot
,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384
。
4.容错机制-投票
为了防止主节点数据丢失,可以为每个主节点可以准备特点数目的备节点,主节点挂掉从节点可以升级为主节点(哨兵模式) 。
容错机制
指的是,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作. 故障节点对应的从节点自动升级为主节点 , 如果某个主挂掉,而没有从节点可以使用,那么整个Redis集群进入宕机状态
优点:处理高并发 完成 主从同步 读写分离 主备切换 自动切换,分布式存储
缺点:麻烦一点 扩容还是比较麻烦
Redis-cluster集群环境搭建
下载Redis-x64-3.2.100
1.需要 6 台 redis 服务器。搭建伪集群。
2.需要 6 个 redis 实例。
3.需要运行在不同的端口 6379-6384
redis.windows.conf中配置
1.修改redis.windows.conf,端口号分别对应:6379、6380、6381、6382、6383、6384。
2.开启cluster-enabled :cluster-enabled yes
3.指定集群配置文件: cluster-config-file nodes-6379.conf
,cluster-config-file nodes-6379.conf 是为该节点的配置信息,这里使用 nodes-端口.conf命名方法。服务启动后会在目录生成该文件。
4.指定超时:cluster-node-timeout 15000
5.开启持久:appendonly yes
Ruby语言运行环境
需要使用ruby脚本来实现集群搭建
安装Ruby----rubyinstaller-2.6.3-1-x64.exe
安装Ruby驱动
1.下载rubygems-2.7.7
2.在rubygems-2.7.7根目录下cmd执行ruby setup.rb
3.到Redis目录执行(6379的Redis目录)使用cmd执行gem install redis
执行集群构建脚本
1.点击start.bat启动6个Redis
2.拷贝redis-trib.rb到Redis目录(6379的Redis目录)
3.在6379根目录执行构建脚本:
redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
4.在出现 Can I set the above configuration? (type ‘yes’ to accept): 请确定并输入 yes
5.测试集群命令
启动客户端:redis-cli –c –h 127.0.0.1 –p 6379 , 可以跟任何节点的端口
查看整个集群:cluster info
查看当前 Redis:info replication
查看槽位:cluster nodes
java集群代码测试
1.导包
2.测试
@Test
public void test()throws Exception{
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1", 6379));
nodes.add(new HostAndPort("127.0.0.1", 6380));
nodes.add(new HostAndPort("127.0.0.1", 6381));
nodes.add(new HostAndPort("127.0.0.1", 6382));
nodes.add(new HostAndPort("127.0.0.1", 6383));
nodes.add(new HostAndPort("127.0.0.1", 6384));
//获取对象
JedisCluster cluster = new JedisCluster(nodes);
try {
//给name设置值
cluster.set("name", "王二狗");
String res = cluster.get("name");
System.out.println(res);
// cluster.quit();
} catch (Exception e) {
e.printStackTrace();
//cluster.quit();
}
}