Windows版本redis高可用方案探究
目录
Windows版本redis高可用方案探究
前言
本篇文章专注于讲解redis在windows环境下使用Redis Sentinel(哨兵)实现高可用方案。
想要在windows环境下实现redis高可用,先要准备以下材料或知识点。
- redis 3.2.100
目前在windows版本最新的redis是3.2.100,可以到这里下载 - Redis Sentinel
redis本身不支持高可用方案,通过sentinel对redis进行监控及动态调节等。
搭建redis主从
下载的压缩文件内容如下图所示。
具体结构如下图所示
应用层连接redis集群,集群包括3个redis服务(1主2从)和3个哨兵。
哨兵用于监控主redis可用性。若长时间不可用,则哨兵进行投票选举出新的主redis。原来的主redis降级为从redis。哨兵会将所有redis的配置进行自动更新。
配置主redis-28380
将redis复制一份。一个文件夹用于部署redis服务,一个文件夹用于部署哨兵。
规定redis服务端口为28380~28382。将redis.windiws-service.config改名为redis-28380.conf。打开进行修改。
修改绑定端口
注释掉bind 127.0.0.1
,默认为监听所有ip。将保护模式关闭
修改protected-mode yes
为protected-mode no
,默认redis开启了保护模式,只允许本机通过127.0.0.1访问,其他ip无法访问。修改监听端口
修改port 6379
为port 28380
修改日志等级
修改loglevel debug
为loglevel notice
修改日志文件名
修改logfile "server_log.txt"
为logfile "server_log_28380.txt"
修改windows日志的事件名
修改syslog-ident redis
为syslog-ident "redis-28380"
修改不保存rdb文件
注释掉一下三行,由于rdb会每次全量写文件,当数据量较大时会对redis稳定性造成一定影响,尤其是rbd保存失败时会一定时间内拒绝写入数据。save 900 1
save 300 10
save 60 10000
创建密码
修改# requirepass foobared
为requirepass "test1"
新增masterauth "test1"
若要设置密码,单台redis设置
requirepass
即可。集群redis必须同时设置requirepass
和masterauth
。若主redis没有设置masterauth
当它变为从时,就认为主无密码。若从redis没有设置requirepass
,当它变为主时,会没有密码。以上两种情况自动切换都无法自动连接到新的主。启用aof保存
修改appendonly no
为appendonly yes
修改appendfilename "appendonly.aof"
为appendfilename "appendonly_28380.aof"
aof写入的是redis命令,每次向文件后面添加,因此对IO性能影响较小。最坏情况主redis丢失1s的数据。
配置改好后保存,这个当作主redis的配置。将改配置复制2份,分别改名为redis-28381.conf和redis-28382.conf
配置从redis-23381
- 修改监听端口
修改port 28380
为port 28381
- 修改日志文件名
修改logfile "server_log-28380.txt"
为logfile "server_log_28381.txt"
- 修改windows日志的事件名
修改syslog-ident "redis-28380"
为syslog-ident "redis-28381"
- 修改从库对应的主库ip
修改# slaveof <masterip> <masterport>
为slaveof 127.0.0.1 28380
23880做为主库,填写的就是28380的端口
- 修改从库竞选主库优先级
修改slave-priority 100
为slave-priority 99
将每个从库设置为不通的优先级,数字较低的优先被竞选为主库。
- 修改aof保存的文件名
修改appendfilename "appendonly_28380.aof"
为appendfilename "appendonly_28381.aof"
配置从redis-23382
- 修改监听端口
修改port 28380
为port 28382
- 修改日志文件名
修改logfile "server_log-28380.txt"
为logfile "server_log_28382.txt"
- 修改windows日志的事件名
修改syslog-ident "redis-28380"
为syslog-ident "redis-28382"
- 修改从库对应的主库ip
修改# slaveof <masterip> <masterport>
为slaveof 127.0.0.1 28380
23880做为主库,填写的就是28380的端口
- 修改从库竞选主库优先级
修改slave-priority 100
为slave-priority 98
将每个从库设置为不通的优先级,数字较低的优先被竞选为主库。
- 修改aof保存的文件名
修改appendfilename "appendonly_28380.aof"
为appendfilename "appendonly_28382.aof"
将redis部署为服务
通过命令redis-server --service-install 配置名 --service-name 服务名
将redis安装为服务。
先cd到redis所在目录,在cmd命令行中输入一下三条语句将三个redis安装成功为windows服务。
redis-server --service-install redis-28380.conf --service-name redis-28380
redis-server --service-install redis-28381.conf --service-name redis-28381
redis-server --service-install redis-28382.conf --service-name redis-28382
设置服务别名是为了在服务中能更好的看到哪个是哪个服务,否则默认都是redis服务。
启动redis
可以直接在服务中右键启动或者通过命令redis-server --service-start --service-name 服务名
启动指定服务。
通过redis-cli 连接到各个redis服务。
F:\Study\redis> redis-cli -p 28380 -a test1
127.0.0.1:28380> info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=28382,state=online,offset=183,lag=1
slave1:ip=127.0.0.1,port=28381,state=online,offset=183,lag=1
master_repl_offset:183
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:182
可以看到我们的主从配置已经生效了。
连接到从库28381
F:\Study\redis> redis-cli -p 28381 -a test1
127.0.0.1:28381> info Replication
# Replication
role:slave
master_host:127.0.0.1
master_port:28380
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:323
slave_priority:99
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
连接到从库28382
F:\Study\redis> redis-cli -p 28382 -a test1
127.0.0.1:28382> info Replication
# Replication
role:slave
master_host:127.0.0.1
master_port:28380
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:379
slave_priority:99
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
现在我们往主库写入数据会自动并主动同步到从库。
配置中默认配了以下配置了
slave-read-only yes
,从库是只读的,不允许写入。
配置哨兵
设置三个哨兵端口为 24381~24383
配置哨兵24381
dir ./
logfile "sentinel.28481.txt"
bind 127.0.0.1
port 28481
sentinel monitor master 127.0.0.1 28380 2
sentinel down-after-milliseconds master 5000
sentinel failover-timeout master 30000
sentinel auth-pass 127.0.0.1 28380 test1
sentinel monitor master 127.0.0.1 28380 2
设置主redis的别名为master,后面都通过master表示主redis。后面的2表示2个哨兵检测到主redis挂了即为挂了,需要重新选举出新的主redis,而原来的主redis降级为从redis。sentinel down-after-milliseconds master 5000
哨兵多久连不上主redis即认为它挂了sentinel failover-timeout master 30000
投票选举超时时间,超过时间没有选出则该轮投票失败。sentinel auth-pass master test1
主redis的密码 。
由于哨兵只能设置主的密码,因此主从的密码应该设置为一样的。
由于我在本地测试直接使用127.0.0.1,正常情况下redis和哨兵部署集群肯定是在不通机子上。哨兵则必须绑定ip,否则哨兵自动切换主从。通过在哨兵的配置中加入bind XXXX
。
配置哨兵24382
dir ./
logfile "sentinel.28482.txt"
bind 127.0.0.1
port 28482
sentinel monitor master 127.0.0.1 28380 2
sentinel down-after-milliseconds master 5000
sentinel failover-timeout master 30000
sentinel auth-pass 127.0.0.1 28380 test1
配置哨兵24383
dir ./
logfile "sentinel.28483.txt"
bind 127.0.0.1
port 28483
sentinel monitor master 127.0.0.1 28380 2
sentinel down-after-milliseconds master 5000
sentinel failover-timeout master 30000
sentinel auth-pass 127.0.0.1 28380 test1
启动哨兵
通过命令redis-server.exe 配置 --sentinel
启动哨兵
redis-server redis-sentinel-28481.conf --sentinel
redis-server redis-sentinel-28482.conf --sentinel
redis-server redis-sentinel-28483.conf --sentinel
启动哨兵28481后查看日志
[8464] 21 Nov 02:02:05.258 # +tilt #tilt mode entered
[8464] 21 Nov 08:33:01.513 # +tilt #tilt mode entered
[8464] 21 Nov 08:33:31.561 # -tilt #tilt mode exited
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.100 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 28481
| `-._ `._ / _.-' | PID: 22332
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
[22332] 05 Jan 12:01:48.399 # Sentinel ID is 48693b2911456ef3da6ebfd14d1adf46e76fbb8b
[22332] 05 Jan 12:01:48.399 # +monitor master master 127.0.0.1 28382 quorum 2
[22332] 05 Jan 12:01:53.399 # +sdown sentinel ce50397a76e2e3ca165ce407859cbc94d7caf504 127.0.0.1 28482 @ master 127.0.0.1 28382
[22332] 05 Jan 12:01:53.399 # +sdown sentinel 162c66f370550a9926b794abecfb431cf3f8bcc9 127.0.0.1 28483 @ master 127.0.0.1 28382
[22332] 05 Jan 12:02:13.404 # +sdown master master 127.0.0.1 28382
同时启动完会自动在哨兵的配置文件中生成一些配置,完整的redis-sentinel-28481.conf配置如下
dir "F:\\Study\\redis\\redis-sentinel"
logfile "sentinel.28481.txt"
port 28481
sentinel myid 48693b2911456ef3da6ebfd14d1adf46e76fbb8b
sentinel monitor master 127.0.0.1 28381 2
sentinel down-after-milliseconds master 5000
sentinel failover-timeout master 30000
# Generated by CONFIG REWRITE
sentinel auth-pass master test1
sentinel config-epoch master 11
sentinel leader-epoch master 11
sentinel known-slave master 127.0.0.1 28382
sentinel known-slave master 127.0.0.1 28380
sentinel known-sentinel master 127.0.0.1 28482 ce50397a76e2e3ca165ce407859cbc94d7caf504
sentinel known-sentinel master 127.0.0.1 28483 162c66f370550a9926b794abecfb431cf3f8bcc9
sentinel current-epoch 11
启动后会为哨兵生成一个id,同时会记录一些关键信息。
主从自动切换
将主redis关闭,让哨兵自动切换主从。
哨兵24381日志
[22332] 05 Jan 12:34:49.286 # +sdown master master 127.0.0.1 28380
[22332] 05 Jan 12:34:49.295 # +new-epoch 16
[22332] 05 Jan 12:34:49.296 # +vote-for-leader ce50397a76e2e3ca165ce407859cbc94d7caf504 16
[22332] 05 Jan 12:34:49.363 # +odown master master 127.0.0.1 28380 #quorum 3/2
[22332] 05 Jan 12:34:49.363 # Next failover delay: I will not start a failover before Sat Jan 05 12:35:49 2019
[22332] 05 Jan 12:34:50.397 # +config-update-from sentinel ce50397a76e2e3ca165ce407859cbc94d7caf504 127.0.0.1 28482 @ master 127.0.0.1 28380
[22332] 05 Jan 12:34:50.397 # +switch-master master 127.0.0.1 28380 127.0.0.1 28382
[22332] 05 Jan 12:34:50.397 * +slave slave 127.0.0.1:28381 127.0.0.1 28381 @ master 127.0.0.1 28382
[22332] 05 Jan 12:34:50.397 * +slave slave 127.0.0.1:28380 127.0.0.1 28380 @ master 127.0.0.1 28382
[22332] 05 Jan 12:34:55.442 # +sdown slave 127.0.0.1:28380 127.0.0.1 28380 @ master 127.0.0.1 28382
哨兵24382日志
[8760] 05 Jan 12:34:49.237 # +sdown master master 127.0.0.1 28380
[8760] 05 Jan 12:34:49.292 # +odown master master 127.0.0.1 28380 #quorum 2/2
[8760] 05 Jan 12:34:49.292 # +new-epoch 16
[8760] 05 Jan 12:34:49.292 # +try-failover master master 127.0.0.1 28380
[8760] 05 Jan 12:34:49.293 # +vote-for-leader ce50397a76e2e3ca165ce407859cbc94d7caf504 16
[8760] 05 Jan 12:34:49.296 # 162c66f370550a9926b794abecfb431cf3f8bcc9 voted for ce50397a76e2e3ca165ce407859cbc94d7caf504 16
[8760] 05 Jan 12:34:49.296 # 48693b2911456ef3da6ebfd14d1adf46e76fbb8b voted for ce50397a76e2e3ca165ce407859cbc94d7caf504 16
[8760] 05 Jan 12:34:49.394 # +elected-leader master master 127.0.0.1 28380
[8760] 05 Jan 12:34:49.394 # +failover-state-select-slave master master 127.0.0.1 28380
[8760] 05 Jan 12:34:49.470 # +selected-slave slave 127.0.0.1:28382 127.0.0.1 28382 @ master 127.0.0.1 28380
[8760] 05 Jan 12:34:49.470 * +failover-state-send-slaveof-noone slave 127.0.0.1:28382 127.0.0.1 28382 @ master 127.0.0.1 28380
[8760] 05 Jan 12:34:49.541 * +failover-state-wait-promotion slave 127.0.0.1:28382 127.0.0.1 28382 @ master 127.0.0.1 28380
[8760] 05 Jan 12:34:50.341 # +promoted-slave slave 127.0.0.1:28382 127.0.0.1 28382 @ master 127.0.0.1 28380
[8760] 05 Jan 12:34:50.341 # +failover-state-reconf-slaves master master 127.0.0.1 28380
[8760] 05 Jan 12:34:50.396 * +slave-reconf-sent slave 127.0.0.1:28381 127.0.0.1 28381 @ master 127.0.0.1 28380
[8760] 05 Jan 12:34:51.380 * +slave-reconf-inprog slave 127.0.0.1:28381 127.0.0.1 28381 @ master 127.0.0.1 28380
[8760] 05 Jan 12:34:51.446 # -odown master master 127.0.0.1 28380
[8760] 05 Jan 12:34:52.393 * +slave-reconf-done slave 127.0.0.1:28381 127.0.0.1 28381 @ master 127.0.0.1 28380
[8760] 05 Jan 12:34:52.468 # +failover-end master master 127.0.0.1 28380
[8760] 05 Jan 12:34:52.468 # +switch-master master 127.0.0.1 28380 127.0.0.1 28382
[8760] 05 Jan 12:34:52.469 * +slave slave 127.0.0.1:28381 127.0.0.1 28381 @ master 127.0.0.1 28382
[8760] 05 Jan 12:34:52.469 * +slave slave 127.0.0.1:28380 127.0.0.1 28380 @ master 127.0.0.1 28382
[8760] 05 Jan 12:34:57.562 # +sdown slave 127.0.0.1:28380 127.0.0.1 28380 @ master 127.0.0.1 28382
哨兵24383日志
[26484] 05 Jan 12:34:49.161 # +sdown master master 127.0.0.1 28380
[26484] 05 Jan 12:34:49.294 # +new-epoch 16
[26484] 05 Jan 12:34:49.295 # +vote-for-leader ce50397a76e2e3ca165ce407859cbc94d7caf504 16
[26484] 05 Jan 12:34:50.284 # +odown master master 127.0.0.1 28380 #quorum 3/2
[26484] 05 Jan 12:34:50.284 # Next failover delay: I will not start a failover before Sat Jan 05 12:35:49 2019
[26484] 05 Jan 12:34:50.397 # +config-update-from sentinel ce50397a76e2e3ca165ce407859cbc94d7caf504 127.0.0.1 28482 @ master 127.0.0.1 28380
[26484] 05 Jan 12:34:50.397 # +switch-master master 127.0.0.1 28380 127.0.0.1 28382
[26484] 05 Jan 12:34:50.397 * +slave slave 127.0.0.1:28381 127.0.0.1 28381 @ master 127.0.0.1 28382
[26484] 05 Jan 12:34:50.397 * +slave slave 127.0.0.1:28380 127.0.0.1 28380 @ master 127.0.0.1 28382
[26484] 05 Jan 12:34:55.437 # +sdown slave 127.0.0.1:28380 127.0.0.1 28380 @ master 127.0.0.1 28382
具体投票过程这里不做具体分析。
当选出新的主redis,哨兵会对redis配置进行更新,将主redis的slaveof XXX XXX
配置删除,将从的slaveof XXX XXX
设置为主的地址。同时哨兵会监控redis28380。当28380恢复后会将slaveof XXX XXX
添加到它的配置中。
连接到28382查看
127.0.0.1:28382> info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=28381,state=online,offset=193307,lag=1
slave1:ip=127.0.0.1,port=28380,state=online,offset=193441,lag=1
master_repl_offset:193575
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:193574
动态新增从库
若我们此时动态新增一个从redis,端口为28383,则复制一个28380的配置进行修改,将优先级改为97。并启动服务即可。
redis-28383日志如下
[14048] 05 Jan 12:55:20.421 * Redis 3.2.100 (00000000/0) 64 bit, standalone mode, port 28383, pid 14048 ready to start.
[14048] 05 Jan 12:55:20.422 # Server started, Redis version 3.2.100
[14048] 05 Jan 12:55:20.423 * The server is now ready to accept connections on port 28383
[14048] 05 Jan 12:55:20.424 * Connecting to MASTER 127.0.0.1:28382
[14048] 05 Jan 12:55:20.426 * MASTER <-> SLAVE sync started
[14048] 05 Jan 12:55:20.427 * Non blocking connect for SYNC fired the event.
[14048] 05 Jan 12:55:20.428 * Master replied to PING, replication can continue...
[14048] 05 Jan 12:55:20.428 * Partial resynchronization not possible (no cached master)
[14048] 05 Jan 12:55:20.432 * Full resync from master: 2c344529e4acdc44cd311818fe8179825877a9f4:241347
[14048] 05 Jan 12:55:20.653 * MASTER <-> SLAVE sync: receiving 107 bytes from master
[14048] 05 Jan 12:55:20.655 * MASTER <-> SLAVE sync: Flushing old data
[14048] 05 Jan 12:55:20.655 * MASTER <-> SLAVE sync: Loading DB in memory
[14048] 05 Jan 12:55:20.656 * MASTER <-> SLAVE sync: Finished with success
[14048] 05 Jan 12:55:20.660 * Background append only file rewriting started by pid 29392
[14048] 05 Jan 12:55:20.827 * AOF rewrite child asks to stop sending diffs.
[14048] 05 Jan 12:55:20.927 # fork operation complete
[14048] 05 Jan 12:55:20.928 * Background AOF rewrite terminated with success
[14048] 05 Jan 12:55:20.929 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
[14048] 05 Jan 12:55:20.931 * Background AOF rewrite finished successfully
再看下28382的主从连接信息
127.0.0.1:28382> info Replication
# Replication
role:master
connected_slaves:3
slave0:ip=127.0.0.1,port=28381,state=online,offset=268634,lag=0
slave1:ip=127.0.0.1,port=28380,state=online,offset=268768,lag=0
slave2:ip=127.0.0.1,port=28383,state=online,offset=268634,lag=0
master_repl_offset:268768
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:268767
哨兵也能检测到新的从库连接
[22332] 05 Jan 12:55:25.420 * +slave slave 127.0.0.1:28383 127.0.0.1 28383 @ master 127.0.0.1 28382
通过上述配置,就完成了redis高可用方案。
程序连接redis高可用
我使用的是StackExchange.Redis
连接redis。
它本身就支持主从连接,在建立连接的时候输入多个连接地址接口。由于从库不允许写入。因此它能辨别出哪个是主哪个是从。主从切换后写入数据的时候重新判定哪个是主库。
- 通过代码设置redis地址
ConfigurationOptions options = ConfigurationOptions.Parse("password=test1");
options.EndPoints.Add("127.0.0.1", 28380);
options.EndPoints.Add("127.0.0.1", 28381);
options.EndPoints.Add("127.0.0.1", 28382);
- 通过配置字符串设置
ConfigurationOptions options = ConfigurationOptions.Parse("127.0.0.1:28380,127.0.0.1:28381,127.0.0.1:28382,keepAlive=5,password=test1");
总结
通过该篇文章详细的探究了window下的redis高可用方案如何实现。本文对具体配置没有做深入探究,仅仅为了抓住重点,具体配置其他的文档都介绍的比较详细,但是一些细节并没有说明,通过该片文章将reids高可用的坑都填满。若有错误,欢迎指正。
实例可以从这里下载
参考文档
本文地址:https://www.cnblogs.com/Jack-Blog/p/10224193.html
作者博客:杰哥很忙
欢迎转载,请在明显位置给出出处及链接
Windows版本redis高可用方案探究的更多相关文章
- [转]MYSQL高可用方案探究(总结)
前言 http://blog.chinaunix.net/uid-20639775-id-3337432.htmlLvs+Keepalived+Mysql单点写入主主同步高可用方案 http://bl ...
- Redis高可用方案-哨兵与集群
Redis高可用方案 一.名词解释 二.主从复制 Redis主从复制模式可以将主节点的数据同步给从节点,从而保障当主节点不可达的情况下,从节点可以作为 后备顶上来,并且可以保障数据尽量不丢失(主从 ...
- Redis高可用方案----Redis主从+Sentinel+Haproxy
安装环境 这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为6379,redis-sentinel的端口为26379. ...
- 深入理解Redis高可用方案-Sentinel
Redis Sentinel是Redis的高可用方案.是Redis 2.8中正式引入的. 在之前的主从复制方案中,如果主节点出现问题,需要手动将一个从节点升级为主节点,然后将其它从节点指向新的主节点, ...
- MYSQL数据库高可用方案探究
MySQL作为最关键的应用数据存储中心,如何保证MySQL服务的可靠性和持续性,是我们不得不细致考虑的一个问题.当master宕机的时候,我们如何保证数据尽可能的不丢失,如何保证快速的获知master ...
- 理解redis高可用方案
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Redis高可用方案哨兵机制------ 配置文件sentinel.conf详解
Redis的哨兵机制是官方推荐的一种高可用(HA)方案,我们在使用Redis的主从结构时,如果主节点挂掉,这时是不能自动进行主备切换和通知客户端主节点下线的. Redis-Sentinel机制主要用三 ...
- 容器化redis高可用方案
偶然看到一个GITHUB项目,提供了一套Docker Compose下的redis Sentinel方案. 项目地址https://github.com/AliyunContainerService/ ...
- redis high available solution/ redis 高可用方案
http://developers.linecorp.com/blog/?p=1420 http://engineering.docusign.com/articles/redis-sentinel- ...
随机推荐
- cpp 区块链模拟示例(一)工程建立
/* 作 者: itdef 欢迎转帖 请保持文本完整并注明出处 技术博客 http://www.cnblogs.com/itdef/ 技术交流群 群号码:432336863欢迎c c++ window ...
- 在linux中文件的权限讲解
1.d:directory(目录): 表示这个文件是个目录,其他的还有f(file文件)等等: 2.r:read(可读) 3.w:write(可写) 4 x :execute(可执行) 一般Linux ...
- base operand of '->' has non-pointer type 'const Comple
base operand of '->' has non-pointer type 'const Comple ->操作符前面的操作数类型不是指针类型 错误原因 函数(&对象) { ...
- pwm互补输出 死区设置
void TIM8_PWM_Init(u16 arr,u16 psc){ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitT ...
- zookeeper学习day01
1.zkAPI:(借助闭锁来实现) 1)创建闭锁对象 2)创建zk对象 3)连接zk客户端(连接成功执行countDown方法) 4)执行await方法(保证链接成功) 5)zk对象调用对 ...
- DevExpress--TreeList节点添加图片
这个过程相对来说比较简单,网上也有不少资料,但是自己在做过之后为了记住,算是给自己写一个博客吧. 下面直接上具体的流程 1.前提 控件使用的都是DevExpress和winform的原生控件两种: 2 ...
- 某公司的C#面试题
1. 请简述值类型与引用类型的区别 答: 可参考http://www.cnblogs.com/JimmyZhang/archive/2008/01/31/1059383.html 2.C#中所有引用类 ...
- ng4 路由多参数传参以及接收
import { Router } from '@angular/router'; constructor( private router:Router, ) { } goApplicationDet ...
- 2019年微服务5大趋势,你pick哪个?
2018年对于微服务来说是非常重要的一年,这一年Service Mesh开始崭露头角,解决服务间复杂的通信问题,这一年很多国内互联网公司已经有了较为成熟的微服务实践案例,网易云主办的微服务实践沙龙中也 ...
- Linux下Redis安装使用教程
https://redis.io/download 第一步:安装redis需要在有c语言的编译环境下,执行命令安装c语言环境: yum install gcc-c++ https://blog.csd ...