当前位置: 首页 > 编程日记 > 正文

redis主从复制、高可用和集群

redis简介:

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型);这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的;在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中;区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis的优点:

  • 性能极高 – Redis能支持超过 100K+ 每秒的读写频率。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子性 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

主从复制:

实验环境:

test1: 172.25.1.11      作主机

test2: 172.25.1.12      作备机

test3: 172.25.1.13      作备机

test1、test2、test3:

tar zxf redis-4.0.8.tar.gz

cd redis-4.0.8

yum install gcc -y

make && make install

which redis-cli

cd utils/

./install_server.sh

redis-cli          //ctrl+c退出

netstat -antlp | grep redis

test1:

vim /etc/redis/6379.conf

/etc/init.d/redis_6379 restart

[root@test1 utils]# redis-cli

test2和test3:

[root@test2 redis]# vim 6379.conf                //这里的slaveof后的ip应是test1(master)的ip,端口为6379,目的是:与master同步

[root@test2 redis]# /etc/init.d/redis_6379 restart

[root@test2 redis]# redis-cli

//test3和test2执行相同的步骤

此时,给test1执行:

则test2和test3已经同步过来了:

哨兵模式实现主从高可用

//做主从切换的时候只能有一个与主发起同步

redis提供了哨兵,实现高可用。哨兵节点进行自主监控主从节点以及其他哨兵节点,当发现主节点挂掉时自动故障转移。

哨兵节点最好为奇数:

test1:

[root@test1 redis-4.0.8]# pwd
/root/redis-4.0.8
[root@test1 redis-4.0.8]# cp sentinel.conf /etc/redis/
[root@test1 redis-4.0.8]# vim /etc/redis/sentinel.conf

//这里的sentinel后跟的ip为哨兵节点的领导者,用来做故障转移。

[root@test1 ~]# scp /etc/redis/sentinel.conf test2:/etc/redis/

[root@test1 ~]# scp /etc/redis/sentinel.conf test3:/etc/redis/

[root@test1 ~]# cd /etc/redis

test1:

[root@test1 redis]# redis-server /etc/redis/sentinel.conf --sentinel                //查看连接状态

test2:

[root@test2 redis]# cd /etc/redis
[root@test2 redis]# redis-server /etc/redis/sentinel.conf --sentinel

1152:X 31 Mar 03:33:43.740 * +sentinel sentinel d5482bb57d42d1e217c5b4d794177aebd1d17173 172.25.1.11 26379 @ mymaster 172.25.1.11 6379
1152:X 31 Mar 03:34:49.031 * +sentinel sentinel f34d21c240b9903cbd6f51a3546ad87a2d84c89a 172.25.1.12 26379 @ mymaster 172.25.1.11 6379
1152:X 31 Mar 03:36:15.879 # +sdown sentinel f34d21c240b9903cbd6f51a3546ad87a2d84c89a 172.25.1.13 26379 @ mymaster 172.25.1.11 6379

test3:

[root@test3 redis]# cd /etc/redis/

[root@test3 redis]# redis-server /etc/redis/sentinel.conf --sentinel

1251:X 31 Mar 03:46:42.534 * +slave slave 172.25.1.12:6379 172.25.1.12 6379 @ mymaster 172.25.1.11 6379
1251:X 31 Mar 03:46:42.534 * +slave slave 172.25.1.11:6379 172.25.1.13 6379 @ mymaster 172.25.1.11 6379
1251:X 31 Mar 03:47:12.562 # +sdown slave 172.25.1.11:6379 172.25.1.11 6379 @ mymaster 172.25.1.11 6379

若此时将test1的sentinel关掉,假设出现故障:

[root@test1 redis]# redis-cli
127.0.0.1:6379> shutdown
not connected>

test2和test3监控分别显示:

此时,test3接替test1作为哨兵节点的领导者,负责故障转移。

查看哨兵配置文件:

test3:

test2:

配置文件自动更新为172.25.1.13

若再次将test1的哨兵节点恢复,则此时:

[root@test1 redis]# /etc/init.d/redis_6379 start

可以看到test1的哨兵服务开启后,test1并没有恢复以前的master身份,而是转为slave

[root@test3 redis]# redis-server /etc/redis/sentinel.conf --sentinel

可以在配置文件中查看:

[root@test1 redis]# vim 6379.conf

可以看出test1的配置文件的最后一行自动添加了  slaveof 172.25.1.13 6379,即test3为master

test3配置文件中的  slaveof 172.25.1.11 6379已经自动消失

Redis集群搭建

//若某节点与其他节点通信时过半的master与其无法通信则该master挂掉。

//任意一个master挂掉,若该master没有从节点,则该集群挂掉。

//过半的 master挂掉,则该集群挂掉。

Redis集群简介

redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群;
        redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
        redis集群没有统一的入口,客户端连接集群的时候连接集群中的任意节点即可,集群内部的节点是相互通信的(ping-pong机制),每个节点都是一个redis实例;
        为了实现集群的高可用,即判断节点能否正常使用,redis-cluster有一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,则该结点就挂了(fail);

什么时候整个集群不可用?
       1、 若集群中任意一个节点挂了且该节点没有从节点(备份节点),则集群就挂了,即不可用 ;

2、如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态 。
        任意一个节点挂了且该结点没有从节点,则这个集群就挂了的原因 -> 因为集群内置了16384个哈希槽,并且把所有的物理节点映射到了这16384[0-16383]个哈希槽上,或者说把这些哈希槽均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16(循环冗余码校验)算法,然后得到一个结果,再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,从而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的哈希槽就无法使用,那么就会导致集群无法正常工作。
        注:每个Redis集群理论上最多可以有16384个节点。

实验环境:
Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。
为保证集群的高可用,需要每个节点都有从节点,所以redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006)。

[root@test1 ~]# cd /usr/local/
[root@test1 local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src
[root@test1 local]# mkdir cluster
[root@test1 local]# cd cluster/
[root@test1 cluster]# mkdir 700{1..6}
[root@test1 cluster]# ls
7001  7002  7003  7004  7005  7006
[root@test1 cluster]# cd 7001/
[root@test1 7001]# vim redis.conf

port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

[root@test1 7001]# cd
[root@test1 ~]# cd redis-4.0.8/src/
[root@test1 src]# cp redis-trib.rb /usr/local/bin/
[root@test1 src]# cd

[root@test1 ~]# yum install -y rubygems-1.3.7-5.el6.noarch.rpm ruby-2.2.3-1.el6.x86_64.rpm libyaml-0.1.3-4.el6_6.x86_64.rpm

[root@test1 ~]# gem install --local redis-4.0.1.gem                      //这些资源须自行下载

[root@test1 ~]# gem list --local

[root@test1 ~]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@test1 ~]# chkconfig redis_6379 off
[root@test1 ~]# cd /usr/local/cluster
[root@test1 cluster]# cd 7001/

[root@test1 7001]# vim redis.conf

port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes         //指定是否在每次更新操作后进行日志记录,redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电 时导致一段时间内数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内置 存在于内存中。默认为no

daemonzie yes                    //redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程:

pidfile /var/run/redis.pid           //当redis以守护进程方式运行时,redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定

logfile /usr/local/cluster/7001/redis.log

[root@test1 7001]# touch redis.log

[root@test1 7001]# redis-server redis.conf            //启动服务

[root@test1 7001]# cat redis.log    //查看日志

[root@test1 7001]# cat /proc/sys/net/core/somaxconn

[root@test1 7001]# echo 511 > /proc/sys/net/core/somaxconn
[root@test1 7001]# sysctl -w vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@test1 7001]# vim /etc/sysctl.conf
[root@test1 7001]# echo never > /sys/kernel/mm/transparent_hugepage/enabled

[root@test1 7001]# cp redis.conf ../7002/
[root@test1 7001]# cp redis.conf ../7003
[root@test1 7001]# cp redis.conf ../7004
[root@test1 7001]# cp redis.conf ../7005
[root@test1 7001]# cp redis.conf ../7006

[root@test1 7001]# cd ../7002
[root@test1 7002]# vim redis.conf            //将端口改为7002

port 7002

[root@test1 7002]# touch redis.log

[root@test1 7002]# redis-server redis.conf

[root@test1 7001]# cat redis.log    //查看日志,是否有报错

//以此类推,切换到7003 7004 7005 7006 并将其对应配置文件的端口改为7003 7004 7005 7006后重启并查看配置文件是否有报错

[root@test1 7006]# ps ax            //查看进程是否打开

[root@test1 7006]# redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7006 to 127.0.0.1:7002
Adding replica 127.0.0.1:7004 to 127.0.0.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: ef39d7b9c63cfce969ba0fec6112d26a621a9ed4 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
M: 50164d159a1975dd509a65e441893883fa097159 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
M: 6b2f4d1bd89a82160786e286e2dd81474cd7de38 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
S: f451e795057133c384ad1d29993e22a190439afc 127.0.0.1:7004
   replicates 6b2f4d1bd89a82160786e286e2dd81474cd7de38
S: e92729b4589d41be6b52fef2387a62b63ada606e 127.0.0.1:7005
   replicates ef39d7b9c63cfce969ba0fec6112d26a621a9ed4
S: 3a8db69457f1c8f52f5c66e47fe48f92baff78f5 127.0.0.1:7006
   replicates 50164d159a1975dd509a65e441893883fa097159
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: ef39d7b9c63cfce969ba0fec6112d26a621a9ed4 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: f451e795057133c384ad1d29993e22a190439afc 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 6b2f4d1bd89a82160786e286e2dd81474cd7de38
S: e92729b4589d41be6b52fef2387a62b63ada606e 127.0.0.1:7005
   slots: (0 slots) slave
   replicates ef39d7b9c63cfce969ba0fec6112d26a621a9ed4
M: 6b2f4d1bd89a82160786e286e2dd81474cd7de38 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 3a8db69457f1c8f52f5c66e47fe48f92baff78f5 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 50164d159a1975dd509a65e441893883fa097159
M: 50164d159a1975dd509a65e441893883fa097159 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

[root@test1 7006]# redis-trib.rb check 127.0.0.1:7001

>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: ef39d7b9c63cfce969ba0fec6112d26a621a9ed4 127.0.0.1:7001               //replicates可以看出,7001是7005的master
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: f451e795057133c384ad1d29993e22a190439afc 127.0.0.1:7004      
   slots: (0 slots) slave
   replicates 6b2f4d1bd89a82160786e286e2dd81474cd7de38
S: e92729b4589d41be6b52fef2387a62b63ada606e 127.0.0.1:7005             
   slots: (0 slots) slave
   replicates ef39d7b9c63cfce969ba0fec6112d26a621a9ed4
M: 6b2f4d1bd89a82160786e286e2dd81474cd7de38 127.0.0.1:7003               //7003是7004的master
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 3a8db69457f1c8f52f5c66e47fe48f92baff78f5 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 50164d159a1975dd509a65e441893883fa097159
M: 50164d159a1975dd509a65e441893883fa097159 127.0.0.1:7002                //7002是7006的master
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

7001 7002 7003是master

[root@test1 7006]# cd ../7001
[root@test1 7001]# redis-cli -c -p 7001               //登陆进入7001
127.0.0.1:7001> set name westos                  //存入数据
-> Redirected to slot [5798] located at 127.0.0.1:7002                //数据自动写入7002
OK
127.0.0.1:7002> get name            //查看数据
"westos"
127.0.0.1:7002>
[root@test1 7001]# redis-cli -c -p 7004                //登陆进入7004
127.0.0.1:7004> get name                     //查看name会跳转到7002
-> Redirected to slot [5798] located at 127.0.0.1:7002
"westos"
127.0.0.1:7002>
[root@test1 7001]# redis-cli -c -p 7005                //登陆进入7005
127.0.0.1:7005> get name                 //查看name会跳转到7002
-> Redirected to slot [5798] located at 127.0.0.1:7002        
"westos"

[root@test1 7001]# ps ax              //查看7002的进程id

1282 ?        Ssl    0:02 redis-server *:7001 [cluster]
 1316 ?        Ssl    0:02 redis-server *:7002 [cluster]
 1347 ?        Ssl    0:02 redis-server *:7003 [cluster]
 1359 ?        Ssl    0:02 redis-server *:7004 [cluster]
 1366 ?        Ssl    0:02 redis-server *:7005 [cluster]
 1374 ?        Ssl    0:02 redis-server *:7006 [cluster]

[root@test1 7001]#  kill 1316           //杀死7002

[root@test1 7001]# redis-cli -c -p 7002        //登陆发现登陆不上

[root@test1 7001]# redis-cli -c -p 7005             //此时集群是好的
127.0.0.1:7005> get name
-> Redirected to slot [5798] located at 127.0.0.1:7006
"westos"
127.0.0.1:7006>
[root@test1 7001]# cd ../7002/
[root@test1 7002]# redis-server redis.conf                //重启7002
[root@test1 7002]# redis-trib.rb check 127.0.0.1:7001                   //此时7002由master变为slave

[root@test1 7002]# ps -ax                 //查看进程id

[root@test1 7002]# kill 1374              //杀死7006
[root@test1 7002]# kill 1409              //杀死7002
[root@test1 7002]# redis-cli -c -p 7001      //登陆7001
127.0.0.1:7001> get name               //发现集群已经挂掉
(error) CLUSTERDOWN The cluster is down
127.0.0.1:7001>
[root@test1 7002]# redis-server redis.conf           //重启7002
[root@test1 7002]# cd ../7006
[root@test1 7006]# redis-cli -c -p 7001              //发现集群状态恢复
127.0.0.1:7001> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"westos"
127.0.0.1:7002>
[root@test1 7006]# redis-server redis.conf                             //重启7006
[root@test1 7006]# redis-cli -c -p 7001
127.0.0.1:7001> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"westos"

若将两个redis的master挂掉,挂掉7001和7003,则发现此时集群挂掉:

相关文章:

对学习编译原理的看法

我认为编译原理这本书是一门与代码做斗争的课程,学习编译原理能够追寻程序设计语言的本质,了解计算机各种语言编译的原理。学习了编译原理能够更加深入的了解计算机各种高级语言使用的原理,能使自己更加容易更加好的学习好程序语言&#xff0…

iOS提示气泡,带动画

1.效果如图: 从项目中抠出来的,做了简单的封装。 2.用法: //顶部提示HYNoticeView *noticeTop [[HYNoticeView alloc] initWithFrame:CGRectMake(50, 66, 250, 40) text:"这里可以查询全城婚礼人的档期哦!" position:…

GIt/Github常用命令

1)git init:初始化本地仓库 2)创建文件:touch read.txt 3)当操作本地的文件时,使用常用的命令,如(mv,ls。。)就可以操作,当操作暂存区的文件时需要在命令前家…

python练习题(python之“求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数” 等)

实验环境:python2.7 题目1:python之“求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数”程序: import math def factorial(n): #定义一个函数,返回一个数的阶乘 if n0: return 1 else: sumn*factorial(n-…

【动画1】UIView动画

讲一下动画。将分为以下5篇博客。 一)UIView动画 二)Layer动画 三)3D动画 四)转场动画 五)第三方动画框架 相关代码:https://github.com/dolacmeng/AnimationDemo 参考资料:iOS Animation…

【python】解压文件

参考:http://essen.iteye.com/blog/1941489 tarfile模块 具体使用方法: https://docs.python.org/2/library/tarfile.html 例子:一次性解压所有文件 import tarfilet tarfile.open("abc.tgz", "r:gz")t.extractall(path…

JS设计模式——3.封装与信息隐藏

封装、信息隐藏与接口的关系 信息隐藏是目的,封装是手段。 接口提供了一份记载着可供公共访问的方法的契约。它定义了两个对象间可以具有的关系。只要接口不变,这个关系的双方都是可以替换的。 一个理想的软件系统应该为所有类定义接口。 创建对象的基本…

nginx源码编译、负载均衡及模块的扩展

1、nginx源码编译 实验环境: iptables和selinux关闭 redhat6.5 nginx:test1: 172.25.1.11 [roottest1 ~]# ls nginx-1.14.0.tar.gz [roottest1 ~]# tar zxf nginx-1.14.0.tar.gz [roottest1 ~]# useradd -s /sbin/nologin nginx [roottest1 ~]# i…

LinkedHashMap and LinkedHashSet

LinkedHashMap实现了Map接口,是HashMap的直接子类,它同时满足HashMap和linked list的某些特性。可将LinkedHashMap看作采用linked list增强的HashMap。 LinkedHashMap在HashMap的基础上,采用双向链表(doubly-linked list&#xff…

Windows Phone开发(19):三维透视效果

Windows Phone开发(19):三维透视效果 原文:Windows Phone开发(19):三维透视效果 三维效果也可以叫透视效果,所以,我干脆叫三维透视效果。理论知识少讲,直接用例开场吧&am…

【动画2】CALayer动画

一)UIView动画 二)CoreAnimation动画 前言:上一篇已经介绍了UIKit给我们封装好的UIView动画的使用,UIKit动画是建立在CoreAnimation动画之上的,CoreAnimation是直接作用于CALayer上而非UIView。一、CoreAnimation动画…

nginx+tomcat+memcache实现负载均衡、session共享

实验架构图: Table of Contents 1、配置tomcat 2、安装memcache 3、查看tomcat和memcache是否配置好 4、nginx实现负载均衡: 5、客户端进行测试: 6、验证结论: 7、总结: 实验环境: linux redhat6.…

(转)二叉树系列面试问题

转自 :http://blog.csdn.net/luckyxiaoqiang/article/details/7518888/ 版权所有,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/7518888 树是一种比较重要的数据结构,尤其是二叉树。二…

百度UEditor开发案例(JSP)

本案例的开发环境:MyEclipsetomcatjdk 本案例的开发内容:用百度编辑器发布新闻(UEditor的初始化开发部署)编辑已发过的新闻(UEditor的应用——编辑旧文章)上传附件、图片等 由于百度编辑器强大的功能&a…

iOS中的动力学:Dynamics【1】

iOS7建议我们创建的界面具有物理特性,而不只是像素的集合,可以响应触摸、手势、屏幕方向改变等事件,让用户与界面之间有更深入的交互,而不是像iOS6那样在软件界面上模仿现实世界的纹理而已。或许你会认为创建感觉上真实的界面比创…

自动化运维工具Saltstack(一)

1、saltstack简介: 什么是saltstack? saltstack是基于python开发的一套C/S架构配置管理工具 使用SSL证书签方的方式进行认证管理 号称世界上最快的消息队列ZeroMQ使得SaltStack能快速在成千上万台机器上进行各种操作 采用RSA Key方式确认身份 传输采用AE…

【UIDynamic例子】挂起的方块

通过前面的动力学小Demo(本文默认你已经看过这篇Blog:传送门),我们对UIKit中的UIDynamic已经有了初步的认识。现在我们写个更加有趣的Demo:模拟一个用弹性绳子挂起的小方块,用户可以将它拖动到屏幕任意位置…

IIS7 配置PHP服务器

安装PHP Manager: 1)访问 http://phpmanager.codeplex.com/releases/view/69115 下载PHP Manager。其中,x86 为32位 Windows 系统使用,x64 为64位 Windows 系统使用,请根据使用的 Windows 系统情况下载 2)下…

在文本框中提示用户输入内容格式的方法

希望达到的效果&#xff1a; 方法一&#xff1a;鼠标点击文本框时文字消失 <input id"login_name" type"text" οnblur"javascript:check_login_name();" οnfοcus"if(this.value支持英文及数字组合) this.value;this.style.color#000&…

saltstack实现haproxy+keepalived负载均衡+高可用(二)

一键部署haproxykeepalived实现负载均衡高可用 实验环境&#xff1a; &#xff01;&#xff01;&#xff01;&#xff01; 特别注意&#xff1a; www.westos.org为test1的minion名字 test1: 172.25.1.11 nginx master minion test2: 172.25.…

iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)

新建一个Category&#xff0c;命名为UIColorHex&#xff0c;表示UIColor支持十六进制Hex颜色设置。 UIColorHex.h文件&#xff0c; #import <UIKit/UIKit.h> #define RGBA_COLOR(R, G, B, A) [UIColor colorWithRed:((R) / 255.0f) green:((G) / 255.0f) blue:((B) / 255…

iOS顶部菜单栏

封装的一个顶部菜单栏&#xff0c;使用懒加载&#xff08;选择后加载当前页及前后各一页&#xff09;&#xff0c;自适应标题长度。 下载&#xff1a; Github&#xff1a;https://github.com/dolacmeng/JXChannelSegment 用法&#xff1a; //init Segment segment [[JXSegme…

Mac环境下svn的使用

CHENYILONG BlogMac环境下svn的使用 Mac环境下svn的使用 在Windows环境中&#xff0c;我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下&#xff0c;由于Mac自带了svn的服务器端和客户端功能&#xff0c;所以我们可以在不装任何第三方软件的前提下使用svn功能&#xff0c;不…

zabbix简介及基本安装(一)

zabbix简单介绍&#xff1a; 官网&#xff1a;可以进官网查看一下&#xff1a;https://www.zabbix.com/cn/ //英语能力有限的读者可以将由上角的语言调成汉语方便查看 功能&#xff1a;网络监控、服务器监控、云监控、服务监控等。 介绍&#xff1a;zabbix&#xff08;[…

顺序表应用6:有序顺序表查询

顺序表应用6&#xff1a;有序顺序表查询 Time Limit: 7MS Memory Limit: 700KBSubmit StatisticProblem Description 顺序表内按照由小到大的次序存放着n个互不相同的整数&#xff08;1<n<20000)&#xff0c;任意输入一个整数&#xff0c;判断该整数在顺序表中是否存在。…

LA 5717枚举+最小生成树回路性质

1 /*LA 57172 《训练指南》P3433 最小生成树的回路性质4 在生成的最小生成树上&#xff0c;新增一条边e(u,v)5 若原图上u到v的路径的最大边大于e&#xff0c;则删除此边&#xff0c;加上e&#xff0c;否则不变。6 7 若原图上u到v的路径的最大边的产生&#xff1a;BFS/DFS都可 &…

【Runtime】动态添加方法demo

今天写一个小demo来演示下runtime的消息转发和动态添加方法。 一般项目中都会有保存当前登录用户资料的需求&#xff0c;我们可以直接将登录成功后的用户信息分别保存到NSUserDefaults中&#xff1a; [def setObject:"JackXu" forKey:"UserName"];[def set…

Zabbix之主机的添加与删除(二)

接着上一篇内容继续讲&#xff1a; 环境等都是建立在上一篇内容的基础上的&#xff0c;见https://blog.csdn.net/weixin_41922887/article/details/83755271 redhat6 test1: 172.25.1.11 zabbix-agent redhat7 server: 172.25.1.1 …

昨天网上感觉好冷,睡在席子上都是感觉打哈欠

今天爸妈也是休息一天&#xff0c;中午听说是要到外婆家去&#xff0c;不过家里就不知道会不会有一个团圆聚餐了&#xff0c;还有伴月就是国庆解&#xff0c;那时就要吧这个推掉值班的事情做好下。 转载于:https://www.cnblogs.com/bkchengzheng/p/5874328.html

几行代码实现神奇移动的过渡动画

1.效果如图&#xff1a; 2.实现&#xff1a; 假设需求为如上图&#xff0c;点击ViewController01后&#xff0c;ViewController01上的两张图片&#xff0c;移动到ViewContoller02中&#xff0c;其实两个ViewController的View上分别放置了这两张图&#xff0c;JXMagicMove就是实…