Redis
一.redis概述
1.1 什么是NoSql?
“不仅仅是sql”,泛指 非关系型数据库
Redis就是NoSql的一种
1.2 Redis是什么?
- Redis 是一个高性能的 开源的、C语言写的Nosql(非关系型数据库),数据保存可以存储在内存中或者磁盘中。
- 以key-value的形式存储数据,redis严格上不是一种数据库,应该是一种数据结构化存储方法的集合(list set map string,sortset)。
优势:
- 数据存储在内存中,存取速度快,并发能力强
- 支持存储value类型多,包括string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型)
- Redis支持集群(主从同步)
- 支持持久化操作
- 支持多语言客户端
使用场景:
- 缓存
数据放到内存中,读取数据快,减轻了数据库的压力,而Redis就是存放在内存中。 - 计数器应用
网站做浏览次数或统计人数的时候,如果出现高并发的情况,那么关系型数据库就会出现问题,而用Redis就可以相对的避免这种情况。 - 实施防攻击系统
比如系统受到攻击时,可以查询该ip,当达到10次的时候,自动锁定 - 消息订阅
类似于微信公众号之类的
二.Redis的安装
Redis是绿色软件,下载好直接使用就行
2.1 启动redis服务
带配置文件启动
命令:redis-server.exe redis.windows.conf
连接:redis-cli -h ip地址 -p 端口号(ip 默认为本地 -p 默认6379)
3.Redis集群
3.1集群的概念
集群就是多个服务器做的事情都是一样,每个服务器都是一个完整的应用,他们做的业务,包含的模块都是一样的。这些服务器相当于是复制出来的一样。
3.2为什么要用集群?
- 防止单点故障,比如其中一个挂了,可以选择其他的
- 扩展性高
- 高可用性,提高效率,不容易挂
4.分布式
4.1分布式概念
分布式就是多个服务器做不通的事情。相当于把一个完整的项目拆分开来,每个服务器只负责一部分功能,所有的服务器合起来才是一个完整的应用。
比如:做菜,3个人,一个负责买菜,一个负责切菜,一个负责炒菜。
4.2为什么要用分布式?
单体应用要做集群,就要对整个应用做集群,但是如果我只想对其中某个模块做集群,那么用分布式就可以只对这个模块做集群。
五.Redis的三种集群模式
5.1主从复制(读写分离)
一个主redis可以有多个从redis,但是一个从redis只能有一个主redis。
从redis的数据是从主redis中复制来的
主redis可以主要做写操作(也可以读),从redis主要做读取操作
特点:分担读的压力
缺点:
- 不能解决数据量大的问题
- 主redis挂了,没办法自动将从redis提升成主redis
5.2哨兵模式
在主从模式的基础上增加了哨兵,监控主redis的健康状态,自动的进行从到主的提升
特点:能自动将从redis提升成主redis
5.3redis-cluster集群
多主多从,多主实现分布式存储,每个redis存储不同的内容
多主之间的关系是对等的,有连接,可以相互通信。
存储方式:分布式储存数据,槽位运算,算法:CRC16(key) % 16384
六.搭建redis集群
6.1安装6台redis
在Window搭建6个伪集群
每个Redis创建启动脚本start.bat,内容如下
title redis-3679
redis-server.exe redis.windows.conf
6.2redis配置
1.建一个6379的文件夹,redis放进来
2.复制5份,将文件夹的名字一次改成6380,6381,6382,6383,6384。
修改redis.windows.conf,端口号分别为6380,6381,6382,6383,6384
3.开启cluster-enabled :cluster-enabled yes
4.指定集群配置文件: cluster-config-file nodes-6379.conf
5.指定超时:cluster-node-timeout 15000
6.开启持久:appendonly yes
6.3安装Ruby
傻瓜式安装
6.4安装Ruby驱动
1.解压,进入根目录,cmd
命令:
ruby setup.rb
2.切入到Redis目录执行(6379的Redis目录) cmd
命令:
gem install redis
6.5执行集群构建脚本
1.启动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 。
6.6.测试集群命令
启动客户端(cmd命令启动):
redis-cli –c –h 127.0.0.1 –p 6379
可以跟任何节点的端口
查看整个集群:cluster info
查看当前Redis:info replication
查看槽位:cluster nodes
6.7集群代码测试
@Test
public void testCluster() throws IOException, InterruptedException {
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 {
String res = cluster.get("name");
System.out.println(res);
//cluster.quit();
} catch (Exception e) {
e.printStackTrace();
//cluster.quit();
}
}