1.事务管理 (Redis事务并不是真正意义上的事务 原理只是队列(没有隔离性))
DB Redis
begin multi 事务开启
commit exec 事务提交
rollback discard 事务回滚
watch 事务锁 -> 事务提交时如果事务锁关联key发生变化 则事务操作取消
注意:事务管理配合分布式锁实现批量更新
2.主从复制 Master-Slave Replication ->
Master 主节点(1) -> 写 (可以读)
192.168.158.11 : 6371
关闭持久化
Slave 从节点(N) -> 读 (不能写) 持久化
192.168.158.11 : 6372
192.168.158.11 : 6373
主从配置
slaveof 192.168.158.11 6371
开启持久化 RDB
dump6372.rdb
dump6373.rdb
优势:
读写分离
从节点 负载均衡 高可用性
缺点:
主节点 发生故障 数据丢失
3.哨兵模式 Sentinel -> HA (随机选举)
sentinel.conf 配置解析
//端口号
5 port 26379
//默认安排和选举规则
// 哨兵 监控 主节点 ip 端口号 法定人数(超过法定人数完成选举 一般为参加选举人数的一半)
36 # sentinel monitor <master-name> <ip> <redis-port> <quorum>
53 sentinel monitor mymaster 192.168.158.11 6371 1
//心跳监控频率
74 # sentinel down-after-milliseconds <master-name> <milliseconds>
//默认30秒 哨兵30秒内没有获取主节点的心跳 则主节点宕机 开启选举模式
82 sentinel down-after-milliseconds mymaster 30000
92 # sentinel failover-timeout <master-name> <milliseconds>
//3分钟之内完成选举
115 sentinel failover-timeout mymaster 180000
优势:
主从复制 Master-Slave Replication 有力补充 实现主节点高可用性
4.集群模式 Cluster -> HA (区块链去中心化)
检查光驱 -> 光盘是否设置并连接成功
(1)准备工作
挂载光盘:mount /dev/cdrom /mnt
配置yum的源 /etc/yum.repos.d
cd /etc/yum.repos.d
rm -rf *
vi my.repo
[media]
name=Red Hat Enterprise Linux 7.4
baseurl=file:///mnt
enabled=1
gpgcheck=1
gpgkey=file:///mnt/RPM-GPG-KEY-redhat-release
(2)安装ruby环境---> 部署Redis Cluster
Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言
yum install ruby
(3)安装Ruby访问Redis的接口
gem install ~/tools/redis-3.0.5.gem
(4)自动部署(6个节点)
拷贝到安装目录的bin目录下
/root/envs/redis_3.0.5/utils/create-cluster/create-cluster
/root/envs/redis_3.0.5/src/redis-trib.rb
修改create-cluster命令的路径
/root/envs/redis/bin/
bin/create-cluster start ----> 启动6个Redis的实例
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006
bin/create-cluster create ----> 创建Redis Cluster
bin/redis-trib.rb check 192.168.11.12:30001 ----> 检查Redis Cluster
Hash槽 默认大小16MB = 16384KB -> 集群分割槽位独立存储 信息共享
Redis集群添加数据 对key进行Hash运算 结果 0-16384 -> 555
Jedis应用
1.事务管理
public void test2() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
JedisPool jedisPool = new JedisPool(poolConfig, host, port);
Jedis jedis= jedisPool.getResource();
String k1 = "zhangsan";
String k2 = "lisi";
int money = 1000;
//分布式锁 -> 隔离性 独占
if("OK".equals(jedis.set("LOCK", "1234", "NX", "EX", 3))){
//事务管理
Transaction tx = jedis.multi();
try {
tx.decrBy(k1, money);
tx.incrBy(k2, money);
//System.out.println(1/0);
List<Object> results = tx.exec();
if(results!=null){
for(Object result:results){
System.out.println(result);
}
}
} catch (Exception e) {
tx.discard();
e.printStackTrace();
}finally{
if("1234".equals(jedis.get("LOCK"))){
jedis.del("LOCK");
}
jedis.close();
}
}
}
2.集群模式
Set<HostAndPort> nodes = new HashSet<>();
for(int i=30001;i<=30006;i++){
nodes.add(new HostAndPort(host, i));
}
JedisPoolConfig poolConfig = new JedisPoolConfig();
JedisCluster cluster = new JedisCluster(nodes, poolConfig);
//不能使用事务 (宕机回滚 不太现实)
//自动匹配获取数据 去中心化
System.out.println(cluster.get("k1"));
cluster.close();
大数据 BigData -> 铺垫 (分布式系统)
1.why
数据存储 -> Google GFS -> HDFS 分布式文件存储系统
数据运算 -> MapReduce -> 分步运算合成统计 变量矩阵
2.how
对业务和数据之间相互关系 非常清晰的理解和概念
案例解析 - 电商平台中的购物车模块