首页
统计
关于
Search
1
Sealos3.0离线部署K8s集群
1,073 阅读
2
类的加载
737 阅读
3
Spring Cloud OAuth2.0
725 阅读
4
SpringBoot自动装配原理
689 阅读
5
集合不安全问题
582 阅读
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
登录
Search
标签搜索
Java
CSS
mysql
RabbitMQ
JavaScript
Redis
JVM
Mybatis-Plus
Camunda
多线程
CSS3
Python
Spring Cloud
注解和反射
Activiti
工作流
SpringBoot
Mybatis
Spring
html5
蘇阿細
累计撰写
388
篇文章
累计收到
4
条评论
首页
栏目
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
页面
统计
关于
搜索到
46
篇与
的结果
2023-06-25
MongoDB 笔记
//进入test数据库 use test; //向user集合插入一个文档 db.user.insert({ username: '孙笑川' }); //查询user集合中的文档 db.user.find(); //再插入一个 db.user.insert({ username: '药水哥' }); //统计user集合中文档的数量 db.user.find().count(); //按条件查询 db.user.find({username: '孙笑川'}); //向user集合中username为孙笑川的文档添加一个age属性,值为33 db.user.update({username: '孙笑川'}, {$set: {age: 33}}); //使用{username: 'Giao哥'}替换username为药水哥的文档 db.user.replaceOne({username: '药水哥'}, {username: 'Giao哥'}); //删除username为孙笑川的文档的age属性 db.user.update({username: '孙笑川'}, {$unset: {age: 1}}) //向username为孙笑川的文档添加一个hobby:{cities: ['北京', '上海', '深圳']} //MongoDB的属性值也可以是一个文档,当一个文档的属性也是一个文档时,称这个文档为内嵌文档 db.user.update({username: '孙笑川'}, {$set: {hobby:{cities: ['北京', '上海', '深圳']}}}); //向username为Giao哥的文档添加一个hobby:{movies: ['007', '碟中谍', '加勒比海盗']} db.user.update({username: 'Giao哥'}, {$set: {hobby:{movies: ['007', '碟中谍', '加勒比海盗']}}}); //查询喜欢007电影的文档 //MongoDB支持内嵌文档的属性直接查询,此时属性名必须带引号 db.user.find({'hobby.movies':'007'}); //向Giao哥添加一个新的电影 //$push 向集合中添加一个新的元素 //$addToSet 向集合中添加一个新的元素(如果数组中已存在了该元素,则不执行添加) db.user.update({username: 'Giao哥'}, {$push: {'hobby.movies': '大话西游'}}); db.user.update({username: 'Giao哥'}, {$addToSet: {'hobby.movies': '大话西游'}}); //删除喜欢北京的用户文档 db.user.remove({'hobby.cities': '北京'}); //删除user集合 db.user.remove({}); db.user.drop(); show collections; //向number集合中插入20000条数据 for(var i = 1; i <= 20000; i++) { db.number.insert({num: i}); } //11s db.number.find().count(); db.number.drop(); var arr = []; for(var i = 1; i <= 20000; i++) { arr.push({num: i}); } db.number.insert(arr); //0.857s db.number.find().count(); //查找num为500的文档 db.number.find({num: 500}); //查找num大于500的文档 大于 $gt 大于等于 $gte 小于 $lt 小于等于 $lte 不等于 $ne db.number.find({num: {$gt: 500}}); //查找num大于40小于50的文档 db.number.find({num: {$gt: 40, $lt: 50}}); //查找number的前10条数据 db.number.find().limit(10); //查找number的11条到20条数据 skip 跳过指定数量的数据 //skip((pageNum - 1) * 10).limit(pageSize) db.number.find().skip(10).limit(10); //MongoDB会自定调整limit和skip的位置,无顺序影响 db.number.find().limit(10).skip(10); //文档间的关系 //一对一 db.couple.insert([ { name: '黄蓉', husband: { name: '郭靖' } }, { name: '潘金莲', husband: { name: '武大郎' } } ]); db.couple.find(); //一对多 用户 user 订单order(使用内嵌文档可能会出现数据越来越多难以维护的情况) db.user.insert([ {username: '孙笑川'}, {username: '药水哥'}, {username: 'Giao哥'} ]); db.user.find(); db.order.insert([ { list: ['苹果', '西瓜', '梨'], user_id: ObjectId("649847f13d750000000045e4") }, { list: ['铅笔', '钢笔', '圆珠笔'], user_id: ObjectId("649847f13d750000000045e5") }, { list: ['羽毛球', '篮球'], user_id: ObjectId("649847f13d750000000045e6") }, ]); db.order.find(); //查找孙笑川的订单 var user_id = db.user.findOne({username: '孙笑川'})._id; db.order.find({user_id: user_id}); //多对多 老师 teacher 学生 student db.teacher.insert([ {name: '孙笑川'}, {name: '药水哥'}, {name: 'Giao哥'} ]); db.teacher.find(); db.student.insert([ { name: '小明', teacher_ids: [ ObjectId("64984a183d750000000045ea"), ObjectId("64984a183d750000000045eb") ] }, { name: '小华', teacher_ids: [ ObjectId("64984a183d750000000045ea"), ObjectId("64984a183d750000000045ec") ] }, ]); db.student.find(); //查询工资小于1000或大于2500的员工 db.emp.find({$or: [{sal: {$lt: 1000}}, {sal: {$gt: 2500}}]}); //查询财务部的所有员工 var dept_no = db.dept.findOne({dname: '财务部'}).deptno; db.emp.find({depno: dept_no}) //为工资低于1000的员工加400工资 $inc 在原基础上增加 db.emp.updateMany({sal: {$lte: 1000}}, {$inc: {sal: 400}}); //查询emp并按照_id升序排列 //sort() 按照指定属性排序 1 升序 -1 降序 //先按sal升序,再按empno降序 db.emp.find({}).sort({sal: 1, empno: -1}); //在查询时,可以在第二个参数设置要查询的列(投影) db.emp.find({}, {ename: 1, _id: 0, sal: 1});
2023年06月25日
180 阅读
0 评论
0 点赞
2021-10-23
Linux环境下安装Postgreql
# 安装 yum install -y postgresql13-server # 添加postgres用户 useradd postgres # 转移数据目录至数据盘(同理MySQL) mkdir -p pgdata # 授权 chown postgres:root /data/pgdata/ # 更改环境变量(如下图) vim /usr/lib/systemd/system/postgresql-13.service # 切换至postgres用户启动数据库 su postgres systemctl enable postgresql-13 systemctl start postgresql-13 # 安装postgis插件 yum install postgis31_13将Environment环境更改至新的数据目录
2021年10月23日
181 阅读
0 评论
0 点赞
2021-10-23
Linux环境下安装MySQL
# 创建安装包文件夹,并下载mysql5.7.35安装包 mkdir -p /usr/local/database/ wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm # 安装 yum -y localinstall mysql57-community-release-el7-11.noarch.rpm yum -y install mysql-community-server # 设置开机自启 systemctl enable mysql # 将mysql数据目录从系统盘移动至数据盘 mkdir -p /data/mysql systemctl stop mysql cp -r /var/lib/mysql/* /data/mysql/ # 给新的mysql数据目录授权(必须执行) chown -R mysql:mysql mysql/ # 启动 systemctl start mysqld
2021年10月23日
227 阅读
0 评论
0 点赞
2021-09-05
Oracle CONNECT BY PRIOR函数的使用
语法{ SELECT demo01,demo02,demo03 FROM demotable START WITH [condition] CONNECT BY [NOCYCLE] PRIOR [CONDITION] }创建表--建表 CREATE TABLE employee( emp_id NUMBER(18), lead_id NUMBER(18), emp_name VARCHAR2(50), salary NUMBER(10,2), dept_no VARCHAR2(11) ); --插入数据 insert into employee values('1',0,'孙笑川','9999.00','001'); insert into employee values('2',1,'刘波','8888.00','002'); insert into employee values('3',1,'Giao哥','7777.00','003'); insert into employee values('4',2,'卢本伟','6666.00','002'); insert into employee values('5',2,'药水哥','5555.00','002'); insert into employee values('6',3,'伞兵一号','3333.00','003'); insert into employee values('7',3,'老中医','4444.00','003'); commit;查询以emp_id为0开始的节点的所有直属节点--查询以emp_id为0开始的节点的所有直属节点 SELECT emp_id,lead_id,emp_name,prior emp_name as lead_name,salary FROM EMPLOYEE START WITH emp_id=1 CONNECT BY PRIOR emp_id=lead_id;level格式化层级--level格式化层级 SELECT LPAD(' ', LEVEL*2, ' ')||emp_name as name,emp_id,lead_id,salary,level FROM employee START WITH lead_id=0 CONNECT BY PRIOR emp_id=lead_id;查找根节点CONNECT_BY_ROOT--查找根节点CONNECT_BY_ROOT SELECT CONNECT_BY_ROOT emp_name as root,emp_name,lead_id,salary FROM employee START WITH lead_id=0 CONNECT BY PRIOR emp_id=lead_id;标注循环行CONNECT_BY_ISCYCLE--标注循环行CONNECT_BY_ISCYCLE INSERT INTO employee VALUES('3', 7, '老中医1号', '15000.00', '003'); commit; SELECT emp_id,emp_name,lead_id,salary,CONNECT_BY_ISCYCLE FROM employee START WITH lead_id=0 CONNECT BY NOCYCLE PRIOR emp_id=lead_id;判断是否为叶子节点CONNECT_BY_ISLEAF--判断是否为叶子节点CONNECT_BY_ISLEAF SELECT emp_id,emp_name,lead_id,salary,CONNECT_BY_ISLEAF from employee START WITH lead_id=0 CONNECT BY NOCYCLE PRIOR emp_id=lead_id;
2021年09月05日
299 阅读
0 评论
0 点赞
2021-01-03
Redis缓存穿透和雪崩
Redis缓存穿透和雪崩缓存穿透1、概念当用户查询一个数据时,发现redis内存数据库中没有(缓存未命中),于是向持久层数据库(如MySQL)查询,发现也没有要查询数据,造成本次查询请求失败。当用户很多时,出现了同样的情况,就会给持久层数据库造成很大的压力,这个过程就称为缓存穿透。解决方案布隆过滤器:它是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免对底层数据库的查询压力。缓存空对象:当存储层不命中后,将返回的空对象也存储起来,同时设置一个过期时间,之后有请求访问这个数据时从缓存中获取,以此保护后端数据源存在的问题:1、存储空对象需要更多的存储空间2、即使设置了过期时间,缓存层和存储层的数据存在一定时间的窗口期,对数据一致性要求较高的业务可能会出现问题缓存击穿1、概念:当某个key在过期的瞬间,有大量的并发请求访问(这类数据一般是热点数据),由于缓存过期,请求会去访问数据库来进行查询,并且回写缓存,会导致数据库瞬间压力过大,如:微博热搜宕机解决方案1、设置热点数据永不过期2、加互斥锁使用分布式锁,保证对于每个key只有一个线程去查询后端服务,其他没有获得分布式锁的线程需要等待缓存雪崩1、概念指在某一个时间段,缓存集中过期,查询请求全部落到后端数据库头上。例:双11的抢购,将热点商品集中放入缓存,设置过期时间为1点,到了凌晨1点,这批热点商品的缓存都过期了,这时对于这批商品的查询请求会全部落到数据库头上,对于数据库而言产生了周期性的波峰压力,底层存储的调用量指数上升,整个服务极易出现问题。解决方案1、Redis高可用增加Redis服务器,一台出现问题之后,其他节点正常工作(异地多活)2、限流降级在缓存失效后,通过加锁或队列来控制读取数据库写缓存的线程数量3、数据预热在正式部署之前,把可能的数据先访问一遍,在发生高并发请求之前手动触发缓存key,并设置不同的缓存过期时间,让缓存失效的时间尽量均匀,而不是集中过期
2021年01月03日
268 阅读
0 评论
0 点赞
2021-01-03
Redis哨兵模式
哨兵模式Redis 2.8引入,Rentinel哨兵模式哨兵模式是一种特殊的模式,它是一个独立的进程,其原理是:哨兵通过发送命令,等待redis服务器响应,从而监控运行的多个redis实例。哨兵模式的作用:通过发送命令,让redis服务器返回监控的运行状态(包括主从所有节点)当哨兵检测到master宕机,会在自动将slave切换为master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让他们切换主服务器节点一般情况下使用多个哨兵进行监控,且哨兵之间互相监督:当master节点出现问题时,哨兵01先检测到问题,系统并不会马上进行failover,仅仅是哨兵01主观的认为主节点不可用,这个过程称为主观下线。当其他哨兵也检测到主节点服务不可用时,并且数量达到了一定的值,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover(故障转移)操作。当切换完成之后,就会通过发布订阅模式让各个哨兵把自己监控的节点进行master主节点切换(从故障节点切换为投票后票数最高的节点),这个过程称为客观下线。测试1、redis配置文件目录下新建sentinel.conf#sentinel monitor 被监控名 主机地址 端口 1 sentinel monitor myredis 127.0.0.1 6380 1 #master节点密码(必须配置) sentinel auth-pass myredis 123456 后面的数字1,代表当主机出现问题时,slave进行投票决定让谁成为主机,票数最多的成为主节点2、启动哨兵模式[root@suaxi bin]# redis-sentinel sconf/sentinel.conf 19524:X 03 Jan 2021 21:33:38.148 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 19524:X 03 Jan 2021 21:33:38.148 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=1 started 19524:X 03 Jan 2021 21:33:38.148 # Configuration loaded _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 6.0.9 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 19524 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 19524:X 03 Jan 2021 21:33:38.149 # Sentinel ID is dce67565b60ad27529a7bbcfe2457faa3a306c4e 19524:X 03 Jan 2021 21:33:38.149 # +monitor master myredis 127.0.0.1 6379 quorum 1 19524:X 03 Jan 2021 21:33:38.151 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 127.0.0.1 6 19524:X 03 Jan 2021 21:33:38.155 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 127.0.0.1 6 19524:X 03 Jan 2021 21:34:20.556 # +sdown master myredis 127.0.0.1 6379 19524:X 03 Jan 2021 21:34:20.556 # +odown master myredis 127.0.0.1 6379 #quorum 1/1 19524:X 03 Jan 2021 21:34:20.556 # +new-epoch 3 19524:X 03 Jan 2021 21:34:20.556 # +try-failover master myredis 127.0.0.1 6379 19524:X 03 Jan 2021 21:34:20.560 # +vote-for-leader dce67565b60ad27529a7bbcfe2457faa3a306c4e 3 19524:X 03 Jan 2021 21:34:20.560 # +elected-leader master myredis 127.0.0.1 6379 19524:X 03 Jan 2021 21:34:20.560 # +failover-state-select-slave master myredis 127.0.0.1 6379 19524:X 03 Jan 2021 21:34:20.622 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 1279 19524:X 03 Jan 2021 21:34:20.622 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.yredis 127.0.0.1 6379 19524:X 03 Jan 2021 21:34:20.674 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 63is 127.0.0.1 6379 19524:X 03 Jan 2021 21:34:21.037 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ myredis 1279 19524:X 03 Jan 2021 21:34:21.037 # +failover-state-reconf-slaves master myredis 127.0.0.1 6379 19524:X 03 Jan 2021 21:34:21.104 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ myredis 6379 19524:X 03 Jan 2021 21:34:22.060 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ myred.1 6379 如果之前端口为6379的主节点重新恢复后,不能再成为主节点,哨兵模式会将其分配为slave从节点优缺点优点:1、哨兵模式集群基于主从复制模式2、主从切换,系统可用性更好缺点:1、哨兵集群容量很大,在线扩容不方便2、哨兵模式配置繁杂sentinel.conf详细配置# Example sentinel.conf # 运行端口默认26379 port 26379 # 工作目录 dir /tmp # 监控的redis主节点 # master-name 可自定义命名的主节点名字,只能由字母A-Z、数字0-9、.-_等字符组成 # quorum 配置多少个哨兵节点同意认为master节点失联,这时客观认为主节点已失联(客观下线) # sentinel monitor <master-name> <ip> <redis-port> <quorum> sentinel monitor myredis 127.0.0.1 6379 1 # 设置哨兵连接主节点的密码 # sentinel auth-pass <master-name> <password> sentinel auth-pass myredis 123456 # 指定多少毫秒后,主节点没有应答哨兵监控,哨兵主观上认为主节点出现问题,默认为30秒 # sentinel down-after-milliseconds <master-name> <milliseconds> sentinel down-after-milliseconds myredis 30000 # 指定在发生failover[故障转移]主备切换时,有多少个slave节点同时对新的master节点进行同步 # 数字越小,完成failover的时间越长,数字越大,越多的slave节点会因replication而不可用 # 可将这个值设为1,来保证每次只有一个slave节点处于不能处理命令请求的状态 # sentinel parallel-syncs <master-name> <numslaves> sentinel parallel-syncs myredis 1 # 故障转移超时时间 failover-timeout,可用于以下几个方面 # 1.同一个sentinel对同一个master两次failover之间的时间间隔 # 2.当一个slave从一个出现问题的master那里同步数据开始计算时间,直到slave被纠正为向正确的master同步数据时 # 3.当想要取消一个正在进行failover所需要的时间 # 4.当进行failover时,配置所有slave指向新的master所需的最大时间(即使过了这个时间,slave依然会被配置到正确的master,此时不遵循parallel-syncs规则) # 默认为三分钟,单位毫秒 # sentinel failover-timeout <master-name> <milliseconds> sentinel failover-timeout myredis 180000 # SCRIPTS EXECUTION # 配置当某一事件发生时所需要执行的脚本,以此来通知管理员 # 1.若脚本执行后返回1,那么该脚本稍后会被再次执行,默认次数为10 # 2.若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会被重复执行 # 3.如果脚本在执行过程中收到系统中断信号而被终止,则与返回值为1时的操作一致 # 一个脚本的最大执行时间为60s,将会被SIGKILL信号终止,之后重新执行 # 通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。 # sentinel notification-script <master-name> <script-path> sentinel notification-script myredis /var/redis/notify.sh # 客户端重新配置主节点参数脚本 # 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。 # 以下参数将会在调用脚本时传给脚本: # <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port> # 目前<state>总是“failover”, # <role>是“leader”或者“observer”中的一个。 # 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的 # 这个脚本应该是通用的,能被多次调用,不是针对性的。 # sentinel client-reconfig-script <master-name> <script-path> sentinel client-reconfig-script myredis /var/redis/reconfig.sh
2021年01月03日
145 阅读
0 评论
0 点赞
2021-01-03
Redis主从复制
Redis主从复制默认情况下,每台redis服务器都是master主节点1、概念将一台redis服务器的数据,复制到其他redis服务器上,前者称为主节点(master/leader),后者称为从节点(slave/follower),数据的复制是单向的,只能由主节点到从节点,Master以写为主,Slave以读为主。一般来说,一个主节点可以有多个从节点,但一个从节点,只能有一个主节点。2、作用数据冗余:实现了数据的热备份,是持久化之外的另一种数据冗余方式故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复(服务冗余)负载均衡:在主从复制的基础上,配合读写分离,在redis写数据时应用连接主节点,读数据时应用连接从节点,以此分担服务器负载(读多写少)高可用(集群)基石:主从复制是哨兵模式和集群的基础3、一主二从配置:此处以单机多集群为例:1、修改端口,2、修改日志文件名6380.log (为避免单机多集群情况下文件名重复,以下同理),3、修改pid文件名redis_6380.pid,4、修改dump文件名dump6380.rdb,5、配置主节点地址replicaof 127.0.0.1 63796、配置主节点密码masterauth 1234566380、6381从节点以此类推需特别注意密码配置的方式:主节点redis.conf配置密码的方式为:requirepass 123456从机redis.conf配置密码的方式为:masterauth 123456如果主节点配置了密码,从机一定要配置,不然连不上主节点补充:也可以通过命令行配置(重启redis服务之后配置失效)127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 #SLAVEOF host port OK 127.0.0.1:6380> info replication #查看节点信息 # Replication role:slave master_host:127.0.0.1 master_port:6379 #主节点 master_link_status:up master_last_io_seconds_ago:5 master_sync_in_progress:0 slave_repl_offset:0 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:ed6d6cc071c41636468cecadd52b61d6c9b130af master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:0 127.0.0.1:6380> 查看主节点信息:127.0.0.1:6379> info replication # Replication role:master #角色 connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=42,lag=0 #从机信息1 slave1:ip=127.0.0.1,port=6381,state=online,offset=42,lag=1 #从机信息2 master_replid:ed6d6cc071c41636468cecadd52b61d6c9b130af master_replid2:0000000000000000000000000000000000000000 master_repl_offset:42 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:42 127.0.0.1:6379> 4、复制原理1、Slave启动连接到Master后会发送一个sync同步命令2、Master接到命令,启动后台的存盘进程,同时收集所有接收到的修改数据集的命令,在后台进程执行完毕之后,master传送整个数据文件到slave,同时完成一次完全同步全量复制:slave接收到数据文件之后,将其存盘并加载到内存中增量复制:Master继续将收集到的新的修改命令依次传给Slave,完成同步5、层层节点
2021年01月03日
105 阅读
0 评论
0 点赞
2021-01-03
Redis发布订阅
Redis发布订阅发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息命令命令及描述PSUBSCRIBE pattern [pattern...]订阅一个或多个符合给定模式的频道PUBSUB subcommand [argument [argument...]]查看订阅与发布系统状态PUBLISH channel message将信息发送到指定的频道PUNSUBSCRIBE [pattern [pattern...]]退订所有给定模式的频道SUBSCRIBE channel [channel...]订阅给定的一个或多个的频道信息UNSUBSCRIBE [channel[channel...]]退订指定的频道测试订阅者:127.0.0.1:6379> SUBSCRIBE test #订阅名为test的频道 Reading messages... (press Ctrl-C to quit) #订阅之后自动监听 1) "subscribe" 2) "test" 3) (integer) 1 # 监听消息,等待推送读取 1) "message" #消息 2) "test" #来自哪个频道 3) "nihao" #消息内容 1) "message" 2) "test" 3) "xiexie" 发布者:127.0.0.1:6379> PUBLISH test nihao #发布者发布消息到test频道 (integer) 1 127.0.0.1:6379> PUBLISH test xiexie (integer) 1 127.0.0.1:6379> 原理常用于微信公众号、微博、实时聊天等通过SUBSCRIBE命令订阅某频道后,redis-server里维护了一个字典,字典的键可以看作是一个个的频道,而字典的值则是一个链表,链表中保存了所有订阅这个频道(channel)的客户端。换句话说,就是将客户端添加到指定频道(channel)的订阅链表中。通过PUBLISH命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的频道(channel)字典中查找订阅了这个频道的所有客户端的链表,遍历这个链表,将消息发布给所有订阅者。
2021年01月03日
102 阅读
0 评论
0 点赞
1
2
...
6