使用之前准备工作:
1)配置好与端口无关的公共redis.conf文件,和工具放在同一目录下
2)配置好与端口相关的模板redis-PORT.conf文件,也和工具放在同一目录下(部署时PORT会被替换成具体的端口号)
3)配置好组成集群的节点文件redis_cluster.nodes,也和工具放在同一目录下
redis_cluster.nodes的文件格式为每行一个组成Redis集群的节点,支持“#”打头的注释行,格式示例:
127.0.0.1 6381
127.0.0.1 6382
127.0.0.1 6383
127.0.0.1 6384
127.0.0.1 6385
127.0.0.1 6386
4)创建好安装redis的目录(可建筑批量工具mooon_ssh完成,deploy_redis_cluster.sh主要也是利用了该批量工具)
5)其它更详细的可以直接看源代码,有详细的说明。

建立将https://github.com/eyjian/redis-tools/tree/master/deploy下载到一个目录,运行deploy_redis_cluster.sh工具时,它会提示各种前置条件,比如redis-cli是否可用等。

源码(可从https://github.com/eyjian/redis-tools下载):

#!/bin/bash
# 源代码:https://github.com/eyjian/redis-tools
# a tool to deploy a redis cluster
#
# 自动化部署redis集群工具,
# 远程操作即可,不需登录到Redis集群中的任何机器。
#
# 以root用户批量创建用户redis示例:
# export H=192.168.0.5,192.168.0.6,192.168.0.7,192.168.0.8,192.168.0.9
# export U=root
# export P='root^1234'
# mooon_ssh -c='groupadd redis; useradd -g redis -m redis; echo "redis:redis#1234"|chpasswd'
#
# 批量创建redis安装目录/data/redis-4.0.11,并设置owner为用户redis,用户组为redis示例:
# mooon_ssh -c='mkdir /data/redis-4.0.11;ln -s /data/redis-4.0.11 /data/redis;chown redis:redis /data/redis*'
#
# 可使用process_monitor.sh监控redis-server进程重启:
# https://github.com/eyjian/libmooon/blob/master/shell/process_monitor.sh
# 使用示例:
# * * * * * /usr/local/bin/process_monitor.sh "/usr/local/redis/bin/redis-server 6379" "/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6379.conf"
# * * * * * /usr/local/bin/process_monitor.sh "/usr/local/redis/bin/redis-server 6380" "/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6380.conf"
# 可在/tmp目录找到process_monitor.sh的运行日志,当对应端口的进程不在时,5秒内即会重启对应端口的进程。
#
# 运行参数:
# 参数1 SSH端口
# 参数2 安装用户
# 参数3 安装用户密码
# 参数4 安装目录
#
# 前置条件(可借助批量工具mooon_ssh和mooon_upload完成):
# 1)安装用户已经创建好
# 2)安装用户密码已经设置好
# 3)安装目录已经创建好,并且目录的owner为安装用户
# 4)执行本工具的机器上安装好了ruby,且版本号不低于2.0.0
# 5)执行本工具的机器上安装好了redis-X.Y.Z.gem,且版本号不低于redis-3.0.0.gem
#
# 6)同目录下存在以下几个可执行文件:
# 6.1)redis-server
# 6.2)redis-cli
# 6.3)redis-check-rdb
# 6.4)redis-check-aof
# 6.5)redis-trib.rb
#
# 7)同目录下存在以下两个配置文件:
# 7.1)redis.conf
# 7.2)redis-PORT.conf
# 其中redis.conf为公共配置文件,
# redis-PORT.conf为指定端口的配置文件模板,
# 同时,需要将redis-PORT.conf文件中的目录和端口分别使用INSTALLDIR和REDISPORT替代,示例:
# include INSTALLDIR/conf/redis.conf
# pidfile INSTALLDIR/bin/redis-REDISPORT.pid
# logfile INSTALLDIR/log/redis-REDISPORT.log
# port REDISPORT
# dbfilename dump-REDISPORT.rdb
# dir INSTALLDIR/data/REDISPORT
#
# 其中INSTALLDIR将使用参数4的值替换,
# 而REDISPORT将使用redis_cluster.nodes中的端口号替代
#
# 配置文件redis_cluster.nodes,定义了安装redis的节点
# 文件格式(以“#”打头的为注释):
# 每行由IP和端口号组成,两者间可以:空格、逗号、分号、或TAB符分隔
#
# 依赖:
# 1)mooon_ssh 远程操作多台机器批量命令工具
# 2)mooon_upload 远程操作多台机器批量上传工具
# 3)https://raw.githubusercontent.com/eyjian/libmooon
# 4)libmooon又依赖libssh2(http://www.libssh2.org/)BASEDIR=$(dirname $(readlink -f $0))
REDIS_CLUSTER_NODES=$BASEDIR/redis_cluster.nodes# 批量命令工具
MOOON_SSH=mooon_ssh
# 批量上传工具
MOOON_UPLOAD=mooon_upload
# 创建redis集群工具
REDIS_TRIB=$BASEDIR/redis-trib.rb
# redis-server
REDIS_SERVER=$BASEDIR/redis-server
# redis-cli
REDIS_CLI=$BASEDIR/redis-cli
# redis-check-aof
REDIS_CHECK_AOF=$BASEDIR/redis-check-aof
# redis-check-rdb
REDIS_CHECK_RDB=$BASEDIR/redis-check-rdb
# redis.conf
REDIS_CONF=$BASEDIR/redis.conf
# redis-PORT.conf
REDIS_PORT_CONF=$BASEDIR/redis-PORT.conf# 全局变量
# 组成redis集群的总共节点数
num_nodes=0
# 组成redis集群的所有IP数组
redis_node_ip_array=()
# 组成redis集群的所有节点数组(IP+port构造一个redis节点)
redis_node_array=()# 用法
function usage()
{echo -e "\033[1;33mUsage\033[m: `basename $0` \033[0;32;32mssh-port\033[m install-user \033[0;32;32minstall-user-password\033[m install-dir"echo -e "\033[1;33mExample\033[m: `basename $0` \033[0;32;32m22\033[m redis \033[0;32;32mredis^1234\033[m /usr/local/redis-4.0.11"
}# 需要指定五个参数
if test $# -ne 4; thenusageecho ""exit 1
fissh_port="$1"
install_user="$2"
install_user_password="$3"
install_dir="$4"
echo -e "[ssh port] \033[1;33m$ssh_port\033[m"
echo -e "[install user] \033[1;33m$install_user\033[m"
echo -e "[install directory] \033[1;33m$install_dir\033[m"
echo ""# 检查ruby是否可用
which ruby > /dev/null 2>&1
if test $? -eq 0; thenecho -e "Checking ruby OK"
elseecho -e "ruby \033[0;32;31mnot exists or not executable\033[m"echo "https://www.ruby-lang.org"echo -e "Exit now\n"exit 1
fi# 检查gem是否可用
which gem > /dev/null 2>&1
if test $? -eq 0; thenecho -e "Checking gem OK"
elseecho -e "gem \033[0;32;31mnot exists or not executable\033[m"echo "https://rubygems.org/pages/download"echo -e "Exit now\n"exit 1
fi# 检查mooon_ssh是否可用
which "$MOOON_SSH" > /dev/null 2>&1
if test $? -eq 0; thenecho -e "Checking $MOOON_SSH OK"
elseecho -e "$MOOON_SSH \033[0;32;31mnot exists or not executable\033[m"echo "There are two versions: C++ and GO:"echo "https://github.com/eyjian/libmooon/releases"echo "https://raw.githubusercontent.com/eyjian/libmooon/master/tools/mooon_ssh.cpp"echo "https://raw.githubusercontent.com/eyjian/libmooon/master/tools/mooon_ssh.go"    echo -e "Exit now\n"exit 1
fi# 检查mooon_upload是否可用
which "$MOOON_UPLOAD" > /dev/null 2>&1
if test $? -eq 0; thenecho -e "Checking $MOOON_UPLOAD OK"
elseecho -e "$MOOON_UPLOAD \033[0;32;31mnot exists or not executable\033[m"echo "There are two versions: C++ and GO:"echo "https://github.com/eyjian/libmooon/releases"echo "https://raw.githubusercontent.com/eyjian/libmooon/master/tools/mooon_upload.cpp"echo "https://raw.githubusercontent.com/eyjian/libmooon/master/tools/mooon_upload.go"echo -e "Exit now\n"exit 1
fi# 检查redis-trib.rb是否可用
which "$REDIS_TRIB" > /dev/null 2>&1
if test $? -eq 0; thenecho -e "Checking $REDIS_TRIB OK"
elseecho -e "$REDIS_TRIB \033[0;32;31mnot exists or not executable\033[m"echo -e "Exit now\n"exit 1
fi# 检查redis-server是否可用
which "$REDIS_SERVER" > /dev/null 2>&1
if test $? -eq 0; thenecho -e "Checking $REDIS_SERVER OK"
elseecho -e "$REDIS_SERVER \033[0;32;31mnot exists or not executable\033[m"echo -e "Exit now\n"exit 1
fi# 检查redis-cli是否可用
which "$REDIS_CLI" > /dev/null 2>&1
if test $? -eq 0; thenecho -e "Checking $REDIS_CLI OK"
elseecho -e "$REDIS_CLI \033[0;32;31mnot exists or not executable\033[m"echo -e "Exit now\n"exit 1
fi# 检查redis-check-aof是否可用
which "$REDIS_CHECK_AOF" > /dev/null 2>&1
if test $? -eq 0; thenecho -e "Checking $REDIS_CHECK_AOF OK"
elseecho -e "$REDIS_CHECK_AOF \033[0;32;31mnot exists or not executable\033[m"echo -e "Exit now\n"exit 1
fi# 检查redis-check-rdb是否可用
which "$REDIS_CHECK_RDB" > /dev/null 2>&1
if test $? -eq 0; thenecho -e "Checking $REDIS_CHECK_RDB OK"
elseecho -e "$REDIS_CHECK_RDB \033[0;32;31mnot exists or not executable\033[m"echo -e "Exit now\n"exit 1
fi# 检查redis.conf是否可用
if test -r "$REDIS_CONF"; thenecho -e "Checking $REDIS_CONF OK"
elseecho -e "$REDIS_CONF \033[0;32;31mnot exists or not readable\033[m"echo -e "Exit now\n"exit 1
fi# 检查redis-PORT.conf是否可用
if test -r "$REDIS_PORT_CONF"; thenecho -e "Checking $REDIS_PORT_CONF OK"
elseecho -e "$REDIS_PORT_CONF \033[0;32;31mnot exists or not readable\033[m"echo -e "Exit now\n"exit 1
fi# 解析redis_cluster.nodes文件,
# 从而得到组成redis集群的所有节点。
function parse_redis_cluster_nodes()
{    redis_nodes_str=redis_nodes_ip_str=while read linedo# 删除前尾空格line=`echo "$line" | xargs`if test -z "$line" -o "$line" = "#"; thencontinuefi# 跳过注释begin_char=${line:0:1}if test "$begin_char" = "#"; thencontinuefi# 取得IP和端口eval $(echo "$line" | awk -F[\ \:,\;\t]+ '{ printf("ip=%s\nport=%s\n",$1,$2); }')# IP和端口都必须有if test ! -z "$ip" -a ! -z "$port"; thenif test -z "$redis_nodes_ip_str"; thenredis_nodes_ip_str=$ipelseredis_nodes_ip_str="$redis_nodes_ip_str,$ip"fiif test -z "$redis_nodes_str"; thenredis_nodes_str="$ip:$port"elseredis_nodes_str="$redis_nodes_str,$ip:$port"fi          fidone < $REDIS_CLUSTER_NODES   if test -z "$redis_nodes_ip_str"; thennum_nodes=0else# 得到IP数组redis_node_ip_array    redis_node_ip_array=`echo "$redis_nodes_ip_str" | tr ',' '\n' | sort | uniq`# 得到节点数组redis_node_arrayredis_node_array=`echo "$redis_nodes_str" | tr ',' '\n' | sort | uniq`for redis_node in ${redis_node_array[@]};donum_nodes=$((++num_nodes))echo "$redis_node"donefi
}# check redis_cluster.nodes
if test ! -r $REDIS_CLUSTER_NODES; thenecho -e "File $REDIS_CLUSTER_NODES \033[0;32;31mnot exits\033[m"echo ""echo -e "\033[0;32;32mFile format\033[m (columns delimited by space, tab, comma, semicolon or colon):"echo "IP1 port1"echo "IP2 port2"echo ""echo -e "\033[0;32;32mExample\033[m:"echo "127.0.0.1 6381"echo "127.0.0.1 6382"echo "127.0.0.1 6383"echo "127.0.0.1 6384"echo "127.0.0.1 6385"echo "127.0.0.1 6386"echo -e "Exit now\n"exit 1
else    echo -e "\033[0;32;32m"parse_redis_cluster_nodesecho -e "\033[m"if test $num_nodes -lt 1; thenecho -e "Checking $REDIS_CLUSTER_NODES \033[0;32;32mfailed\033[m: no any node"echo -e "Exit now\n"exit 1elseecho -e "Checking $REDIS_CLUSTER_NODES OK, the number of nodes is \033[1;33m${num_nodes}\033[m"fi
fi# 确认后再继续
while true
do# 组成一个redis集群至少需要六个节点if test $num_nodes -lt 6; thenecho -e "\033[0;32;32mAt least 6 nodes are required to create a redis cluster\033[m"fi# 提示是否继续echo -en "Are you sure to continue? [\033[1;33myes\033[m/\033[1;33mno\033[m]"read -r -p " " inputif test "$input" = "no"; thenecho -e "Exit now\n"exit 1elif test "$input" = "yes"; thenecho "Starting to install ..."echo ""breakfi
done# 是否先清空安装目录再安装?
clear_install_directory=
while true
doecho -en "Clear install directory? [\033[1;33myes\033[m/\033[1;33mno\033[m]"read -r -p " " clear_install_directoryif test "$clear_install_directory" = "no"; thenecho ""breakelif test "$clear_install_directory" = "yes"; then        echo ""breakfi
done# 安装公共的,包括可执行程序文件和公共配置文件
function install_common()
{redis_ip="$1"# 检查安装目录是否存在,且有读写权限echo "$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c=\"test -d $install_dir && test -r $install_dir && test -w $install_dir && test -x $install_dir\""$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c="test -d $install_dir && test -r $install_dir && test -w $install_dir && test -x $install_dir"if test $? -ne 0; thenecho ""echo -e "Directory $install_dir \033[1;33mnot exists or no (rwx) permission\033[m"echo -e "Exit now\n"exit 1fi# 清空安装目录if test "$clear_install_directory" = "yes"; thenecho ""echo "$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c=\"killall -q -w -u $install_user redis-server\""$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c="killall -q -w -u $install_user redis-server"echo "$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c=\"rm -fr $install_dir/*\""$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c="rm -fr $install_dir/*"if test $? -ne 0; thenecho -e "Exit now\n"exit 1fifi# 创建公共目录(create directory)echo ""echo "$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c=\"cd $install_dir;mkdir -p bin conf log data\""$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c="cd $install_dir;mkdir -p bin conf log data"if test $? -ne 0; thenecho -e "Exit now\n"exit 1fi# 上传公共配置文件(upload configuration files)echo ""echo "$MOOON_UPLOAD -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -s=redis.conf -d=$install_dir/conf"$MOOON_UPLOAD -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -s=redis.conf -d=$install_dir/conf if test $? -ne 0; thenecho -e "Exit now\n"exit 1fi# 上传公共执行文件(upload executable files)echo ""echo "$MOOON_UPLOAD -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -s=redis-server,redis-cli,redis-check-aof,redis-check-rdb -d=$install_dir/bin"    $MOOON_UPLOAD -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -s=redis-server,redis-cli,redis-check-aof,redis-check-rdb,redis-trib.rb -d=$install_dir/binif test $? -ne 0; thenecho -e "Exit now\n"exit 1fi
}# 安装节点配置文件
function install_node_conf()
{redis_ip="$1"redis_port="$2"# 生成节点配置文件cp redis-PORT.conf redis-$redis_port.confsed -i "s|INSTALLDIR|$install_dir|g;s|REDISPORT|$redis_port|g" redis-$redis_port.conf# 创建节点数据目录(create data directory for the given node)echo ""echo "$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c=\"cd $install_dir;mkdir -p data/$redis_port\""$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c="cd $install_dir;mkdir -p data/$redis_port"if test $? -ne 0; thenrm -f redis-$redis_port.confecho -e "Exit now\n"exit 1fi# 上传节点配置文件(upload configuration files)echo ""echo "$MOOON_UPLOAD -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -s=redis-$redis_port.conf -d=$install_dir/conf"$MOOON_UPLOAD -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -s=redis-$redis_port.conf -d=$install_dir/conf    if test $? -ne 0; thenrm -f redis-$redis_port.confecho -e "Exit now\n"exit 1firm -f redis-$redis_port.conf
}function start_redis_node()
{redis_ip="$1"redis_port="$2"# 启动redis实例(start redis instance)echo ""echo "$MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c=\"$install_dir/bin/redis-server $install_dir/conf/redis-$redis_port.conf\""    $MOOON_SSH -h=$redis_ip -P=$ssh_port -u=$install_user -p=$install_user_password -c="nohup $install_dir/bin/redis-server $install_dir/conf/redis-$redis_port.conf > /dev/null 2>&1 &"if test $? -ne 0; thenecho -e "Exit now\n"exit 1fi
}# 安装公共的,包括可执行程序文件和公共配置文件
echo ""
echo -e "\033[1;33m================================\033[m"
for redis_node_ip in $redis_node_ip_array;
doecho -e "[\033[1;33m$redis_node_ip\033[m] Installing common ..."install_common $redis_node_ip
done# 安装节点配置文件
echo ""
echo -e "\033[1;33m================================\033[m"
for redis_node in ${redis_node_array[@]};
donode_ip=node_port=eval $(echo "$redis_node" | awk -F[\ \:,\;\t]+ '{ printf("node_ip=%s\nnode_port=%s\n",$1,$2); }')if test -z "$node_ip" -o -z "$node_port"; thencontinuefiecho -e "[\033[1;33m$node_ip:$node_port\033[m] Installing node ..."install_node_conf $node_ip $node_port
done# 确认后再继续
echo ""
echo -e "\033[1;33m================================\033[m"
while true
doecho -en "Start redis? [\033[1;33myes\033[m/\033[1;33mno\033[m]"read -r -p " " inputif test "$input" = "no"; thenecho ""exit 1elif test "$input" = "yes"; thenecho "Starting to start redis ..."echo ""breakfi
done# 启动redis实例(start redis instance)
for redis_node in ${redis_node_array[@]};
doeval $(echo "$redis_node" | awk -F[\ \:,\;\t]+ '{ printf("node_ip=%s\nnode_port=%s\n",$1,$2); }')if test -z "$node_ip" -o -z "$node_port"; thencontinuefiecho -e "[\033[1;33m$node_ip:$node_port\033[m] Starting node ..."start_redis_node $node_ip $node_port
doneecho ""
echo -e "\033[1;33m================================\033[m"
echo "Number of nodes: $num_nodes"
if test $num_nodes -lt 6; thenecho "Number of nodes less than 6, can not create redis cluster"echo -e "Exit now\n"exit 1
elseredis_nodes_str=`echo "$redis_nodes_str" | tr ',' ' '`# 确认后再继续echo ""while truedoecho -en "Create redis cluster? [\033[1;33myes\033[m/\033[1;33mno\033[m]"read -r -p " " inputif test "$input" = "no"; thenecho ""exit 1elif test "$input" = "yes"; thenecho "Starting to create redis cluster with $redis_nodes_str ... ..."echo ""breakfidone# 创建redis集群(create redis cluster)# redis-trib.rb create --replicas 1    $REDIS_TRIB create --replicas 1 $redis_nodes_strecho -e "Exit now\n"exit 0
fi

转载于:https://www.cnblogs.com/aquester/p/9891480.html

Redis集群命令行部署工具相关推荐

  1. redis集群的安装部署

    1.下载redis的稳定版本 wget https://download.redis.io/redis-stable.tar.gz 2..安装redis软件 tar -xzvf redis-stabl ...

  2. kubernetes集群命令行工具kubectl

    文章目录 1 kubectl 概述 2 kubernetes命令 2.1 kubectl 命令的语法 2.2 常用命令 1 kubectl 概述 kubectl是Kubernetes集群的命令行工具, ...

  3. 查看Redis集群所有节点内存工具

    指定集群中任意一个节点,查看集群中所有节点当前已用物理内存.配置的最大物理内存和系统物理内存. ​ ​源码(可从https://github.com/eyjian/redis-tools下载): #! ...

  4. redis集群环境安装(参照redis中文官网,中间遇到了一些问题,so,记录一下)

    创建步骤 01. 准备环境 # yum install gcc # yum install ruby # yum install ruby-devel.x86_64 # yum install rub ...

  5. 使用Docker Compose部署基于Sentinel的高可用Redis集群

    大家一定非常熟悉如何利用Docker启动单个Redis容器用于开发环境,本文将介绍如何利用Docker Compose模板在本机和云端部署基于Sentinel的高可用Redis 3集群. Redis集 ...

  6. Redis 集群规范(中文稿)(MOVED错误码及ASK错误码

    引言? 这个文档是正在开发中的 Redis 集群功能的规范(specification)文档,文档分为两个部分: 第一部分介绍目前已经在 unstable 分支中实现了的那些功能. 第二部分介绍目前仍 ...

  7. 龙芯电脑平台kubernetes集群编译及部署方案

    http://ask.loongnix.org/?/article/105  一.环境 操作系统: loongnix 内核: 3.10.84 go版本: go1.9.2 linux/mips64le ...

  8. Redis 集群规范(MOVED错误码及ASK错误码)

    引言? 这个文档是正在开发中的 Redis 集群功能的规范(specification)文档,文档分为两个部分: 第一部分介绍目前已经在 unstable 分支中实现了的那些功能. 第二部分介绍目前仍 ...

  9. docker privileged作用_Docker环境下秒建Redis集群,连SpringBoot也整上了!

    为了提高Redis的存储容量和响应速度,有时候我们需要搭建Redis集群.本文主要讲述Redis集群环境的搭建步骤以及如何在SpringBoot中整合使用Redis集群. SpringBoot实战电商 ...

最新文章

  1. 困扰一周的奇葩bug:重复相似代码多,导致单片机程序跑飞
  2. button按钮onclick触发不了_手把手教你深入CSS实现一个粒子动效的按钮
  3. 全球及中国农业保险市场营销状况与运营价值分析报告2022版
  4. c语言求n到m之间的素数和
  5. java扫描指定package注解_java随笔-扫描使用指定注解的类与方法
  6. android 百度地图 在线建议查询,百度地图SDK-----百度地图在线建议查询,结合AutoCompleteTextView实现搜索下拉列表。...
  7. CoreAnimation编程指南(九)图层布局
  8. 现代软件工程系列 学生读后感 梦断代码 软件难做
  9. 制作个性化gurb菜单背景图片
  10. 利用python scapy包进行抓包发包与ARP扫描
  11. php mail带附件,Pear Mail 发送邮件带附件_PHP教程
  12. 《Java核心技术36讲》读后
  13. java无法解析类型数据,”无法解析类型 这是简介引用的类文件要求 从必需的 .class 文件间接引用了“——解决方法...
  14. 轻松编写您自己的拖拉机算法,进行算法大战
  15. 2007网吧经营攻略之技术完全篇
  16. 尚硅谷MySQL高级JAVA版
  17. 英语计算机主板接口有,主板上常见英文的解释
  18. C# Interlocked类的事例
  19. 开源中国源码学习UI篇(二)之NavigationDrawer+Fragment的使用分析
  20. Cassandra研究报告-http://blog.csdn.net/zyz511919766/article/details/38683219/

热门文章

  1. #pragma once 与 #ifndef 解析(转载)
  2. 采用Mono进行移动开发图书推荐
  3. 重构手法之重新组织数据【1】
  4. 关于Parse库的配置问题
  5. hdu 1709 (母函数,有些特殊)
  6. [C++]头文件(Header Files)和命名空间(Namespace)
  7. Q103:磨边的物体(Beveled Objects)
  8. java语言诞生的主要贡献者_2020年12月编程语言排行+GitHub 年度报告正式发布,JavaScript 霸榜、TypeScript 爆发!...
  9. 如何建立有效的数据挖掘步骤
  10. 大数据分析体系由哪些层级构成