李明杰(MJ)高級(jí)講師
多年軟件開(kāi)發(fā)經(jīng)驗(yàn)和教學(xué)經(jīng)驗(yàn),尤其精通Android和iOS平臺(tái)的開(kāi)發(fā),還開(kāi)發(fā)了2個(gè)iOS的流行開(kāi)源框架(MJRefresh、MJExtension),
目前在國(guó)內(nèi)的使用率非常高。
李老師曾負(fù)責(zé)主導(dǎo)開(kāi)發(fā)過(guò)裝飾ERP系統(tǒng)手機(jī)端、服裝連鎖管理系統(tǒng)手機(jī)及平板客戶端、自動(dòng)雞尾酒調(diào)酒機(jī)系統(tǒng)、網(wǎng)絡(luò)斗地主RPG、游戲
引擎等。曾以架構(gòu)師及技術(shù)總監(jiān)的角色幫客戶成功獲得多家風(fēng)投,并上了中央電視臺(tái)《給你一個(gè)億》節(jié)目。除了Android和iOS平臺(tái),李老師也深入研究
HTML5、phoneGap、Sencha-Touch、Less、Bootstrap、AngularJS、NodeJS等前端利器。
2015年8月 CCTV發(fā)現(xiàn)之旅《華商論見(jiàn)》欄目特約嘉賓,受邀參加節(jié)目《互聯(lián)網(wǎng) 浪潮下的創(chuàng)業(yè)之道》,接受央視著名主持人水均益采
訪。2015年10月 曾受邀加入中國(guó)經(jīng)貿(mào)代表團(tuán)隨總理出訪韓國(guó),參與總理訪韓午餐會(huì)以及中日韓工商峰會(huì)。2015年12月 榮獲中國(guó)經(jīng)濟(jì)新模
式創(chuàng)新與發(fā)展峰會(huì)“2015中國(guó)IT教育培訓(xùn)行業(yè)**具創(chuàng)新人物”獎(jiǎng)。
李老師不但具有豐富的軟件開(kāi)發(fā)經(jīng)驗(yàn),并且懂得如何把自己掌握的知識(shí)及技能傳授給他人,曾給多家企業(yè)提供Android/iOS技術(shù)培訓(xùn)
、技術(shù)支持、技術(shù)咨詢等服務(wù)。李老師的授課視頻深得學(xué)生們的喜愛(ài),已培養(yǎng)出好幾千名iOS程序員。
自學(xué)java與java培訓(xùn)該如何選擇
從事IT培訓(xùn)行業(yè)這些年,身邊經(jīng)常有朋友來(lái)咨詢,問(wèn)現(xiàn)在是否可以加入這個(gè)高薪行業(yè),Java學(xué)習(xí)難不難,需要哪些條件?
在軟件開(kāi)發(fā)設(shè)計(jì)行業(yè)當(dāng)中,使用**多的編程語(yǔ)言就屬Java軟件開(kāi)發(fā)了,很多人都想在Java編程開(kāi)發(fā)領(lǐng)域?qū)で笠环莨ぷ鳌?/span>
Java是當(dāng)前世界上比較流行的計(jì)算機(jī)編程語(yǔ)言,Java徹底改變了人們的生活,國(guó)內(nèi)的開(kāi)發(fā)人才需求量仍然在不斷的增長(zhǎng),主要原因還是在于移動(dòng)互聯(lián)網(wǎng)的快速發(fā)展,衍生出一大批的新生企業(yè),創(chuàng)業(yè)公司,預(yù)計(jì)在未來(lái)5年內(nèi)Java軟件開(kāi)發(fā)人才的需求將會(huì)遠(yuǎn)大于供給,其中java程序員、java工程師**為缺乏。
自學(xué)java與java培訓(xùn)是兩個(gè)繞不開(kāi)的話題,兩者的區(qū)別,前者知識(shí)是自己搜尋的,買書(shū)看或者網(wǎng)上找視頻看,而后者,技術(shù)知識(shí)是老師教的,作為一個(gè)普通大學(xué)生實(shí)際上任何人都能夠自學(xué),只不過(guò)聰明程度和堅(jiān)持的時(shí)間長(zhǎng)短不同,花費(fèi)的時(shí)間長(zhǎng)一點(diǎn)短一點(diǎn)而已。
學(xué)習(xí)關(guān)乎到時(shí)間和金錢,沒(méi)有效果和質(zhì)量的培訓(xùn),其實(shí)是沒(méi)有任何意義的。Java培訓(xùn)班有哪些呢?市面上的Java培訓(xùn)良莠不齊,選擇時(shí)應(yīng)該慎重些。Java致力于打造符合企業(yè)需求的全能型人才。課程定位定位中高級(jí)JAVA開(kāi)發(fā)工程師,課程內(nèi)容涉及面廣,內(nèi)容深。課程涵蓋了Java、Web,數(shù)據(jù)庫(kù),企業(yè)流行框架,Java等企業(yè)**佳實(shí)踐、云計(jì)算大數(shù)據(jù)課程、內(nèi)容由淺入深,剖析原理,讓學(xué)員掌握實(shí)用技術(shù),做企業(yè)和社會(huì)需要的稀缺人才。
此外,Java培訓(xùn)將為你提供就業(yè)保障,開(kāi)設(shè)有就業(yè)指導(dǎo)課,設(shè)有專門(mén)的就業(yè)指導(dǎo)老師,在畢業(yè)前期,畢業(yè)之際,就業(yè)老師會(huì)為你做專門(mén)的就業(yè)指導(dǎo),更有職業(yè)素養(yǎng)課程,不僅將你打造成Java開(kāi)發(fā)技術(shù)達(dá)人,更是一位懂得職場(chǎng)之道的合格就業(yè)者。還有豐富的Java學(xué)習(xí)視頻免費(fèi)為你提供學(xué)習(xí)。
大數(shù)據(jù)核心知識(shí)
Hadoop基礎(chǔ)
Hadoop1介紹
hadoop1架構(gòu)
hadoop2架構(gòu)(對(duì)比hadoop1)
hadoop2環(huán)境搭建
HDFS操作
yarn操作
Hadoop應(yīng)用
Hive數(shù)據(jù)倉(cāng)庫(kù)
zookeeper系統(tǒng)服務(wù)
HBase非關(guān)系型數(shù)據(jù)庫(kù)
Sqoop數(shù)據(jù)庫(kù)抽取工具
Flume日志抽取工具
Spark基礎(chǔ)
環(huán)境搭建
Spark平臺(tái)介紹
RDD彈性分布式數(shù)據(jù)集
Scala編程
Spark應(yīng)用
Spark-SQL組件
DataFrame組件
課程優(yōu)勢(shì)
1.真實(shí)的企業(yè)項(xiàng)目;
2.目前企業(yè)中應(yīng)用廣泛的技術(shù)路線;
3.部分Spark源碼剖析,從源碼層面提升問(wèn)題解決能力。
4.從hadoop1到hadoop2機(jī)制原理詳細(xì)解說(shuō);
5.生產(chǎn)環(huán)境hadoop集群調(diào)優(yōu)經(jīng)驗(yàn);
6.企業(yè)真實(shí)項(xiàng)目實(shí)戰(zhàn);
本階段學(xué)習(xí)目標(biāo)
1.了解hadoop機(jī)制原理 ;
2.了解hadoop集群搭建過(guò)程;
3.了解Hdfs API使用以及mr編程模型;
4.了解hive、hbase、sqoop、flume等組件的使用方法;
5.Spark平臺(tái)的優(yōu)勢(shì)以及Spark集群的搭建過(guò)程;
6.Scala程序設(shè)計(jì)基礎(chǔ);
7.Spark-SQL和DataFrame API詳解。
本階段學(xué)習(xí)效果
1.了解hadoop集群的搭建過(guò)程;
2.能夠**mr和hive來(lái)實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)清洗的業(yè)務(wù)需求;
3.能夠了解數(shù)據(jù)的抽取,轉(zhuǎn)換,清洗,建模,入庫(kù)過(guò)程;
4.掌握Spark集群的搭建;
5.掌握函數(shù)式編程思想,能夠根據(jù)業(yè)務(wù)需求編寫(xiě)高質(zhì)量的Scala程序;
6.掌握大規(guī)模離線數(shù)據(jù)的計(jì)算、分析能力。
Redis Java客戶端Jedis
>
目前Redis基于java語(yǔ)言的Client:
Jredis:https://github.com/alphazero/jredisJedis:https://github.com/xetorthio/jedisRedis4J:https://github.com/guming/redis4j
Jedis是**方提供的唯一Redis Client
For Java PRovider。
[html] view
plain copy
print?
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.2</version>
</dependency>
一、Jedis簡(jiǎn)單使用
[java] view
plain copy
print?
package cn.slimsmart.redis.demo.jedis;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import redis.clients.jedis.Jedis;
@SuppressWarnings("resource")
public class JedisTest {
private static final String HASH_KEY = "key";
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.36.189", 6379);
/**
* 存儲(chǔ)String key-value
*/
jedis.set(HASH_KEY, "value");
/**
* 如果已經(jīng)存在key了,先刪除掉
*/
if (jedis.exists(HASH_KEY)) {
System.out.println(jedis.get(HASH_KEY));
jedis.del(HASH_KEY);
}
/**
* 存入單個(gè)key-value
*/
jedis.hset(HASH_KEY, "username", "yourUsername");
/**
* 存入多個(gè)key-value鍵值對(duì)
*/
Map<String, String> keyValueMap = new HashMap<String, String>();
keyValueMap.put("passWord", "YourPassword");
keyValueMap.put("age", "20");
jedis.hmset(HASH_KEY, keyValueMap);
/**
* 判斷某個(gè)key是否在指定的Hash key中
*/
boolean existsUsernameKey = jedis.hexists(HASH_KEY, "username");
// true
System.out.println(existsUsernameKey);
/**
* 獲取某個(gè)hash中鍵值對(duì)的數(shù)量
*/
Long len = jedis.hlen(HASH_KEY);
// 3
System.out.println(len);
/**
* 獲取一個(gè)hash中的所有key
*/
Set<String> keys = jedis.hkeys(HASH_KEY);
// [password, username, age]
System.out.println(keys);
/**
* 獲取一個(gè)hash中的所有values
*/
List<String> values = jedis.hvals(HASH_KEY);
// [yourUsername, YourPassword, 20]
System.out.println(values);
/**
* 獲取指定hash的所有的鍵值對(duì)
*/
Map<String, String> allKVMap = jedis.hgetAll(HASH_KEY);
// {username=yourUsername, age=20, password=YourPassword}
System.out.println(allKVMap);
/**
* 從一個(gè)hash中獲取某個(gè)field的值
*/
String value = jedis.hget(HASH_KEY, "username");
// yourUsername
System.out.println(value);
List<String> multValues = jedis.hmget(HASH_KEY, "username", "password");
// [yourUsername, YourPassword]
System.out.println(multValues);
}
}
二、連接池的使用
Jedis使用commons-pool完成池化實(shí)現(xiàn)。
1.配置文件redis.properties
[plain] view
plain copy
print?
redis.pool.maxTotal=10
redis.pool.minIdle=2
redis.pool.maxIdle=10
redis.pool.maxWait=1000
redis.pool.testWhileIdle=true
redis.pool.testOnBorrow=true
redis.pool.testOnReturn=true
#ip
redis.ip=192.168.36.189
#Port
redis.port=6379
2.實(shí)例代碼
[java] view
plain copy
print?
package cn.slimsmart.redis.demo.jedis;
import java.util.ResourceBundle;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolTest {
public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("redis");
if (bundle == null) {
throw new IllegalArgumentException("[redis.properties] is not found!");
}
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.valueOf(bundle.getString("redis.pool.maxTotal")));
config.setMinIdle(Integer.valueOf(bundle.getString("redis.pool.minIdle")));
config.setMaxIdle(Integer.valueOf(bundle.getString("redis.pool.maxIdle")));
config.setMaxWaitMillis(Long.valueOf(bundle.getString("redis.pool.maxWait")));
config.setTestWhileIdle(Boolean.valueOf(bundle.getString("redis.pool.testWhileIdle")));
config.setTestOnBorrow(Boolean.valueOf(bundle.getString("redis.pool.testOnBorrow")));
config.setTestOnReturn(Boolean.valueOf(bundle.getString("redis.pool.testOnReturn")));
JedisPool pool = new JedisPool(config, bundle.getString("redis.ip"), Integer.valueOf(bundle.getString("redis.port")));
// 從池中獲取一個(gè)Jedis對(duì)象
Jedis jedis = pool.getResource();
String key = "key";
// 刪數(shù)據(jù)
jedis.del(key);
// 存數(shù)據(jù)
jedis.set(key, "abc123");
// 取數(shù)據(jù)
String value = jedis.get(key);
System.out.println(value);
// 釋放對(duì)象池
pool.returnResource(jedis);
}
}
三、一致性哈希
Memcached完全基于分布式集群,而Redis是Master-Slave,如果想把Reids,做成集群模式,無(wú)外乎多做幾套Master-Slave,每套Master-Slave完成各自的容災(zāi)處理,**Client工具,完成一致性哈希。Memcached是在Server端完成Sharding,Redis只能依靠各個(gè)Client做Sharding。在Redis 3.0系列支持Server端Sharding。
shared一致性哈希采用以下方案:
1.Redis服務(wù)器節(jié)點(diǎn)劃分:將每臺(tái)服務(wù)器節(jié)點(diǎn)采用hash算法劃分為160個(gè)虛擬節(jié)點(diǎn)(可以配置劃分權(quán)重)
2.將劃分虛擬節(jié)點(diǎn)采用TreeMap存儲(chǔ)
3.對(duì)每個(gè)Redis服務(wù)器的物理連接采用LinkedHashMap存儲(chǔ)
4.對(duì)Key采用同樣的hash算法,然后從TreeMap獲取大于等于鍵hash值得節(jié)點(diǎn),取**鄰近節(jié)點(diǎn)存儲(chǔ);當(dāng)key的hash值大于虛擬節(jié)點(diǎn)hash值得**大值時(shí),存入**個(gè)虛擬節(jié)點(diǎn)
sharded采用的hash算法:md5和MurmurHash兩種;默認(rèn)采用64位的MurmurHash算法。
1.配置文件redis.properties
[plain] view
plain copy
print?
redis.pool.maxTotal=10
redis.pool.minIdle=2
redis.pool.maxIdle=10
redis.pool.maxWait=1000
redis.pool.testWhileIdle=true
redis.pool.testOnBorrow=true
redis.pool.testOnReturn=true
#IP
redis1.ip=192.168.36.189
redis2.ip=192.168.36.54
#Port
redis.port=6379
2.實(shí)例代碼
[java] view
plain copy
print?
package cn.slimsmart.redis.demo.jedis;
import java.util.LinkedList;
import java.util.List;
import java.util.ResourceBundle;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
public class JedisShardInfoTest {
public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("redis");
if (bundle == null) {
throw new IllegalArgumentException("[redis.properties] is not found!");
}
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(Integer.valueOf(bundle.getString("redis.pool.maxTotal")));
config.setMinIdle(Integer.valueOf(bundle.getString("redis.pool.minIdle")));
config.setMaxIdle(Integer.valueOf(bundle.getString("redis.pool.maxIdle")));
config.setMaxWaitMillis(Long.valueOf(bundle.getString("redis.pool.maxWait")));
config.setTestWhileIdle(Boolean.valueOf(bundle.getString("redis.pool.testWhileIdle")));
config.setTestOnBorrow(Boolean.valueOf(bundle.getString("redis.pool.testOnBorrow")));
config.setTestOnReturn(Boolean.valueOf(bundle.getString("redis.pool.testOnReturn")));
JedisShardInfo jedisShardInfo1 = new JedisShardInfo(bundle.getString("redis1.ip"), Integer.valueOf(bundle.getString("redis.port")));
JedisShardInfo jedisShardInfo2 = new JedisShardInfo(bundle.getString("redis2.ip"), Integer.valueOf(bundle.getString("redis.port")));
List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();
list.add(jedisShardInfo1);
list.add(jedisShardInfo2);
// 初始化ShardedJedisPool代替JedisPool
ShardedJedisPool pool = new ShardedJedisPool(config, list);
// 從池中獲取一個(gè)Jedis對(duì)象
ShardedJedis jedis = pool.getResource();
String keys = "key";
String value = "abc123";
// 刪數(shù)據(jù)
jedis.del(keys);
// 存數(shù)據(jù)
jedis.set(keys, value);
// 取數(shù)據(jù)
String v = jedis.get(keys);
System.out.println(v);
// 釋放對(duì)象池
pool.returnResource(jedis);
}
}
**以上方式,向redis進(jìn)行set操作的key-value,會(huì)**hash而均勻的分配到pool里的redis機(jī)器中。
四、spring集成
如果有必要,可以用Spring封裝初始化。
[html] view
plain copy
print?
<context:property-placeholder location="classpath:redis.properties" />
<bean
id="jedisPoolConfig"
class="redis.clients.jedis.JedisPoolConfig">
<property
name="maxTotal"
value="${redis.pool.maxTotal}" />
<property
name="minIdle"
value="${redis.pool.minIdle}" />
<property
name="maxIdle"
value="${redis.pool.maxIdle}" />
<property
name="maxWait"
value="${redis.pool.maxWait}" />
<property
name="testWhileIdle"
value="${redis.pool.testWhileIdle}" />
<property
name="testOnBorrow"
value="${redis.pool.testOnBorrow}" />
<property
name="testOnReturn"
value="${redis.pool.testOnReturn}" />
</bean>
<bean
id="shardedJedisPool"
class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg
index="0"
ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<bean class="redis.clients.jedis.JedisShardInfo">
<constructor-arg
index="0"
value="${redis1.ip}" />
<constructor-arg
index="1"
value="${redis.port}"
type="int" />
</bean>
<bean class="redis.clients.jedis.JedisShardInfo">
<constructor-arg
index="0"
value="${redis2.ip}" />
<constructor-arg
index="1"
value="${redis.port}"
type="int" />
</bean>
</list>
</constructor-arg>
</bean>
當(dāng)然,Spring提供了對(duì)于Redis的專門(mén)支持:spring-data-redis。
相關(guān)推薦:
蘇州JAVA培訓(xùn) 蘇州JAVA培訓(xùn)班 蘇州JAVA培訓(xùn)機(jī)構(gòu)
體驗(yàn)課預(yù)約試聽(tīng)
倒計(jì)時(shí)
12:00:00