redis使用了tcl语言开发自己的测试用例
为此,可以开发一个解析redis.conf的tcl语言脚本
#!/usr/bin/tclsh
# 解析redis.conf配置文件
# 返回包括每个配置项的参数
# 注意返回命令相同,子命令相同的配置项
proc parse_redis_confg {{path redis.conf}} {
set fd [open $path r]
set content [read $fd]
close $fd
set lines [split $content "\n"]
foreach line $lines {
set line [string trim $line]
if {[string index $line 0] eq "#" || [string is space $line]} {
continue
}
lappend l $line
}
return $l
}
# 查找配置项参数
# 注意,返回的是列表
proc find_key_in_redis_config {config config_item} {
set ret [lsearch -regexp -all -inline $config "^$config_item"]
return $ret
}
proc print_help_screen {} {
puts [join {
"cfg parse path parse redis config"
"cfg search path key search key in redis config"
"help show help"
} "\n"]
}
if {$argc == 0} {
puts "error"
} elseif {$argc == 1} {
set opt [lindex $argv 0]
if {$opt eq {help}} {
print_help_screen
} elseif {$opt eq {fish}} {
puts "fish"
} else {
puts "other"
}
} else {
set cmd [lindex $argv 0]
set subcmd [lindex $argv 1]
if {$cmd eq {cfg} && $subcmd eq {parse}} {
set ret [parse_redis_confg [file normalize [lindex $argv 2]]]
puts $ret
} elseif {$cmd eq {cfg} && $subcmd eq {search}} {
set cfgs [parse_redis_confg [file normalize [lindex $argv 2]]]
set ret [find_key_in_redis_config $cfgs [lindex $argv 3]]
if {[llength $ret] == 1} {
puts [lindex [lindex $ret 0] 1]
} else {
puts $ret
}
} else {
puts "error"
}
}
fh@Feihu-3 learn % ./parse_redisconf.tcl help
cfg parse path parse redis config
cfg search path key search key in redis config
help show help
fh@Feihu-3 learn %
fh@Feihu-3 learn % ./parse_redisconf.tcl cfg parse ./redis.conf
{bind 127.0.0.1} {protected-mode yes} {port 6379} {tcp-backlog 511} {timeout 5} {tcp-keepalive 300} {daemonize no} {supervised no} {pidfile /var/run/redis_6379.pid} {loglevel notice} {logfile ""} {databases 16} {always-show-logo yes} {save 900 1} {save 300 10} {save 60 10000} {stop-writes-on-bgsave-error yes} {rdbcompression yes} {rdbchecksum yes} {dbfilename dump.rdb} {dir ./} {replica-serve-stale-data yes} {replica-read-only yes} {repl-diskless-sync no} {repl-diskless-sync-delay 5} {repl-disable-tcp-nodelay no} {replica-priority 100} {lazyfree-lazy-eviction no} {lazyfree-lazy-expire no} {lazyfree-lazy-server-del no} {replica-lazy-flush no} {appendonly no} {appendfilename "appendonly.aof"} {appendfsync everysec} {no-appendfsync-on-rewrite no} {auto-aof-rewrite-percentage 100} {auto-aof-rewrite-min-size 64mb} {aof-load-truncated yes} {aof-use-rdb-preamble yes} {lua-time-limit 5000} {slowlog-log-slower-than 10000} {slowlog-max-len 128} {latency-monitor-threshold 0} {notify-keyspace-events ""} {hash-max-ziplist-entries 512} {hash-max-ziplist-value 64} {list-max-ziplist-size -2} {list-compress-depth 0} {set-max-intset-entries 512} {zset-max-ziplist-entries 128} {zset-max-ziplist-value 64} {hll-sparse-max-bytes 3000} {stream-node-max-bytes 4096} {stream-node-max-entries 100} {activerehashing yes} {client-output-buffer-limit normal 0 0 0} {client-output-buffer-limit replica 256mb 64mb 60} {client-output-buffer-limit pubsub 32mb 8mb 60} {hz 10} {dynamic-hz yes} {aof-rewrite-incremental-fsync yes} {rdb-save-incremental-fsync yes}
fh@Feihu-3 learn %
fh@Feihu-3 learn % ./parse_redisconf.tcl cfg search ./redis.conf client-output-buffer-limit
{client-output-buffer-limit normal 0 0 0} {client-output-buffer-limit replica 256mb 64mb 60} {client-output-buffer-limit pubsub 32mb 8mb 60}
fh@Feihu-3 learn %
fh@Feihu-3 learn % ./parse_redisconf.tcl cfg search ./redis.conf port
6379
fh@Feihu-3 learn %