Aerospike
Aerospike介紹
Aerospike(簡(jiǎn)稱AS)是一個(gè)分布式暂殖,可擴(kuò)展的鍵值存儲(chǔ)的NoSQL數(shù)據(jù)庫羊娃。
T級(jí)別大數(shù)據(jù)高并發(fā)的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)
讀寫操作達(dá)微妙級(jí)熏挎,99%的響應(yīng)可在1毫秒內(nèi)實(shí)現(xiàn)
采用混合架構(gòu),索引存儲(chǔ)在內(nèi)存中,而數(shù)據(jù)可存儲(chǔ)在機(jī)械硬盤(HDD)或固態(tài)硬盤(SSD) 上(也可存儲(chǔ)在
內(nèi)存)
AS內(nèi)部在訪問SSD屏蔽了文件系統(tǒng)層級(jí),直接訪問地址搀菩,保證了數(shù)據(jù)的讀取速度。
AS同時(shí)支持二級(jí)索引與Client聚合破托,支持簡(jiǎn)單的sql操作(aql)肪跋,相比于其他nosql數(shù)據(jù)庫,有一定優(yōu)
勢(shì)土砂。
Aerospike應(yīng)用場(chǎng)景
Aerospike作為一個(gè)大容量的NoSql解決方案州既,并未在國內(nèi)廠中廣泛商使用谜洽。它適合對(duì)容量要求比較
大,QPS相對(duì)低一些的場(chǎng)景易桃,目前主要集中于互聯(lián)網(wǎng)廣告行業(yè)使用(國外)
個(gè)性化推薦廣告應(yīng)用
個(gè)性化推薦廠告是建立在了和掌握消費(fèi)者獨(dú)特的偏好和習(xí)性的基礎(chǔ)之上褥琐,對(duì)消費(fèi)者的購買需求做出準(zhǔn)確
的預(yù) 或引導(dǎo),在合適的位置晤郑、合適的時(shí)間,以合適的形式向消費(fèi)者呈現(xiàn)與其需求高度吻合的廣告贸宏,以此
來促進(jìn)用戶的消費(fèi)行為造寝。
用戶行為日志收集系統(tǒng)收集日志之后推送到ETL做數(shù)據(jù)的清洗和轉(zhuǎn)換
把ETL過后的數(shù)據(jù)發(fā)送到推薦引擎計(jì)算每個(gè)消費(fèi)者的推薦結(jié)果,其中推薦邏輯包括規(guī)則和算法兩部分
具體的規(guī)則有用戶最近瀏覽吭练、加入購物車诫龙、加入收藏等,
算法則包括商品相似性鲫咽、用戶相似性签赃、文本相似性、圖片相似性等算法分尸。
把推薦引擎的結(jié)果存入Aerospike集群中锦聊,并提供給廣告投放引擎實(shí)時(shí)獲取
實(shí)時(shí)競(jìng)價(jià)廣告應(yīng)用
當(dāng)用戶瀏覽一個(gè)加入SSP(供應(yīng)方平臺(tái))的站點(diǎn)時(shí),SSP會(huì)把此次請(qǐng)求發(fā)送到AD EXCHANGE(廣告交易
平臺(tái))箩绍,然后ADX會(huì)把這次請(qǐng)求發(fā)送給多家DSP孔庭,DSP(需求方平臺(tái))根據(jù)自身的DMP(數(shù)據(jù)管理平
臺(tái)),通過對(duì)次用戶的了解程度進(jìn)行競(jìng)價(jià)材蛛,最終競(jìng)價(jià)勝出的DSP獲得展現(xiàn)廣告的機(jī)會(huì)圆到。
DSP競(jìng)價(jià)(RTB:實(shí)時(shí)競(jìng)價(jià))勝出的關(guān)鍵是DMP能夠根據(jù)用戶的歷史瀏覽等數(shù)據(jù)分析和定位用戶屬性,
其中實(shí)時(shí)競(jìng)價(jià)廣告中非常重要的一個(gè)環(huán)節(jié)就是UserProfile(用戶畫像)卑吭。
分別通過HDFS和HBASE對(duì)日志進(jìn)行離線和實(shí)時(shí)的分析芽淡,然后把用戶畫像的標(biāo)簽(tag : 程序猿、宅男...)結(jié)
果存入高性能的Nosql數(shù)據(jù)庫Aerospike中豆赏,同時(shí)把數(shù)據(jù)備份到異地?cái)?shù)據(jù)中心挣菲。前端廣告投放請(qǐng)求通過
決策引擎(投放引擎)向用戶畫像數(shù)據(jù)庫中讀取相應(yīng)的用戶畫像數(shù)據(jù),然后根據(jù)競(jìng)價(jià)算法出價(jià)進(jìn)行競(jìng)
價(jià)河绽。競(jìng)價(jià)成功之后就可以展現(xiàn)廣告了己单。而在競(jìng)價(jià)成功之后,具體給用戶展現(xiàn)什么樣的廣告耙饰,就是有上面
說的個(gè)性化推薦廣告來完成的纹笼。
Aerospike與Redis對(duì)比
Aerospike是NoSQL的數(shù)據(jù)存儲(chǔ),Redis是緩存
Aerospike是多線程的苟跪,而 Redis 是單線程的
Redis 需要開發(fā)人員自己管理分片并提供分片算法用于在各分片之間平衡數(shù)據(jù)廷痘;
client: hash 一致性hash
codis :代理處理sharding
RedisCluster: hash槽
而 AerospikeDB 可以自動(dòng)處理相當(dāng)于分片的工作蔓涧;
在 Redis 中,為了增加吞吐量笋额,需要增加 Redis 分片的數(shù)量元暴,并重構(gòu)分片算法及重新平衡數(shù)據(jù),這通常
需要停機(jī)兄猩;
而在 AerospikeDB 中茉盏,可以動(dòng)態(tài)增加數(shù)據(jù)卷和吞吐量,無需停機(jī)枢冤,并且 AerospikeDB 可以自動(dòng)平衡數(shù)
據(jù)和流量鸠姨;
在 Redis 中,如果需要復(fù)制及故障轉(zhuǎn)移功能淹真,則需要開發(fā)人員自己在應(yīng)用程序?qū)油綌?shù)據(jù)讶迁;
而在 AerospikeDB 中,只需設(shè)置復(fù)制因子核蘸,然后由 AerospikeDB 完成同步復(fù)制操作巍糯,保持即時(shí)一致
性;而且 AerospikeDB 可以透明地完成故障轉(zhuǎn)移客扎;
Redis是在內(nèi)存中運(yùn)行的 祟峦,AerospikeDB在內(nèi)存中存儲(chǔ)索引,在HDD虐唠、SSD中保存數(shù)據(jù)搀愧,也可以在內(nèi)存
中
Aerospike架構(gòu)
Aerospike分為三個(gè)層次:
Client層:
對(duì)Aerospike Server中的數(shù)據(jù)進(jìn)行訪問。
包括CRUD疆偿、批量操作和基于二級(jí)索引的查詢
是一個(gè)“智能”客戶端咱筛,支持C/C++、Java杆故、GoLang迅箩、Python、C#处铛、Php饲趋、Ruby、JavaScript等絕大部分
主流語言撤蟆。
追蹤節(jié)點(diǎn)感知數(shù)據(jù)存儲(chǔ)位置奕塑,當(dāng)節(jié)點(diǎn)啟動(dòng)或停止時(shí)立即感知集群配置變化。
具有高效性家肯、穩(wěn)定性和內(nèi)部的連接池
Distribution層:
負(fù)責(zé)管理集群內(nèi)部數(shù)據(jù)的平衡分布龄砰、備份、容錯(cuò)和不同集群之間的數(shù)據(jù)同步。主要包含三個(gè)模塊:
- Cluster Management Module
用于追蹤集群節(jié)點(diǎn)换棚。關(guān)鍵算法是確定哪些節(jié)點(diǎn)是集群的一部分的Paxos-like一致投票過程式镐。
Aerospike實(shí)現(xiàn)專門的心跳檢測(cè)(主動(dòng)與被動(dòng)),用于監(jiān)控節(jié)點(diǎn)間的連通性固蚤。 - Data Migration Module
當(dāng)有節(jié)點(diǎn)添加或移除時(shí)娘汞,該模塊保證數(shù)據(jù)的重新分布,按照系統(tǒng)配置的復(fù)制因子確保每個(gè)數(shù)據(jù)塊跨
節(jié)點(diǎn)和跨數(shù)據(jù)中心復(fù)制夕玩。 - Transaction Processing Module
確保讀寫的一致性與隔離性你弦,寫操作先寫副本在寫主庫。該模塊包括:
Sync/Async Replication(同步/異步復(fù)制):為保證寫一致性风秤,在提交數(shù)據(jù)之前向所有副本傳播更
新并將結(jié)果返回客戶端鳖目。
Proxy (代理):集群重配置期間客戶端可能出現(xiàn)短暫過期,透明代理請(qǐng)求到其他節(jié)點(diǎn)缤弦。
Duplicate Resolution(副本解析):當(dāng)集群從活動(dòng)分區(qū)恢復(fù)時(shí),解決不同數(shù)據(jù)副本之間的沖突彻磁。
Data層:
負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)碍沐,Aerospike 屬于弱語法的key-value數(shù)據(jù)庫。數(shù)據(jù)存儲(chǔ)模式如下:
namespace
命名空間衷蜓,數(shù)據(jù)存在命名空間中累提,相當(dāng)于RDBMS中的database,最多可設(shè)置32個(gè)磁浇。
一個(gè)namespace可關(guān)聯(lián)多塊SSD斋陪,一塊SSD只關(guān)聯(lián)一個(gè)namespace,每個(gè)namespace下包含4096個(gè)分
片
set
集合置吓,類似于數(shù)據(jù)庫表无虚,一個(gè)namespace最多1023個(gè)set
record
記錄,類似數(shù)據(jù)庫中的一行記錄衍锚, 采用弱語法(Schema-Less)的方式友题,bin可隨時(shí)增加或減少
key
主鍵,類型于數(shù)據(jù)表中的主鍵
bin
類似于數(shù)據(jù)庫字段戴质,支持Java基本數(shù)據(jù)類型:List度宦、Map、Blob, 一個(gè)namespace下最多32767個(gè)bin
索引:Aerospike Index包含主索引(Primary Index)和二級(jí)索引(Second Index)告匠,索引存儲(chǔ)在內(nèi)存
中戈抄,并不保存在硬盤里
一級(jí)索引(Primary-Index)
一級(jí)索引位于主鍵(key),采用hash表與紅黑樹的混合
二級(jí)索引(Secondary-Index)
二級(jí)索引位于非主鍵上后专,這允許一對(duì)多關(guān)系划鸽。采用哈希表和B-tree的混合
磁盤:Aerospike可以直接訪問硬盤中的raw blocks(原始?jí)K)直接尋址,并特別優(yōu)化了Aerospike的最
小化讀行贪、大塊寫和并行SSD來增加響應(yīng)速度和吞吐量漾稀。
Aerospike的使用
Aerospike的安裝
1模闲、從網(wǎng)上下載aerospike-server-community-5.0.0.7-el6.tgz
wget https://www.aerospike.com/download/server/latest/artifact/el6
下載aerospike-server-community的最新版
2、解壓aerospike-server-community-5.0.0.7-el6.tgz
tar -zxvf aerospike-server-community-5.0.0.7-el6.tgz
mv aerospike-server-community-5.0.0.7-el6 aerospike-server
3崭捍、安裝aerospike-server和aerospike-tools
cd aerospike-server
./asinstall
4尸折、驗(yàn)證是否安裝成功
[root@192 aerospike-server]# yum list installed | grep aerospike
aerospike-server-community.x86_64 5.0.0.7-1.el6 installed
aerospike-tools.x86_64 3.26.2-1.el6 installed
#卸載aerospike
[root@localhost ~]# rpm -e aerospike-server-community.x86_64
[root@localhost ~]# rpm -e aerospike-tools.x86_64
[root@localhost ~]# rm -rf /etc/aerospike/
5、aerospike-server啟動(dòng)殷蛇、停止实夹、重啟、狀態(tài)
systemctl start aerospike
systemctl stop aerospike
systemctl restart aerospike
systemctl status aerospike
6粒梦、aerospike-server管理:asadm
asadm 進(jìn)入管理端
Admin> info
Admin> i net
7亮航、aerospike-server操作 :aql
aql> show namespaces
+------------+
| namespaces |
+------------+
| "test" |
| "bar" |
Aerospike的基本概念
namespace 策略容器,類似RDBMS中的database匀们,可以設(shè)置副本數(shù)缴淋、內(nèi)存大小、有效時(shí)長泄朴、存儲(chǔ)引
擎重抖、文件存儲(chǔ)位置。 ? Sets 類似RDBMS中的表祖灰。 ? Records 類似RDBMS中的行 ? Bin 類似RDBMS中
的列钟沛,一行可以有多個(gè)bins。
Aerospike的數(shù)據(jù)操作
--主鍵 bins 插入可以不同
INSERT INTO <ns>[.<set>] (PK, <bins>) VALUES (<key>, <values>)
DELETE FROM <ns>[.<set>] WHERE PK = <key>
<ns> is the namespace for the record.
<set> is the set name for the record.
<key> is the record's primary key.
<bins> is a comma-separated list of bin names.
<values> is comma-separated list of bin values
沒有update
當(dāng)insert 同一pk時(shí)局扶,數(shù)據(jù)為修改
Examples:
INSERT INTO test.demo (PK, foo, bar) VALUES ('key1', 123, 'abc')
DELETE FROM test.demo WHERE PK = 'key1'
insert into test.user1 (PK,name,age,sex,address) VALUES (2,'zhaoyun',21,
'M','beijing')
insert into test.user2(pk,name,sex,age) values(1,'zhangfei','M',23)
-- pk都是1 則是對(duì)原紀(jì)錄的修改
insert into test.user2(pk,name,sex,age) values(1,'diaochan','F',18)
QUERY
SELECT <bins> FROM <ns>[.<set>]
SELECT <bins> FROM <ns>[.<set>] WHERE <bin> = <value>
SELECT <bins> FROM <ns>[.<set>] WHERE <bin> BETWEEN <lower> AND <upper>
SELECT <bins> FROM <ns>[.<set>] WHERE PK = <key>
SELECT <bins> FROM <ns>[.<set>] IN <indextype> WHERE <bin> = <value>
SELECT <bins> FROM <ns>[.<set>] IN <indextype> WHERE <bin> BETWEEN
<lower> AND <upper>
<ns> is the namespace for the records to be queried.
<set> is the set name for the record to be queried.
<key> is the record's primary key.
<bin> is the name of a bin.
<value> is the value of a bin.
<indextype> is the type of a index user wants to query.
(LIST/MAPKEYS/MAPVALUES)
<bins> can be either a wildcard (*) or a comma-separated list of bin
names.
<lower> is the lower bound for a numeric range query.
<upper> is the lower bound for a numeric range query.
Examples:
SELECT * FROM test.demo
SELECT * FROM test.demo WHERE PK = 'key1'
SELECT foo, bar FROM test.demo WHERE PK = 'key1'
SELECT foo, bar FROM test.demo WHERE foo = 123
SELECT foo, bar FROM test.demo WHERE foo BETWEEN 0 AND 999
select * from test.user2 where name='zhaoyun'
--沒有建立索引 恨统,不能查詢
Error: (201) AEROSPIKE_ERR_INDEX_NOT_FOUND
create index idx_1 on test.user2(name) string
select * from test.user2 where name='zhaoyun'
+-----------+-----+-----+-----------+
| name | sex | age | address |
+-----------+-----+-----+-----------+
| "zhaoyun" | "M" | 21 | "beijing" |
+-----------+-----+-----+-----------+
CREATE INDEX <index> ON <ns>[.<set>] (<bin>) NUMERIC|STRING|GEO2DSPHERE
CREATE LIST/MAPKEYS/MAPVALUES INDEX <index> ON <ns>[.<set>] (<bin>)
NUMERIC|STRING|GEO2DSPHERE
CREATE INDEX idx_foo ON test.demo (foo) NUMERIC
DROP INDEX test.demo idx_foo
Aerospike的客戶端(Java)
pom.xml引入aerospike-client
<!-- https://mvnrepository.com/artifact/com.aerospike/aerospike-client -->
<dependency>
<groupId>com.aerospike</groupId>
<artifactId>aerospike-client</artifactId>
<version>4.4.9</version>
</dependency>
aerospike-client的API使用
//IP+port
AerospikeClient client=new AerospikeClient("192.168.127.128",3000);
//寫策略
WritePolicy wp=new WritePolicy();
//超時(shí)時(shí)間
wp.setTimeout(1000);
/*
key
*/
Key k1=new Key("test","user1",1);
/*
bins
*/
// KV
Bin b11=new Bin("name","zhangfei");
Bin b12=new Bin("sex","M");
Bin b13=new Bin("age",23);
//寫值
client.put(wp,k1,b11,b12,b13);
//讀值
Record r1=client.get(wp,k1,"name","age","sex");
System.out.println(r1);
System.out.println("===================================");
Key k2=new Key("test","user1",2);
/*
bins
*/
// KV
Bin b21=new Bin("name","diaochan");
Bin b22=new Bin("sex","F");
Bin b23=new Bin("age",21);
//寫值
client.put(wp,k2,b21,b22,b23);
/*
取得指定key的數(shù)據(jù)
*/
//批量執(zhí)行策略
BatchPolicy bp=new BatchPolicy(wp);
//key的數(shù)組
Key[] ks={k1,k2};
//循環(huán)輸出
for(Record r:client.get(bp,ks)){
System.out.println(r);
}
Aerospike集群實(shí)現(xiàn)
Aerospike集群管理
集群處理節(jié)點(diǎn)成員身份,并確保當(dāng)前成員和所有集群中的節(jié)點(diǎn)保持一致三妈。包括:集群視圖畜埋、節(jié)點(diǎn)發(fā)現(xiàn)和
視圖改變
集群視圖
每個(gè)Aerospike節(jié)點(diǎn)都會(huì)自動(dòng)分配唯一的節(jié)點(diǎn)標(biāo)識(shí)符,是由MAC地址和監(jiān)聽端口組成的沈跨。包括:
cluster_key:是一個(gè)隨機(jī)生成的8字節(jié)值由捎,用于標(biāo)識(shí)集群視圖的實(shí)例。
succession_list:是作為集群一部分的唯一節(jié)點(diǎn)標(biāo)識(shí)符集合饿凛。
節(jié)點(diǎn)發(fā)現(xiàn)
節(jié)點(diǎn)間通過心跳消息來檢測(cè)節(jié)點(diǎn)的有效或失效
集群中的每個(gè)節(jié)點(diǎn)維護(hù)一個(gè)鄰接表狞玛,是最近向該節(jié)點(diǎn)發(fā)送心跳消息的其他節(jié)點(diǎn)列表
如果心跳超時(shí),則表示該節(jié)點(diǎn)失效涧窒,從鄰接表中刪除
Aerospike還采用其他信息作為備用二次心跳機(jī)制
集群中的每個(gè)節(jié)點(diǎn)通過計(jì)算平均消息丟失來評(píng)估每個(gè)相鄰節(jié)點(diǎn)的運(yùn)行狀態(tài)評(píng)分
視圖改變
領(lǐng)接表一旦發(fā)生改變心肪,就會(huì)觸發(fā)運(yùn)行一個(gè)Paxos共識(shí)算法來確定一個(gè)新的集群視圖。
Aerospike把鄰接表中節(jié)點(diǎn)標(biāo)識(shí)符最高的節(jié)點(diǎn)當(dāng)Proposer纠吴,并承擔(dān)Proposal的角色
Proposal提成新的集群視圖硬鞍,如果被接受,則節(jié)點(diǎn)開始重新分配數(shù)據(jù)(Rebalence)
Aerospike數(shù)據(jù)分布
Aerospike有智能分區(qū)算法,即把用戶輸入的key在內(nèi)部根據(jù)RIPEMD-160算法固该,重新hash出一個(gè)key并
取前20位锅减,然后相對(duì)均衡的把數(shù)據(jù)分布到各個(gè)節(jié)點(diǎn)之上。并且滿足namespace配置文件的配置(例如
保存多少個(gè)備份伐坏、是存在磁盤還是存在內(nèi)存中)怔匣。
每個(gè)Digest Space(namespace)被分為4096個(gè)不重疊的分區(qū)(partitions),它是Aerospike數(shù)據(jù)存
儲(chǔ)的最小單位
如上桦沉,一個(gè)4個(gè)節(jié)點(diǎn)的集群每瞒,每個(gè)節(jié)點(diǎn)存儲(chǔ)1/4數(shù)據(jù)的主節(jié)點(diǎn),同時(shí)也存儲(chǔ)1/4數(shù)據(jù)的副本纯露。如果節(jié)點(diǎn)1不
可訪問剿骨,節(jié)點(diǎn)1的副本將被拷貝到其他節(jié)點(diǎn)上。
復(fù)制因子( replication factor)是一個(gè)配置參數(shù)埠褪,不能超過集群節(jié)點(diǎn)數(shù)浓利。副本越多可靠性越高。
作為必須經(jīng)過所有數(shù)據(jù)副本的寫請(qǐng)求也越高钞速。實(shí)踐中荞膘,大部分部署使用的數(shù)據(jù)因子為2(一份主數(shù)據(jù)和
一個(gè)副本)。 同步復(fù)制保證即時(shí)一致性玉工,沒有數(shù)據(jù)丟失。在提交數(shù)據(jù)并返回結(jié)果給客戶端之前淘菩,寫事務(wù)
被傳播到所有副本遵班。
主成功同時(shí)備成功后,客戶端認(rèn)為是成功
在集群重新配置期間潮改,當(dāng)Aerospike智能終端發(fā)送請(qǐng)求到那些短暫過時(shí)的錯(cuò)誤節(jié)點(diǎn)時(shí)狭郑,Aerospike智能集
群會(huì)透明的代理請(qǐng)求至正確的節(jié)點(diǎn)。
Aerospike集群配置和部署
有兩種方式可以搭建集群:Multicast組播方式(UDP)和Mesh網(wǎng)格方式(TCP)
Multicast組播方式(UDP)
heartbeat {
mode multicast
multicast-group 239.1.139.1
port 3000
address 192.168.127.131
interval 150
timeout 10
}
udp是不可靠協(xié)議汇在,所以有可能會(huì)造成節(jié)點(diǎn)脫落翰萨,而且網(wǎng)絡(luò)有可能不支持組播
Mesh網(wǎng)格方式(TCP)
heartbeat {
mode mesh
# add current node address here
address 192.168.127.131
port 3000
# add all cluster node address here
mesh-seed-address-port 192.168.127.131 3002
mesh-seed-address-port 192.168.127.128 3002
interval 150
timeout 10
}
集群部署
在192.168.127.128上安裝Aerospike后,修改配置文件/etc/aerospike/aerospike.conf
vim /etc/aerospike/aerospike.conf
service {
user root
group root
paxos-single-replica-limit 1 # Number of nodes where the replica count
is automatically reduced to 1.
pidfile /var/run/aerospike/asd.pid
proto-fd-max 15000
}
logging {
# Log file must be an absolute path.
file /var/log/aerospike/aerospike.log {
context any info
}
}
network {
service {
address any
port 3000
access-address 192.168.127.128 3002
}
heartbeat {
mode mesh
address 192.168.127.128
port 3002
#all cluster
mesh-seed-address-port 192.168.127.128 3002
mesh-seed-address-port 192.168.127.131 3002
# To use unicast-mesh heartbeats, remove the 3 lines above, and
see
# aerospike_mesh.conf for alternative.
interval 150
timeout 10
}
fabric {
address any
port 3001
}
info {
address any
port 3003
}
}
namespace test {
replication-factor 2
memory-size 256M
storage-engine memory
namespace bar {
replication-factor 2
memory-size 256M
storage-engine memory
}
在192.168.127.131上安裝Aerospike后糕殉,修改配置文件
public class GuavaDemo {
service {
user root
group root
paxos-single-replica-limit 1 # Number of nodes where the replica count
is automatically reduced to 1.
pidfile /var/run/aerospike/asd.pid
proto-fd-max 15000
}
}
logging {
# Log file must be an absolute path.
file /var/log/aerospike/aerospike.log {
context any info
}
}
network {
service {
address any
port 3000
access-address 192.168.127.131 3002
}
heartbeat {
mode mesh
address 192.168.127.131
port 3002
#all cluster
mesh-seed-address-port 192.168.127.131 3002
mesh-seed-address-port 192.168.127.128 3002
# To use unicast-mesh heartbeats, remove the 3 lines above, and
see
# aerospike_mesh.conf for alternative.
interval 150
timeout 10
}
fabric {
address any
port 3001
}
info {
address any
port 3003
}
}
namespace test {
replication-factor 2
memory-size 256M
storage-engine memory
}
namespace bar {
replication-factor 2
memory-size 256M
storage-engine memory
}
Aerospike集群的訪問
Host[] hosts = new Host[]{
new Host("192.168.127.128", 3000),
new Host("192.168.127.131", 3000)
};
ClientPolicy policy = new ClientPolicy();
AerospikeClient client = new AerospikeClient(policy, hosts);
//寫策略
WritePolicy wp = new WritePolicy();
//超時(shí)時(shí)間
wp.setTimeout(500);
Key key1 = new Key("test", "SUser", "11");
Bin bin11 = new Bin("name", "zhangfei-c");
Bin bin12 = new Bin("age", 25);
Bin bin13 = new Bin("sex", "M-c");
client.put(wp, key1, bin11, bin12, bin13);
Key key2 = new Key("test", "SUser", "22");
Bin bin21 = new Bin("name", "zhaoyun-c");
Bin bin22 = new Bin("age", 24);
Bin bin23 = new Bin("sex", "M-c");
client.put(wp, key2, bin21, bin22, bin23);
Record r1 = client.get(wp, key1, "name", "age", "sex");
System.out.println(r1);