『壹』 java就業方向有哪些
對於大多數同學而言,學習編程語言就是為了更好的就業。因為Java在電子商務、企業級開發應用、游戲編程等眾多領域行業發揮著重要作用,所以學習Java一直是一股熱潮。那麼,2020年,Java的職業方向有哪些呢?小編帶你解析。
用途廣泛的Java造就了Java工程師的輝煌,使其在軟體工程師的領域里獨占鰲頭!Java軟體工程師運用Java這個開發工具去完成軟體產品的軟體程序設計、開發、測試、維護升級等工作。隨著Internet的迅速發展,Web應用日益廣泛,Java語言也得到了迅速發展。
Java是目前世界上流行的計算機編程語言,是一種可以編寫跨平台應用軟體的面向對象的程序設計語言。這可以概括Java有著自己獨特的優勢:語言簡單、是一個面向對象、分布式應用並且安全、體系結構中立並且可移植,重要,它是一個動態語言。
計算機專業的大學生欲成為Java工程師,便捷的一條路就是參加以實戰項目為主要教學方法的Java職業技能培訓,從而有效地縮短同企業具體用人需求之間的差距。有關Java的未來職業發展有:1、成為管理人員,例如產品研發經理,技術經理,項目經理等繼續;2、技術工作之路,成為高級軟體工程師、需求工程師等。
Java軟體工程師一般月薪范圍在6000-10000元,遠遠超過了應屆畢業生月薪2500元的平均水平。通常來說,有一年工作經驗的Java高級軟體工程師的薪酬大致在年薪10—13萬左右。Java可以從事JSP網站開發、Java編程、Java游戲開發、Java桌面程序設計,以及其他與Java語言編程相關的工作,可進入電信、銀行、保險專業軟體開發公司等從事軟體設計和開發工作。
據權威統計機構統計——在所有軟體開發類人才的需求中,對Java工程師的需求達到全部需求量的60%~70%。面對如此好的就業前景,還等什麼
『貳』 redis可以多key對應一個value嗎
redis可以多key對應一個value,設置方法為:
1、打開HBuilderX工具,新建web項目並在js文件夾中,創建一個js文件map.js。
『叄』 redis field 是什麼意思 跟key是什麼關系,比如lpush(key,field,value)應該怎麼設置
先說redisredis是一個類似memcached的key/value存儲系統,它支持存儲的value類型相對較多,包括string(字元串)、list(鏈表)、set(集合)和zset(有序集合)。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件(這點兒個人覺得redis比memcache在數據保存上要安全一些),並且在此基礎上實現了master-slave(主從)同步。redis的存取性能很高,SET操作每秒鍾110000次,GET操作每秒鍾81000次(速度很爽!)。Redis針對不同的存儲類型對象提供了不同的命令。redis目前提供四種數據類型:string,list,set及zset(sortedset)。string是最簡單的類型,你可以理解成與Memcached一模一個的類型,一個key對應一個value,其上支持的操作與Memcached的操作類似。但它的功能更豐富。list是一個鏈表結構,主要功能是push、pop、獲取一個范圍的所有值等等。操作中key理解為鏈表的名字。set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交並差等操作。操作中key理解為集合的名字。zset是set的一個升級版本,他在set的基礎上增加了一個順序屬性,這一屬性在添加修改元素的時候可以指定,每次指定後,zset會自動重新按新的值調整順序。可以理解了有兩列的mysql表,一列存value,一列存順序。操作中key理解為zset的名字。下面提供redis命令:適合全體類型的命令EXISTSkey判斷一個鍵是否存在;存在返回1;否則返回0;DELkey刪除某個key,或是一系列key;DELkey1key2key3key4TYPEkey返回某個key元素的數據類型(none:不存在,string:字元,list,set,zset,hash)KEYSpattern返回匹配的key列表(KEYSfoo*:查找foo開頭的keys)RANDOMKEY隨機獲得一個已經存在的key,如果當前資料庫為空,則返回空字元串RENAMEoldnamenewname更改key的名字,新鍵如果存在將被覆蓋RENAMENXoldnamenewname更改key的名字,如果名字存在則更改失敗DBSIZE返回當前資料庫的key的總數EXPIRE設置某個key的過期時間(秒),(EXPIREbruce1000:設置bruce這個key1000秒後系統自動刪除)注意:如果在還沒有過期的時候,對值進行了改變,那麼那個值會被清除。TTL查找某個key還有多長時間過期,返回時間秒SELECTindex選擇資料庫MOVEkeydbindex將指定鍵從當前資料庫移到目標資料庫dbindex。成功返回1;否則返回0(源資料庫不存在key或目標資料庫已存在同名key);FLUSHDB清空當前資料庫中的所有鍵FLUSHALL清空所有資料庫中的所有鍵處理字元串的命令SETkeyvalue給一個鍵設置字元串值。SETkeynamedatalengthdata(SETbruce10paitoubing:保存key為burce,字元串長度為10的一個字元串paitoubing到資料庫),data最大不可超過1G。GETkey獲取某個key的value值。如key不存在,則返回字元串「nil」;如key的值不為字元串類型,則返回一個錯誤。GETSETkeyvalue可以理解成獲得的key的值然後SET這個值,更加方便的操作(SETbruce10paitoubing,這個時候需要修改bruce變成1234567890並獲取這個以前的數據paitoubing,GETSETbruce101234567890)MGETkey1key2…keyN一次性返回多個鍵的值SETNXkeyvalueSETNX與SET的區別是SET可以創建與更新key的value,而SETNX是如果key不存在,則創建key與value數據MSETkey1value1key2value2…keyNvalueN在一次原子操作下一次性設置多個鍵和值MSETNXkey1value1key2value2…keyNvalueN在一次原子操作下一次性設置多個鍵和值(目標鍵不存在情況下,如果有一個以上的key已存在,則失敗)INCRkey自增鍵值INCRBYkeyinteger令鍵值自增指定數值DECRkey自減鍵值DECRBYkeyinteger令鍵值自減指定數值處理lists的命令RPUSHkeyvalue從List尾部添加一個元素(如序列不存在,則先創建,如已存在同名Key而非序列,則返回錯誤)LPUSHkeyvalue從List頭部添加一個元素LLENkey返回一個List的長度LRANGEkeystartend從自定的范圍內返回序列的元素(LRANGEtestlist02;返回序列testlist前012元素)LTRIMkeystartend修剪某個范圍之外的數據(LTRIMtestlist02;保留012元素,其餘的刪除)LINDEXkeyindex返回某個位置的序列值(LINDEXtestlist0;返回序列testlist位置為0的元素)LSETkeyindexvalue更新某個位置元素的值LREMkeycountvalue從List的頭部(count正數)或尾部(count負數)刪除一定數量(count)匹配value的元素,返回刪除的元素數量。LPOPkey彈出List的第一個元素RPOPkey彈出List的最後一個元素RPOPLPUSHsrckeydstkey彈出_srckey_中最後一個元素並將其壓入_dstkey_頭部,key不存在或序列為空則返回「nil」處理集合(sets)的命令(有索引無序序列)SADDkeymember增加元素到SETS序列,如果元素(membe)不存在則添加成功1,否則失敗0;(SADDtestlist3/none)SREMkeymember刪除SETS序列的某個元素,如果元素不存在則失敗0,否則成功1(SREMtestlist3/None)SPOPkey從集合中隨機彈出一個成員SMOVEsrckeydstkeymember把一個SETS序列的某個元素移動到另外一個SETS序列(SMOVEtestlisttest3/ntwo;從序列testlist移動元素two到test中,testlist中將不存在two元素)SCARDkey統計某個SETS的序列的元素數量SISMEMBERkeymember獲知指定成員是否存在於集合中SINTERkey1key2…keyN返回key1,key2,…,keyN中的交集SINTERSTOREdstkeykey1key2…keyN將key1,key2,…,keyN中的交集存入dstkeySUNIONkey1key2…keyN返回key1,key2,…,keyN的並集SUNIONSTOREdstkeykey1key2…keyN將key1,key2,…,keyN的並集存入dstkeySDIFFkey1key2…keyN依據key2,…,keyN求key1的差集。官方例子:key1=x,a,b,ckey2=ckey3=a,dSDIFFkey1,key2,key3=>x,bSDIFFSTOREdstkeykey1key2…keyN依據key2,…,keyN求key1的差集並存入dstkeySMEMBERSkey返回某個序列的所有元素SRANDMEMBERkey隨機返回某個序列的元素處理有序集合(sortedsets)的命令(zsets)ZADDkeyscoremember添加指定成員到有序集合中,如果目標存在則更新score(分值,排序用)ZREMkeymember從有序集合刪除指定成員ZINCRBYkeyincrementmember如果成員存在則將其增加_increment_,否則將設置一個score為_increment_的成員ZRANGEkeystartend返回升序排序後的指定范圍的成員ZREVRANGEkeystartend返回降序排序後的指定范圍的成員ZRANGEBYSCOREkeyminmax返回所有符合score>=min和score=min和score形式的數據,通過key進行任何操作。ttserver可以將數據持久化保存,memcached全部是保存在內存中,memcached會自動刪除過期數據,最長不超過30天。memcached在和一些api配合時,能自動進行數據的出入序列化,讀取反序列化。ttserver有主從復制的功能,操作日誌等,這完全是資料庫才有的東西。據說memcached正在對整體架構做調整,到時候支持plugin機制.會把網路,事件處理,內存存儲剝離開來.以後要做基於磁碟的key-value存儲就可以寫一個存儲引擎就成了。memcached的二次開發又步入一個小高潮。
『肆』 了解redis底層原理,自己手寫實現jedis
一、Jedis實現原理
要自己手寫jedis,首先要了解jedis的原理,我們在命令窗口輸入set、get等命令背後的實現原理是什麼?
大白話講就是jedis通過tcp連接發送消息到redis伺服器,接收到回復消息後再解析出來即可(我們執行的命令如set name test等都是按協議構造的),消息按約定好的規范,這個規范就是RESP協議
resp協議官網說明:http://www.redis.cn/topics/protocol.html
二、RESP協議
resp協議定義了5種命令格式,間隔符號,在Linux下是r ,在Windows下是
1、單行的簡單字元串Simple Strings:以 "+"加號 開頭, 格式:+ 字元串 r
2、錯誤 Errors, 以"-"減號 開頭 格式:- 錯誤前綴 錯誤信息 r
3、整數型 Integers, 以 ":" 冒號開頭 格式:: 數字 r
SETNX、DEL、EXISTS、INCR、INCRBY、DECR、DECRBY、DBSIZE、LASTSAVE、RENAMENX、MOVE、LLEN、SADD、SREM、SISMEMBER、SCARD等命令都會返回整數
4、大字元串類型 Bulk Strings(多行字元串), 以 "#34;美元符號開頭,長度限制512M
格式:$ 字元串的長度 r 字元串 r
多用於返回二進制安全的字元串, "$0rnrn"代表空字元串,redis-cli收到後顯示的是"";"$-1rn"表示不存在,redis-cli收到顯示的是nil
5、數組類型 Arrays,以 "*"開頭 格式:* 數組元素個數 r 其他所有類型 (結尾不需要r )
不僅用於服務端向客戶端發送命令,也可用於客戶端向服務端發送命令
eg:
"*0r " #空數組
"*2r $3r foor $3r barr " #數組包含2個元素,分別是字元串foo和bar
"*3r :1r :2r :3r " #數組包含3個整數:1、2、3
"*5r :1r :2r :3r :4r $6r foobarr " #包含混合類型的數組
"*3r $3r SETr $2r aar $4r testr " #命令:SET aa test
三、代碼手寫實現
理解了jedis實現原理,我們就可以手寫實現了,當然前提是先搭建一個redis服務,我們在本機搭建了一個redis server,埠號是6379
『伍』 redis cluster命令cluster nodes怎麼用
redis cluster配置好,並運行一段時間後,我們想添加節點,或者刪除節點,該怎麼辦呢。
一,redis cluster命令行
查看復制列印?
//集群(cluster)
CLUSTER INFO 列印集群的信息
CLUSTER NODES 列出集群當前已知的所有節點(node),以及這些節點的相關信息。
//節點(node)
CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點添加到集群當中,讓它成為集群的一份子。
CLUSTER FORGET <node_id> 從集群中移除 node_id 指定的節點。
CLUSTER REPLICATE <node_id> 將當前節點設置為 node_id 指定的節點的從節點。
CLUSTER SAVECONFIG 將節點的配置文件保存到硬碟裡面。
//槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。
CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。
CLUSTER FLUSHSLOTS 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。
CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中導入槽 slot 到本節點。
CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的導入(import)或者遷移(migrate)。
//鍵 (key)
CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。
這些命令是集群所獨有的。執行上述命令要先登錄
查看復制列印?
[root@manage redis]# redis-cli -c -p 6382 -h 192.168.10.220 //登錄
192.168.10.220:6382> cluster info //查看集群情況
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:8
cluster_my_epoch:4
cluster_stats_messages_sent:82753
cluster_stats_messages_received:82754
二,添加節點
1,新配置二個測試節點
查看復制列印?
# cd /etc/redis
//新增配置
# cp redis-6379.conf redis-6378.conf && sed -i "s/6379/6378/g" redis-6378.conf
# cp redis-6382.conf redis-6385.conf && sed -i "s/6382/6385/g" redis-6385.conf
//啟動
# redis-server /etc/redis/redis-6385.conf > /var/log/redis/redis-6385.log 2>&1 &
# redis-server /etc/redis/redis-6378.conf > /var/log/redis/redis-6378.log 2>&1 &
2,添加主節點
# redis-trib.rb add-node 192.168.10.219:6378 192.168.10.219:6379
注釋:
192.168.10.219:6378是新增的節點
192.168.10.219:6379集群任一個舊節點
3,添加從節點
# redis-trib.rb add-node --slave --master-id 192.168.10.220:6385 192.168.10.219:6379
注釋:
--slave,表示添加的是從節點
--master-id ,主節點的node id,在這里是前面新添加的6378的node id
192.168.10.220:6385,新節點
192.168.10.219:6379集群任一個舊節點
4,重新分配slot
查看復制列印?
# redis-trib.rb reshard 192.168.10.219:6378 //下面是主要過程
How many slots do you want to move (from 1 to 16384)? 1000 //設置slot數1000
What is the receiving node ID? //新節點node 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 //表示全部節點重新洗牌
Do you want to proceed with the proposed reshard plan (yes/no)? yes //確認重新分
新增加的主節點,是沒有slots的,
『陸』 redis getset 命令怎麼使用方法
[Redis] redis-cli 命令總結
Redis提供豐富命令(command)資料庫各種數據類型進行操作些commandLinux終端使用
編程比使用Redis Java語言包些命令都應面Redis提供命令做總結
官網命令列表: (英文)
1、連接操作相關命令
quit:關閉連接(connection)
auth:簡單密碼認證
2、value操作命令
exists(key):確認key否存
del(key):刪除key
type(key):返值類型
keys(pattern):返滿足給定pattern所key
randomkey:隨機返key空間key
rename(oldname, newname):key由oldname重命名newname若newname存則刪除newname表示key
dbsize:返前資料庫key數目
expire:設定key間(s)
ttl:獲key間
select(index):按索引查詢
move(key, dbindex):前資料庫key轉移dbindex索引資料庫
flushdb:刪除前選擇資料庫所key
flushall:刪除所資料庫所key
3、String操作命令
set(key, value):給資料庫名稱keystring賦予值value
get(key):返資料庫名稱keystringvalue
getset(key, value):給名稱keystring賦予value
mget(key1, key2,…, key N):返庫string(名稱key1key2…)value
setnx(key, value):存名稱keystring則向庫添加string名稱key值value
setex(key, time, value):向庫添加string(名稱key值value)同設定期間time
mset(key1, value1, key2, value2,…key N, value N):同給string賦值名稱key istring賦值value i
msetnx(key1, value1, key2, value2,…key N, value N):所名稱key istring都存則向庫添加string
名稱key i賦值value i
incr(key):名稱keystring增1操作
incrby(key, integer):名稱keystring增加integer
decr(key):名稱keystring減1操作
decrby(key, integer):名稱keystring減少integer
append(key, value):名稱keystring值附加value
substr(key, start, end):返名稱keystringvalue串
4、List操作命令
rpush(key, value):名稱keylist尾添加值value元素
lpush(key, value):名稱keylist添加值value 元素
llen(key):返名稱keylist度
lrange(key, start, end):返名稱keyliststart至end間元素(標0始同)
ltrim(key, start, end):截取名稱keylist保留start至end間元素
lindex(key, index):返名稱keylistindex位置元素
lset(key, index, value):給名稱keylistindex位置元素賦值value
lrem(key, count, value):刪除count名稱keylist值value元素
count0刪除所值value元素count>0至尾刪除count值value元素count<0尾刪除|count|值value元素
lpop(key):返並刪除名稱keylist首元素 rpop(key):返並刪除名稱keylist尾元素
blpop(key1, key2,… key N, timeout):lpop命令block版本
即timeout0若遇名稱key ilist存或該list空則命令結束
timeout>0則遇述情況等待timeout秒問題沒解決則keyi+1始list執行pop操作
brpop(key1, key2,… key N, timeout):rpopblock版本參考命令
rpoplpush(srckey, dstkey):返並刪除名稱srckeylist尾元素並該元素添加名稱dstkeylist部
5、Set操作命令
sadd(key, member):向名稱keyset添加元素member
srem(key, member) :刪除名稱keyset元素member
spop(key) :隨機返並刪除名稱keyset元素
smove(srckey, dstkey, member) :member元素名稱srckey集合移名稱dstkey集合
scard(key) :返名稱keyset基數
sismember(key, member) :測試member否名稱keyset元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, key1, key2,…key N) :求交集並交集保存dstkey集合
sunion(key1, key2,…key N) :求並集
sunionstore(dstkey, key1, key2,…key N) :求並集並並集保存dstkey集合
sdiff(key1, key2,…key N) :求差集
sdiffstore(dstkey, key1, key2,…key N) :求差集並差集保存dstkey集合
smembers(key) :返名稱keyset所元素
srandmember(key) :隨機返名稱keyset元素
6、zset(sorted set)操作命令
zadd(key, score, member):向名稱keyzset添加元素memberscore用於排序該元素已經存則根據score更新該元素順序
zrem(key, member) :刪除名稱keyzset元素member
zincrby(key, increment, member) :名稱keyzset已經存元素member則該元素score增加increment;
否則向集合添加該元素其score值increment
zrank(key, member) :返名稱keyzset(元素已按score排序)member元素rank(即index0始)
若沒member元素返nil
zrevrank(key, member) :返名稱keyzset(元素已按score排序)member元素rank(即index0始)
若沒member元素返nil
zrange(key, start, end):返名稱keyzset(元素已按score排序)indexstartend所元素
zrevrange(key, start, end):返名稱keyzset(元素已按score排序)indexstartend所元素
zrangebyscore(key, min, max):返名稱keyzsetscore >= min且score <= max所元素
zcard(key):返名稱keyzset基數 zscore(key, element):返名稱keyzset元素element
score zremrangebyrank(key, min, max):刪除名稱keyzsetrank >= min且rank <= max所元素
zremrangebyscore(key, min, max) :刪除名稱keyzsetscore >= min且score <= max所元素
zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):Nzset求並集交集
並集合保存dstkeyN於集合每元素score進行AGGREGATE運算前都要乘於WEIGHT參數
沒提供WEIGHT默認1默認AGGREGATESUM即結集合元素score所集合應元素進行SUM運算值MINMAX指
結集合元素score所集合應元素值值
7、Hash操作命令
hset(key, field, value):向名稱keyhash添加元素fieldvalue
hget(key, field):返名稱keyhashfield應value
hmget(key, field1, …,field N):返名稱keyhashfield i應value
hmset(key, field1, value1,…,field N, value N):向名稱keyhash添加元素field ivalue i
hincrby(key, field, integer):名稱keyhashfieldvalue增加integer
hexists(key, field):名稱keyhash否存鍵field域
hdel(key, field):刪除名稱keyhash鍵field域
hlen(key):返名稱keyhash元素數
hkeys(key):返名稱keyhash所鍵
hvals(key):返名稱keyhash所鍵應value
hgetall(key):返名稱keyhash所鍵(field)及其應value
8、持久化
save:數據同步保存磁碟
bgsave:數據非同步保存磁碟
lastsave:返功數據保存磁碟Unix戳
shundown:數據同步保存磁碟關閉服務
9、遠程服務控制
info:提供伺服器信息統計
monitor:實轉儲收請求
slaveof:改變復制策略設置
config:運行配置Redis伺服器
『柒』 redis怎麼解決app與伺服器通信
簡介
幾乎所有的主流編程語言都有Redis的客戶端,不考慮Redis非常流行的原因,如果站在技術的角度看原因還有兩個:
客戶端與服務端之間的通信協議是在TCP 協議之上構建的。
客戶端和伺服器通過 TCP 連接來進行數據交互, 伺服器默認的埠號為 6379 。
客戶端和伺服器發送的命令或數據一律以 (CRLF)結尾。
Redis制定了 RESP(REdis Serialization Protocol,Redis序列化協議)實現客戶端與服務端的正常交互,這種協議簡單高效,既能夠被機器解析,又容易被人類識別。
發送命令
RESP 在 Redis 1.2 版本中引入, 並最終在 Redis 2.0 版本成為 Redis 伺服器通信的標准方式。
在這個協議中, 所有發送至 Redis 伺服器的參數都是二進制安全(binary safe)的。
RESP 的規定一條命令的格式如下:
命令本身也作為協議的其中一個參數來發送。
例如我們經常執行的 SET 命令,在命令行中我們輸入如下:
使用 RESP 協議規定的格式:
這個命令的實際協議值如下:
"*3 $3 SET $3 key $5 value "
回復
Redis 命令會返回多種不同類型的回復。
通過檢查伺服器發回數據的第一個位元組, 可以確定這個回復是什麼類型:
狀態回復(status reply)的第一個位元組是 "+"
錯誤回復(error reply)的第一個位元組是 "-"
整數回復(integer reply)的第一個位元組是 ":"
批量回復(bulk reply)的第一個位元組是 "$"
多條批量回復(multi bulk reply)的第一個位元組是 "*"
我們知道redis-cli只能看到最終的執行結果,那是因為redis-cli本身就按照RESP進行結果解析的,所以看不到中間結果,redis-cli.c 源碼對命令結果的解析結構如下: