Redis 学习笔记4: Redis 3.2.1 集群搭建

2023-10-27

在CenOS 6.7 linux环境下搭建Redis 集群环境

1、下载最新的Redis版本

         本人下载的Redis版本是3.2.1版本,下载之后,解压,编译(make); 具体操作可以参考我的博文:Redis 学习笔记1:CentOS 6.7下安装Redis

         编译后的redis目录在 /usr/local/redis-3.2.1

2、新建6个目录

[root@itcast01 local]# mkdir 7000 7001 7002 7003 7004 7005
 
 将   /usr/local/redis-3.2.1 目录下的redis文件依次复制到7000~ 7005 目录当中。
[root@itcast01 local]# cp -rf  redis-3.2.1/*  7001
[root@itcast01 local]# cp -rf  redis-3.2.1/*  7001
[root@itcast01 local]# cp -rf  redis-3.2.1/*  7002
[root@itcast01 local]# cp -rf  redis-3.2.1/*  7003
[root@itcast01 local]# cp -rf  redis-3.2.1/*  7004
[root@itcast01 local]# cp -rf  redis-3.2.1/*  7005

3、配置文件redis.conf 

新建一个文件,命名为redis.conf ,内容如下:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
将该配置文件覆盖到到6个目录当中,粘贴覆盖时注意修改port端口,即7000目录下的是7000,7001下的port=7001,以此类推.....
cluster-node-timeout 是集群中各节点相互通讯时,允许"失联"的最大毫秒数,上面的配置为5秒,如果超过5秒某个节点没向其它节点汇报成功,认为该节点挂了。

4、依次启动各个Redis服务

到各个目录下的src目录下,依次执行命令: ./redis-serve r    ../redis.conf 
[root@itcast01 src]# ./redis-server ../redis.conf 

以上是7000的启动,可以看到连接的端口是7000,其余目录的redis 服务连接的端口也是各自配置文件配置的端口.

5、安装Redis 集群需要的 Ruby 工具

          虽然步骤4把6个redis server启动成功了,但是彼此之间是完全独立的,需要借助其它工具将其加入cluster,而这个工具就是redis提供的一个名为redis-trib.rb的ruby脚本, 否则接下来的创建cluster将失败。
在联网状态下安装Ruby ,依次执行如下命令即可:
      
[root@itcast01 src]# yum install ruby
[root@itcast01 src]# yum install rubygems
[root@itcast01 src]# gem install redis

6、创建Redis cluster集群

        仍然保持在每个目录的src子目录下,运行下面这段shell脚本,cluster就创建成功了,replicas 1的意思,就是每个节点创建1个副本(即:slave),所以最终的结果,就是后面的127.0.0.1:7000~127.0.0.1:7005中,会有3个会指定成master,而其它3个会指定成slave。
[root@itcast01 src]# ./redis-trib.rb  create --replicas 1 127.0.0.1:7000 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
注:利用redis-trib创建cluster的操作,只需要一次即可,假设系统关机,把所有6个节点全关闭后,下次重启后,即自动进入cluster模式,不用再次redis-trib.rb create。
用ps查看redis进程,可以看见每个进程后面添加了cluster字样
如果想知道哪些端口的节点是master,哪些端口的节点是slave,可以用下面的命令:
[root@itcast01 src]# ./redis-trib.rb check 127.0.0.1:7000
输出结果如下:
[root@itcast01 src]# ./redis-trib.rb  check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
S: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000
   slots: (0 slots) slave
   replicates 88d693578dd0bdaca9e32422565c624790961bc9
S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 20fbccf06841f7aa699b97bff72ece2f96599236
S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005
   slots: (0 slots) slave
   replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213
M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 88d693578dd0bdaca9e32422565c624790961bc9 127.0.0.1:7003
   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.
从上面的输出,可以看出7002、70001、7003 是master,而7000、7004、 7005 是slave ,除了check参数,还有一个常用的参数info.
[root@itcast01 src]# ./redis-trib.rb  info  127.0.0.1:7000
127.0.0.1:7002 (fbcce8fb...) -> 10 keys | 5461 slots | 1 slaves.
127.0.0.1:7001 (20fbccf0...) -> 6 keys | 5462 slots | 1 slaves.
127.0.0.1:7003 (88d69357...) -> 6 keys | 5461 slots | 1 slaves.
[OK] 22 keys in 3 masters.
它会把所有的master信息输出,包括这个master上有几个缓存key,几个salve ,所有master上的key合计,以及平均每个slot上有多少个key.
若想了解更多redis-trib的使用,可以使用如下参数:
[root@itcast01 src]# ./redis-trib.rb help
输出如下:
[root@itcast01 src]# ./redis-trib.rb help
Usage: redis-trib <command> <options> <arguments ...>

  call            host:port command arg arg .. arg
  del-node        host:port node_id
  set-timeout     host:port milliseconds
  rebalance       host:port
                  --threshold <arg>
                  --use-empty-masters
                  --simulate
                  --auto-weights
                  --weight <arg>
                  --pipeline <arg>
                  --timeout <arg>
  help            (show this help)
  reshard         host:port
                  --slots <arg>
                  --from <arg>
                  --to <arg>
                  --pipeline <arg>
                  --timeout <arg>
                  --yes
  create          host1:port1 ... hostN:portN
                  --replicas <arg>
  info            host:port
  import          host:port
                  --from <arg>
                  --copy
                  --replace
  fix             host:port
                  --timeout <arg>
  add-node        new_host:new_port existing_host:existing_port
                  --master-id <arg>
                  --slave
  check           host:port

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

上面多次出现slot这个词,下面略做解释下:
如上图,redis-cluster把整个集群的存储空间划分为16384个slot(译为:插槽?),当6个节点分为3主3从时,相当于整个cluster中有3组HA的节点,3个master会平均分摊所有slot,每次向cluster中的key做操作时(比如:读取/写入缓存),redis会对key值做CRC32算法处理,得到一个数值,然后再对16384取模,通过余数判断该缓存项应该落在哪个slot上,

7、redis-cli 客户端操作

[root@itcast01 src]# ./redis-cli -c -h localhost -p 7000
注意 -c 参数,表示进入cluster集群模式,随便添加一个缓存试试。
[root@itcast01 src]# ./redis-cli -c -h localhost -p 7000
localhost:7000> set cc 123
-> Redirected to slot [700] located at 127.0.0.1:7003
OK
127.0.0.1:7003> 
注意第二行的输出,表示cc这个缓存通过计算后,落在700这个slot,最终定位在7003这个端口对应的节点上 (注:因为7000是slave,7003是master,只有master才能写入)如果是在7003上面重复上面的操作时,不会出现上面的操作。

8、FailOver测试

先用redis-cli查看当前的主从情况
[root@itcast01 src]# ./redis-trib.rb  check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
S: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000
   slots: (0 slots) slave
   replicates 88d693578dd0bdaca9e32422565c624790961bc9
S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 20fbccf06841f7aa699b97bff72ece2f96599236
S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005
   slots: (0 slots) slave
   replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213
M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 88d693578dd0bdaca9e32422565c624790961bc9 127.0.0.1:7003
   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.
从输出上看出,7000是7003( 88d693578dd0bdaca9e32422565c624790961bc9)的slave  ,现在我们人工把7003的redis进程给kill掉,然后观察7000的终端输出:
3342:S 21 Jul 09:43:39.831 * Connecting to MASTER 127.0.0.1:7003
3342:S 21 Jul 09:43:39.831 * MASTER <-> SLAVE sync started
3342:S 21 Jul 09:43:39.831 # Error condition on socket for SYNC: Connection refused
3342:S 21 Jul 09:43:40.135 * Marking node 88d693578dd0bdaca9e32422565c624790961bc9 as failing (quorum reached).
3342:S 21 Jul 09:43:40.135 # Start of election delayed for 720 milliseconds (rank #0, offset 2241).
3342:S 21 Jul 09:43:40.135 # Cluster state changed: fail
3342:S 21 Jul 09:43:40.841 * Connecting to MASTER 127.0.0.1:7003
3342:S 21 Jul 09:43:40.841 * MASTER <-> SLAVE sync started
3342:S 21 Jul 09:43:40.841 # Error condition on socket for SYNC: Connection refused
3342:S 21 Jul 09:43:40.942 # Starting a failover election for epoch 10.
3342:S 21 Jul 09:43:40.965 # Failover election won: I'm the new master.
3342:S 21 Jul 09:43:40.965 # configEpoch set to 10 after successful failover
3342:M 21 Jul 09:43:40.965 * Discarding previously cached master state.
3342:M 21 Jul 09:43:40.966 # Cluster state changed: ok
第6行表明由于70003宕机,cluster状态已经切换到fail状态 ,第5行表示发起枚举 , 第11行表示7000端口对应的节点当选为新的master,用redis-cli check一下:
[root@itcast01 src]# ./redis-trib.rb  check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   0 additional replica(s)
S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 20fbccf06841f7aa699b97bff72ece2f96599236
S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005
   slots: (0 slots) slave
   replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213
M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...

9、cluster扩容

业务规模扩大后,集群需要扩容.下面演示如何再添加两个节点 。跟原先一样,新建两个目录7006,7007,将下载的redis文件各复制一份到这两个目录当中.
并更改其中的redis-conf文件.
[root@itcast01 local]# mkdir 7006 7007
[root@itcast01 local]# cp -rf  redis-3.2.1/*  7006
[root@itcast01 local]# cp -rf  redis-3.2.1/*  7007
做完这些后,启动7006,7007这两个redis节点,此时这两个新节点与cluster没有任何关系,可以用下面的命令将7006作为master添加到cluster中。
[root@itcast01 src]# ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
注:第一个参数为新节点的“”ip:端口“”,第二个参数为集群中的任一有效的节点。一切顺利的话,输出如下:
[root@itcast01 src]# ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
>>> Adding node 127.0.0.1:7006 to cluster 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 20fbccf06841f7aa699b97bff72ece2f96599236
S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005
   slots: (0 slots) slave
   replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213
M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 88d693578dd0bdaca9e32422565c624790961bc9 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 9d81b0624b5080e5304165b07c2ef69a011ec28e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:7006 to make it join the cluster.
[OK] New node added correctly.
我们用redis-tirb check确认下状态
[root@itcast01 src]#  ./redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 20fbccf06841f7aa699b97bff72ece2f96599236
S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005
   slots: (0 slots) slave
   replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213
M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc 127.0.0.1:7006
   slots: (0 slots) master
   0 additional replica(s)
M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 88d693578dd0bdaca9e32422565c624790961bc9 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 9d81b0624b5080e5304165b07c2ef69a011ec28e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
上面的输出已经说明7006是新的master节点了,继续添加新节点。 用下面的命令把7007当成slave加入.
[root@itcast01 src]# ./redis-trib.rb add-node --slave --master-id 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc 127.0.0.1:7007 127.0.0.1:7000
输出如下:
check 一下:
[root@itcast01 src]#  ./redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 9d81b0624b5080e5304165b07c2ef69a011ec28e 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: ebbb23e3206c46eb64035af1a4381e2bb20a0a20 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 20fbccf06841f7aa699b97bff72ece2f96599236
S: b62090a2fd65e1aa4d7053e78c1ff192bd152eb9 127.0.0.1:7005
   slots: (0 slots) slave
   replicates fbcce8fbcf22bb2d6b6f6f56e27b864210087213
M: fbcce8fbcf22bb2d6b6f6f56e27b864210087213 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: bf84939e7e6b066d3d9caf7aae1e1b8e7ca2522c 127.0.0.1:7007
   slots: (0 slots) slave
   replicates 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc
M: 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc 127.0.0.1:7006
   slots: (0 slots) master
   1 additional replica(s)
M: 20fbccf06841f7aa699b97bff72ece2f96599236 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 88d693578dd0bdaca9e32422565c624790961bc9 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 9d81b0624b5080e5304165b07c2ef69a011ec28e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
说明7007已经是7006的slave.

10、reshared 重新划分slot.

增减新的节点之后,问题就来了,16384个slot已经被其它3组节点分完了,新节点没有slot,没办法存放缓存,所以需要将slot重新分布.
[root@itcast01 src]#  ./redis-trib.rb info 127.0.0.1:7000
127.0.0.1:7000 (9d81b062...) -> 8 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (fbcce8fb...) -> 11 keys | 5461 slots | 1 slaves.
127.0.0.1:7006 (8e35ebeb...) -> 0 keys | 0 slots | 1 slaves.
127.0.0.1:7001 (20fbccf0...) -> 7 keys | 5462 slots | 1 slaves.
[OK] 26 keys in 4 masters.
0.00 keys per slot on average.
用下面的命令可以重新分配slot
[root@itcast01 src]# ./redis-trib.rb reshard 127.0.0.1:7000
reshard后面的IP:port,只要是在cluster中的有效节点即可。
[root@itcast01 src]# ./redis-trib.rb reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)

....

M: 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc 127.0.0.1:7006
   slots: (0 slots) master
   1 additional replica(s)
   ....
   
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000  #这里输入要移动多少slot
What is the receiving node ID? 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc   #这里输入目标节点的ID
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   # 将所有node当做源节点
    Moving slot 6455 from 20fbccf06841f7aa699b97bff72ece2f96599236
    Moving slot 6456 from 20fbccf06841f7aa699b97bff72ece2f96599236
    Moving slot 6457 from 20fbccf06841f7aa699b97bff72ece2f96599236
    Moving slot 6458 from 20fbccf06841f7aa699b97bff72ece2f96599236
    Moving slot 6459 from 20fbccf06841f7aa699b97bff72ece2f96599236
    Moving slot 6460 from 20fbccf06841f7aa699b97bff72ece2f96599236
Do you want to proceed with the proposed reshard plan (yes/no)? yes   #确认执行

....
Moving slot 12191 from 127.0.0.1:7002 to 127.0.0.1:7006: 
Moving slot 12192 from 127.0.0.1:7002 to 127.0.0.1:7006: 
Moving slot 12193 from 127.0.0.1:7002 to 127.0.0.1:7006: 
Moving slot 12194 from 127.0.0.1:7002 to 127.0.0.1:7006: 
注: 第一个交互询问,填写多少slot移动时,要好好想想,如果填成16384,则将所有slot都移动到一个固定节点上,会导致更加不均衡!建议每次移动500~1000,这样对线上的影响比较小。
reshard可以多次操作,直到达到期望的分布为止(注:个人觉得redis的reshard这里有点麻烦,要移动多少slot需要人工计算,如果能提供一个参数之类,让16384个slot自动平均分配就好了),调整完成后,可以再看看分布情况:
[root@itcast01 src]#  ./redis-trib.rb info 127.0.0.1:7000  
127.0.0.1:7000 (9d81b062...) -> 12 keys | 7005 slots | 1 slaves.
127.0.0.1:7002 (fbcce8fb...) -> 8 keys | 4189 slots | 1 slaves.
127.0.0.1:7006 (8e35ebeb...) -> 3 keys | 1000 slots | 1 slaves.
127.0.0.1:7001 (20fbccf0...) -> 3 keys | 4190 slots | 1 slaves.

11、删除节点

有扩容,就有删除,删除节点的命令如下:
[root@itcast01 src]# ./redis-trib.rb del-node 127.0.0.1:7006 8e35ebeb7325c79b81e1beee03cc5e56e8334fdc
del-node后面的ip:port只要是cluster中有效节点即可,最后一个参数为目标节点的id
注:只有slave节点和空的master节点可以删除,如果master非空,先用reshard把上面的slot移动到其它node后再删除,如果有一组master-slave节点,将master上所有slot移到其它节点,然后将master删除,剩下的slave会另寻他主,变成其它master的slave。
master非空的话,删除报如下错误:
如下是删除slave 节点7007 ,输出如下:
[root@itcast01 src]# ./redis-trib.rb del-node 127.0.0.1:7006 bf84939e7e6b066d3d9caf7aae1e1b8e7ca2522c
>>> Removing node bf84939e7e6b066d3d9caf7aae1e1b8e7ca2522c from cluster 127.0.0.1:7006
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
删除节点后,也会关闭对应的redis服务.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis 学习笔记4: Redis 3.2.1 集群搭建 的相关文章

随机推荐

  • 深度学习目标检测方法汇总

    目标检测简介 目标检测是计算机视觉的一个重要研究方向 是指从一个场景 或图片 中找到感兴趣的目标 任务大致分为三个流程 从场景中提取候选区 从候选区提取特征 识别候选区的类别并对有效的候选框进行位置精修 目标检测在生活的各个领域都有了广泛的
  • 算法 数列异或操作

    给你两个整数 n和start 其中n为数据的数量 start为第一个数据 当前数据定义为 num start 2 i i表示第几个数据 从0开始 请返回数列中所有数据按位异或 XOR 后得到的结果 示例 1 输入 n 5 start 0 输
  • Kali Linux 下搭建DVWA靶场和Sqli-labs注入环境

    Kali Linux 下搭建DVWA靶场和Sqli labs注入环境 DVWA靶场介绍 DVWA是一款基于PHP和mysql开发的web靶场练习平台 集成了常见的web漏洞如sql注入 xss 密码破解等常见漏洞 适合刚基础网络安全的小白
  • pytorch中的 relu、sigmoid、tanh、softplus 函数

    四种基本激励函数是需要掌握的 1 relu 线性整流函数 Rectified Linear Unit ReLU 又称修正线性单元 是一种人工神经网络中常用的激活函数 activation function 通常指代以斜坡函数及其变种为代表的
  • GMAC RGMII时序校准配置教程

    GMAC RGMII时序校准配置教程 在物联网时代 各种设备都需要联网 而其中以嵌入式系统为主 网络通信系统的核心部件即为MAC与PHY芯片 而针对MAC和PHY芯片之间的接口 有一种双数据率的接口标准 RGMII Reduced Giga
  • 一维数组与对象深拷贝的几种方法(指数组、对象中均无嵌套)

    一 万能for循环 直接上代码 var arr 1 2 3 4 5 var obj name aaaaa age 16 var arr2 copyThat arr var obj2 copyThat obj function copyTha
  • MySQL正确配置my.ini的event_scheduler = ON

    MySQL正确配置my ini的event scheduler ON 让事件的定时调度器常开 如下红框圈出部分 永久性设置方法 为何要在my ini中设置 补充mysql做一个event或job有关文章 让事件的定时调度器常开 如下红框圈出
  • 为什么数组的BUFFSIZE要定义为4096比较好?

    先看一个程序 page 69 include apue h define BUFFSIZE 4096 int main int argc char argv int n char buf BUFFSIZE while n read STDI
  • 高级计算机网络

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 RDT协议 rdt1 0 经完全可靠信道的可靠数据传输特点 rdt2 0 经具有比特差错信道的可靠数据传输 校验和 ACK NAK rdt2 1 考虑处理
  • swagger添加@ApiImplicitParams后出现错误 Required String parameter is not present

    swagger添加 ApiImplicitParams后出现错误 并且会报错 HTTP Status 400 Required String parameter xx is not present 原因是 要求post 但是 请求用的是ge
  • make编译kaldi时候遇到的各种错误

    文章目录 第一个问题 aclocal 1 14 command not found 第一个问题 aclocal 1 14 command not found tools openfst 1 6 7 missing line 81 acloc
  • line-height: 1; line-height: 100%;是什么意思

    先简单看个例子 css 页面 应该猜测出来了 line height 1 line height 100 font size 50px 把哪一个放到最后都是一样的 我理解的就是 等于字体高度的 1 整 份 或者 等于 字体高度的 100 高
  • 《这就是区块链》之区块链基础(5)--去中心化的意义

    在上一篇中 花了比较大的篇幅来阐述去中心化的概念 其实对于有计算机基础的朋友来讲 去中心化或者P2P网络并不是新颖的观点 但是 我还是希望本系列文章可以从基础展开 让所有的朋友都可以理解区块链的意义所在 今天我们来谈谈去中心化到底在区块链中
  • matlab的cylinder函数,Matlab基本函数-cylinder函数

    1 cylinder函数 绘制三维圆柱图 2 用法说明 1 x y z cylinder 函数返回一半径和高度都为1的圆柱体x y z轴的坐标值 圆柱体沿其周长有20个等距分布的点 2 x y z cylinder r 函数一个半径为r 高
  • 第十三章:软件项目管理

    第十三章 软件项目管理 一 软件项目管理总述 1 管理 管理是通过计划 组织和控制等一系列活动 合理地配置和使用各种资源 以达到既定目标的过程 2 软件项目管理 软件项目管理先于任何技术活动之前开始 并且贯穿于软件的整个生命周期之中 软件项
  • 关于新版Win10下安装虚拟机提示“Intel VT-x处于禁用状态”如何解决

    给电脑上安装虚拟机 安装的时候可能会遇到问题 提示 Intel VT x处于禁用状态 问题原因 出现这样的原因一般都是由于系统Virtualization Technology虚拟化技术功能 关闭导致的 解决方法 进入新版Win10的BIO
  • QT代码,重载函数d_func()声明形式分析和调用关系分析

    QT代码 重载函数d func 声明形式分析和调用关系分析 define X DECLARE PRIVATE Class inline Class Private d func return reinterpret cast
  • Linux uboot顶层makefile详解 一

    VERSION 2016 主版本号 PATCHLEVEL 03 补丁版本号 SUBLEVEL 次版本号 EXTRAVERSION 附加版本信息 NAME MAKEFLAGS rR include dir CURDIR rR 表示禁止使用内置
  • 快速复习一遍C++基础知识点

    暂定月计划 1实现DSA基础算法 2完成一个STL库 3在Linux上加强相关知识 4git巩固 5OJ增强代码实现能力 今天先快读复习一遍C 知识点 想把peral读完 1 引用 交换两个数示例 C语言中 void swap int a
  • Redis 学习笔记4: Redis 3.2.1 集群搭建

    在CenOS 6 7 linux环境下搭建Redis 集群环境 1 下载最新的Redis版本 本人下载的Redis版本是3 2 1版本 下载之后 解压 编译 make 具体操作可以参考我的博文 Redis 学习笔记1 CentOS 6 7下