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 对业务和数据之间相互关系 非常清晰的理解和概念
案例解析 - 电商平台中的购物车模块