生产环境中准备使用redis3.0集群了,花了一天时间研究了一下,下面记录一下集群搭建的过程。
服务器规划:
192.168.116.129    7000,7003
192.168.116.130    7001,7004
192.168.116.131    7002,7005
 
一、安装redis
3台服务器,每台上面安装2个redis实例。
安装步骤如下:
wget http://download.redis.io/releases/redis-3.0.4.tar.gz
tar redis-3.0.4.tar.gz
cd redis-3.0.4
make
make install
mv redis-3.0.4 /app/sinova/redis
cd /app/sinova/redis
mkdir bin,conf,rdb,log
mv redis.conf sentinel.conf conf
find -maxdepth 1 -type f -delete
cd src
mv mkreleasehdr.sh redis-benchmark redis-sentinel redis-server redis-cli redis-check-aof redis-check-dump redis-trib.rb ../bin/
mv redis-3.0.4 /app/sinova/redis
cp -r redis redis2

二、配置redis

redis.conf修改内容:
daemonize yes
pidfile /app/sinova/redis/log/redis.pid
port 7000 #不同实例用不同端口
logfile "/app/sinova/redis/log/redis.log" #不同实例定义不同路径
dir /app/sinova/redis/rdb #定义dump.rdb和appendonly.aof文件存放路径
appendonly yes #开启AOF持久化
cluster-enabled yes
cluster-config-file nodes-7000.conf #不同实例需修改端口
cluster-node-timeout 5000
 
三、启动redis并创建集群
1、启动redis,3台服务器分别执行以下命令
/app/sinova/redis/bin/redis-server  /app/sinova/redis/conf/redis.conf
/app/sinova/redis2/bin/redis-server /app/sinova/redis2/conf/redis.conf
2、创建集群
命令如下:
/app/sinova/redis/bin/redis-trib.rb create --replicas 1 192.168.116.130:7000 192.168.116.129:7001 192.168.116.131:7002 192.168.116.130:7003 192.168.116.129:7004 192.168.116.131:7005

执行以上命令后redis-trib会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中。

输入 yes 并按下回车确认之后, 集群就会将配置应用到各个节点, 并连接起(join)各个节点 —— 也即是, 让各个节点开始互相通讯,如果一切正常, redis-trib 将输出以下信息:
注:由于redis-trib.rb是用ruby写的,如果在创建集群过程遇到ruby相关的报错,可以执行以下命令先解决环境问题:
yum -y install ruby rubygems
gem install redis  #安装redis 的api 接口
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Creating cluster 
Connecting to node 192.168.116.130:7000: OK
Connecting to node 192.168.116.129:7001: OK
Connecting to node 192.168.116.131:7002: OK
Connecting to node 192.168.116.130:7003: OK
Connecting to node 192.168.116.129:7004: OK
Connecting to node 192.168.116.131:7005: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.116.129:7001
192.168.116.131:7002
192.168.116.130:7000
Adding replica 192.168.116.131:7005 to 192.168.116.129:7001
Adding replica 192.168.116.129:7004 to 192.168.116.131:7002
Adding replica 192.168.116.130:7003 to 192.168.116.130:7000
M: 7bef1e428364f2323a300fc47553889117c6e2fa 192.168.116.130:7000
   slots:10923-16383 (5461 slots) master
M: 794da90978e2bd501eb2a45e1f66458d9a4c70cf 192.168.116.129:7001
   slots:0-5460 (5461 slots) master
M: 7c075df721b8e7524e4732174307ea724e4d49d0 192.168.116.131:7002
   slots:5461-10922 (5462 slots) master
S: 8c36b569793c1580ae1fb6e7c198ea5d291abb56 192.168.116.130:7003
   replicates 7bef1e428364f2323a300fc47553889117c6e2fa
S: c632d284b9ab38100984d15fa65c005ca12bb438 192.168.116.129:7004
   replicates 7c075df721b8e7524e4732174307ea724e4d49d0
S: 93752d84dc8dd430a439644f0dd3288ff3b50a49 192.168.116.131:7005
   replicates 794da90978e2bd501eb2a45e1f66458d9a4c70cf
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 192.168.116.130:7000)
M: 7bef1e428364f2323a300fc47553889117c6e2fa 192.168.116.130:7000
   slots:10923-16383 (5461 slots) master
M: 794da90978e2bd501eb2a45e1f66458d9a4c70cf 192.168.116.129:7001
   slots:0-5460 (5461 slots) master
M: 7c075df721b8e7524e4732174307ea724e4d49d0 192.168.116.131:7002
   slots:5461-10922 (5462 slots) master
M: 8c36b569793c1580ae1fb6e7c198ea5d291abb56 192.168.116.130:7003
   slots: (0 slots) master
   replicates 7bef1e428364f2323a300fc47553889117c6e2fa
M: c632d284b9ab38100984d15fa65c005ca12bb438 192.168.116.129:7004
   slots: (0 slots) master
   replicates 7c075df721b8e7524e4732174307ea724e4d49d0
M: 93752d84dc8dd430a439644f0dd3288ff3b50a49 192.168.116.131:7005
   slots: (0 slots) master
   replicates 794da90978e2bd501eb2a45e1f66458d9a4c70cf
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
3、客户端测试
命令:redis-cli -h 192.168.116.130 -c -p 7000
 
通过测试发现任何一个实例,都能写入,查询,redis集群会自动通过内部算法选举。
redis有16个database,如果不指定,默认使用db0,不同的database可以使用相同的key。数据库的选择,使用select命令。
集群模式不支持select。
检测集群是否正常:
$ /app/sinova/redis/bin/redis-trib.rb check 192.168.116.131:7005
Connecting to node 192.168.116.131:7005: OK
Connecting to node 192.168.116.131:7002: OK
Connecting to node 192.168.116.130:7000: OK
Connecting to node 192.168.116.129:7001: OK
Connecting to node 192.168.116.130:7003: OK
Connecting to node 192.168.116.129:7004: OK
>>> Performing Cluster Check (using node 192.168.116.131:7005)
S: 93752d84dc8dd430a439644f0dd3288ff3b50a49 192.168.116.131:7005
   slots: (0 slots) slave
   replicates 794da90978e2bd501eb2a45e1f66458d9a4c70cf
M: 7c075df721b8e7524e4732174307ea724e4d49d0 192.168.116.131:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 7bef1e428364f2323a300fc47553889117c6e2fa 192.168.116.130:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: 794da90978e2bd501eb2a45e1f66458d9a4c70cf 192.168.116.129:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 8c36b569793c1580ae1fb6e7c198ea5d291abb56 192.168.116.130:7003
   slots: (0 slots) slave
   replicates 7bef1e428364f2323a300fc47553889117c6e2fa
S: c632d284b9ab38100984d15fa65c005ca12bb438 192.168.116.129:7004
   slots: (0 slots) slave
   replicates 7c075df721b8e7524e4732174307ea724e4d49d0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
 
查看集群中的master
/app/sinova/redis/bin/redis-cli -h 192.168.116.131 -p 7005 cluster nodes|grep master
查看集群中的slave
/app/sinova/redis/bin/redis-cli -h 192.168.116.131 -p 7005 cluster nodes|grep slave
 
四、故障转移测试
1、首先查看master/slave分布情况
2、挑选一个master节点,set一条数据,然后杀掉此master进程。
3、查看新的master/slave分情况(正常情况下会有slave升级为master)
4、在新升级的master里get之前set的数据,查看是否正常。
5、启动之前杀的master redis,验证是否会加入slave的行列。
6、重新查看master/slave分布情况。
7、杀掉存入数据的hash slot的redis节点,验证客户端是否可以从用其它节点获取数据。
具体过程参见如下截图:

 
 
 
 
五、添加新的节点到集群中

当机器不够用了怎么办?就需要扩容集群了。根据新添加节点的种类, 我们需要用两种方法来将新节点添加到集群里面:
1>如果要添加的新节点是一个主节点, 那么我们需要创建一个空节点(empty node), 然后将某些哈希桶移动到这个空节点里面。
2>如果要添加的新节点是一个从节点, 那么我们需要将这个新节点设置为集群中某个节点的复制品(replica)。
接下来会对以上两种情况进行测试, 首先测试主节点的添加方法, 然后再测试从节点的添加方法。
无论添加的是那种节点, 第一步要做的总是添加一个空节点。
我们可以继续使用之前启动 192.168.116.130:7000 、 192.168.116.129:7001 等节点的方法, 创建一个端口号为 7006的新节点, 使用的配置文件也和之前一样, 只是记得要将配置中的端口号改为 7000 。
以下是启动端口号为 7006 的新节点的详细步骤:
在192.168.116.130这台服务器上安装一个新的redis实例,端口使用7006。
使用命令 ../../redis-server redis.conf 启动节点。
如果一切正常, 那么节点应该会正确地启动。

添加主节点步骤如下:
1、启动新安装好的redis实例(端口7006)
/app/sinova/redis3/bin/redis-server /app/sinova/redis3/conf/redis.conf
2、将这个新节点添加到集群里面
/app/sinova/redis3/bin/redis-trib.rb add-node 192.168.116.130:7006 192.168.116.131:7005
命令中的 add-node 表示我们要让 redis-trib 将一个节点添加到集群里面, addnode 之后跟着的是新节点的 IP 地址和端口号, 再之后跟着的是集群中任意一个已存在节点的 IP 地址和端口号, 这里我们使用的是 192.168.116.131:7005 。
命令执行成功后的信息:
$ /app/sinova/redis3/bin/redis-trib.rb add-node 192.168.116.130:7006 192.168.116.131:7005
>>> Adding node 192.168.116.130:7006 to cluster 192.168.116.131:7005
Connecting to node 192.168.116.131:7005: OK
Connecting to node 192.168.116.129:7001: OK
Connecting to node 192.168.116.130:7003: OK
Connecting to node 192.168.116.130:7000: OK
Connecting to node 192.168.116.129:7004: OK
Connecting to node 192.168.116.131:7002: OK
>>> Performing Cluster Check (using node 192.168.116.131:7005)
S: 1a4c26acd5dd77c30c89fb6c19b43a1895492196 192.168.116.131:7005
   slots: (0 slots) slave
   replicates 1d19da785ddb633a102224a6bfeebed58707bd4c
S: 40028659fbdf7e059ca2c6bdaef8753f22e8a4b9 192.168.116.129:7001
   slots: (0 slots) slave
   replicates ab99fc3fd207e14d5db047ff7273521d0d7d4eb6
S: 6d7defec0ec9705b7931bc527bcde8c8441e7fd3 192.168.116.130:7003
   slots: (0 slots) slave
   replicates f3e8cccb5517c8225b77c6238c1a8cad8cab9e2c
M: 1d19da785ddb633a102224a6bfeebed58707bd4c 192.168.116.130:7000
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: ab99fc3fd207e14d5db047ff7273521d0d7d4eb6 192.168.116.129:7004
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: f3e8cccb5517c8225b77c6238c1a8cad8cab9e2c 192.168.116.131:7002
   slots:0-5460 (5461 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.
Connecting to node 192.168.116.130:7006: OK
>>> Send CLUSTER MEET to node 192.168.116.130:7006 to make it join the cluster.
[OK] New node added correctly.
通过cluster nodes命令可以查看到新添加的节点。

从上面的截图可以看到新节点现在已经连接上了集群, 成为集群的一份子, 并且可以对客户端的命令请求进行转向了, 但是和其他主节点相比, 新节点还有两点区别:
1>新节点没有包含任何数据, 因为它没有包含任何哈希桶。
2>尽管新节点没有包含任何哈希桶, 但它仍然是一个主节点, 所以在集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中。

3、手动对集群重新分片
使用 redis-trib 程序, 将集群中的某些哈希桶移动到新节点里面, 新节点就会成为真正的主节点了。
命令如下,只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点。
$ /app/sinova/redis/bin/redis-trib.rb reshard 192.168.116.129:7001
Connecting to node 192.168.116.129:7001: OK
Connecting to node 192.168.116.129:7004: OK
Connecting to node 192.168.116.131:7002: OK
Connecting to node 192.168.116.130:7006: OK
Connecting to node 192.168.116.130:7003: OK
Connecting to node 192.168.116.130:7000: OK
Connecting to node 192.168.116.131:7005: OK
>>> Performing Cluster Check (using node 192.168.116.129:7001)
S: 40028659fbdf7e059ca2c6bdaef8753f22e8a4b9 192.168.116.129:7001
   slots: (0 slots) slave
   replicates ab99fc3fd207e14d5db047ff7273521d0d7d4eb6
M: ab99fc3fd207e14d5db047ff7273521d0d7d4eb6 192.168.116.129:7004
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: f3e8cccb5517c8225b77c6238c1a8cad8cab9e2c 192.168.116.131:7002
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 8d9502f97b416a566e0de1e33f665b7358fe807f 192.168.116.130:7006
   slots: (0 slots) master
   0 additional replica(s)
S: 6d7defec0ec9705b7931bc527bcde8c8441e7fd3 192.168.116.130:7003
   slots: (0 slots) slave
   replicates f3e8cccb5517c8225b77c6238c1a8cad8cab9e2c
M: 1d19da785ddb633a102224a6bfeebed58707bd4c 192.168.116.130:7000
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 1a4c26acd5dd77c30c89fb6c19b43a1895492196 192.168.116.131:7005
   slots: (0 slots) slave
   replicates 1d19da785ddb633a102224a6bfeebed58707bd4c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4000       #设定移动hash slots的数量,这里我们设置的是4000
What is the receiving node ID? 8d9502f97b416a566e0de1e33f665b7358fe807f  # 7006节点的ID可以通过/app/sinova/redis/bin/redis-cli -c -h 192.168.116.131 -p7002 cluster nodes|grep master 命令查看到,第1列即是。
......
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:all# 这里的意思是redis-trib 会向你询问重新分片的源节点(source node), 也即是, 要从哪个节点中取出 4000 个哈希槽, 并将这些槽移动到目标节点上面。如果我们不打算从特定的节点上取出指定数量的哈希槽, 那么可以向 redis-trib 输入 all , 这样的话, 集群中的所有主节点都会成为源节点, redis-trib 将从各个源节点中各取出一部分哈希槽, 凑够 4000 个, 然后移动到目标节点上面.
.....
Moving slot 12252 from ab99fc3fd207e14d5db047ff7273521d0d7d4eb6
Moving slot 12253 from ab99fc3fd207e14d5db047ff7273521d0d7d4eb6
Moving slot 12254 from ab99fc3fd207e14d5db047ff7273521d0d7d4eb6
Moving slot 12255 from ab99fc3fd207e14d5db047ff7273521d0d7d4eb6
Do you want to proceed with the proposed reshard plan (yes/no)? yes #输入 yes 并使用按下回车之后, redis-trib 就会正式开始执行重新分片操作, 将指定的哈希槽从源节点一个个地移动到目标节点上面
.....
Moving slot 12253 from 192.168.116.129:7004 to 192.168.116.130:7006:
Moving slot 12254 from 192.168.116.129:7004 to 192.168.116.130:7006:
Moving slot 12255 from 192.168.116.129:7004 to 192.168.116.130:7006: 
4、重新检查集群是否正常
查看hast slots在新节点的分布情况
查看历史数据在重新分片是否可以重新获取
添加从节点步骤如下:
1、在192.168.116.129这台服务器新安装一个redis实例,并启动新安装好的redis实例(端口7007)
/app/sinova/redis3/bin/redis-server /app/sinova/redis3/conf/redis.conf
2、将这个新节点添加到集群里面
/app/sinova/redis3/bin/redis-trib.rb add-node 192.168.116.129:7007 192.168.116.131:7005
命令中的 add-node 表示我们要让 redis-trib 将一个节点添加到集群里面, addnode 之后跟着的是新节点的 IP 地址和端口号, 再之后跟着的是集群中任意一个已存在节点的 IP 地址和端口号, 这里我们使用的是 192.168.116.131:7005 。
 
新加入的节点(7007)目前是master状态,但没有任何数据
3、现在我们打算让新节点成为 192.168.116.130:7006 的从节点, 那么我们只要用客户端连接上新节点, 然后执行以下命令
/app/sinova/redis/bin/redis-cli -c -h 192.168.116.129 -p 7007

其中8d9502f97b416a566e0de1e33f665b7358fe807f 是主节点的ID。
验证7006和7007端口的redis实否为主从关系:

在新的从节点上面get 数据:

六、附redis cluster命令行命令
集群(cluster)
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。 
节点(node)
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。
槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。
键 (key)
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
 

redis3.0集群搭建的更多相关文章

  1. Centos7:Redis3.0集群搭建

    Redis集群中至少应该有三个节点.要保证集群的高可用,需要每个节点有一个备份机.Redis集群至少需要6台服务器. 搭建伪分布式.可以使用一台虚拟机运行6个redis实例. 修改redis的端口号7 ...

  2. Centos7 Redis3.0 集群搭建备忘

    (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) 127.0.0.1:7000 127.0.0. ...

  3. Redis 3.0 集群搭建

    Redis 3.0 集群搭建 开启两个虚拟机 分别在两个虚拟机上开启3个Redis实例 3主3从两个虚拟机里的实例互为主备 下面分别在两个虚拟机上安装,网络设置参照codis集群的前两个主机 分别关闭 ...

  4. redis3.0集群部署和测试

    redis3.0集群部署和测试 环境介绍 两台Centos7的虚拟机模拟6个节点,A台3个master节点,B台3个slave节点A地址:172.16.81.140B地址:172.16.81.141r ...

  5. Redis 5.0 集群搭建

    Redis 5.0 集群搭建 单机版的 Redis 搭建 https://www.jianshu.com/p/b68e68bbd725 /usr/local/目录 mkdir redis-cluste ...

  6. Ubuntu 12.04下Hadoop 2.2.0 集群搭建(原创)

    现在大家可以跟我一起来实现Ubuntu 12.04下Hadoop 2.2.0 集群搭建,在这里我使用了两台服务器,一台作为master即namenode主机,另一台作为slave即datanode主机 ...

  7. Redis3.0集群方案分析

    在Redis3.0集群出来之前,大家都对作者antirez寄予厚望,因为Redis从来没有让我们失望过.现在Redis3.0集群出来了,网上出了很多评论文章,都说他的功能多么强大,包括下面这张图是彻底 ...

  8. Dubbo入门到精通学习笔记(十八):使用Redis3.0集群实现Tomcat集群的Session共享

    文章目录 1.单节点访问http://192.168.1.61:8082/pay-web-boss/: 2.增加多一个消费者节点:192.168.1.62,以同样的方式部署pay-web-boss工程 ...

  9. redis5.0.0集群搭建【实战经历】

    redis集群搭建 作者:陈土锋 时间:2020年6月2日 目录 一.环境介绍... 1 1.机器准备... 1 2.关闭防护墙和selinux. 1 3.时间同步... 1 二.Redis Clus ...

随机推荐

  1. svn项目冲突时显示无法加载项目的解决方法

    1.无法加载的项目会显示成灰色.这是右键点击编辑  打开后去掉乱字符. 2.完成后会有红色的叹号 这是右键 找到解决冲突即可 然后提交

  2. javascript 封装 构造函数继承 非构造函数继承

    1 封装 把"属性"(property)和"方法"(method),封装成一个对象,甚至要从原型对象生成一个实例对象 1.1 简单封装:var cat1 = { ...

  3. Android手势解锁, 九宫格解锁

    给大家介绍一个很好用的手势解锁控件ShapleLocker, 废话不多先上效果图: 这是一个第三方库, 可自己根据UI需求替换图标: 圆圈, 小箭头等等.. github地址: http://pane ...

  4. Oracle RAC OCR 和 VotingDisk 的备份与恢复

    一:Voting DiskVoting Disk 这个文件主要用于记录节点成员状态,在出现脑裂时,决定那个Partion获得控制权,其他的Partion必须从集群中剔除.Voting disk使用的是 ...

  5. Struts2多文件上传

    第一步:首先创建一个多文件上传的页面 <html> <head> <meta http-equiv="Content-Type" content=&q ...

  6. SQL Server 索引和视图【转】

    Ø 索引 1. 什么是索引 索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度. 2. 索引分类 数据库中索引主要分为两类:聚集索引和非聚集索引.SQL Serv ...

  7. EA UML 建模——类图

    Enterprise Architect(EA) 是一个功能比较强悍的建模工具,本篇文章仅使用其 UML 建模功能,其他更多功能,可以Google. 一.简单梳理C#中类与类.类与接口.接口与接口的关 ...

  8. PHP发送AT指令

    需求: 发送短信到用户输入手机, 要求可以自定义信息内容 问题: 没有电信猫, 使用免费api接口无法自定义短信内容 解决方案: 通过4G网卡, 接在服务器上, 通过AT指令操作网卡, 发送短信 查阅 ...

  9. Linux简单程序实例(GNU工具链,进程,线程,无名管道pipe,基于fd的文件操作,信号,scoket)

    一, GNU工具链简介: (1)编译代码步骤: 预处理 -> 编译 -> 汇编 -> 链接: 预处理:去掉注释,进行宏替换,头文件包含等工作: gcc -E test.c -o te ...

  10. Open judge 07和为给定数

    总时间限制: 1000ms 内存限制: 65536kB 传送门 类似的题传送门 描述 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入 共三行: 第一行是整数n(0 < n < ...