aerospike工具集——aql

aql工具提供了一个类似于sql的命令行接口,用于数据库,UDF和索引管理。aerospike不支持sql查询或管理语言,只是提供一个类似于sql的接口。

aql的使用方法
aql OPTIONS
可以通过aql --help来查看帮助文档,aql --help之后可以看到如下选项:
-h <host>服务器ip,默认为:127.0.0.1
-p <port>端口号。默认为:3000
-c <command>执行指定的命令
-f <filepath>执行的命令在指定的文件中
-v 启用详细输出
-e打开命令的反馈模式
-T <milliseconds>设置命令执行超时时间,单位为ms,默认为1000
-o (json | table)设置输出模型,默认为table
-u <path> 设置 UDF用户管理模块。
-s <path> 设置 系统UDF管理模块
--help帮助

aql使用基于SQL命令语言的语法,对于习惯了关系型数据库的人来说是一个不错的工具。

数据管理
查找所有的namespace


得到所有的set


得到所有的bin



索引管理
创建一个索引
CREATE INDEX <index> ON <ns>[.<set>] (<bin>) <type>
<index>索引名称,在一个命名空间上索引名称必须唯一;
<ns>命名空间;
<set>设置是可选的,如果没有设置,则索引的记录不属于一个set;
<bin>根据bin建立索引
<type>索引存储的类型,必须是: NUMERIC  or  STRING


显示ns下的所有的索引信息


删除一个索引



索引状态同步
sync_state
Value Description
synced 次级索引和主索引保持一致
need_sync 次级索引和主索引保存不一致,需要同步
如果 sync_state= need_sync and state=RW,则需要进行同步处理
修复索引的方法如下:aql不能提供索引修复的功能,需要用asinfo来处理
[root@mobiead-06 server]#  asinfo -v "sindex-repair:ns=test;indexname=numindex;set=testset;"

索引状态
Value Description
WO 次级索引只写模式, 一般情况下只能进行更新次级索引,但不能进行查询
RW 次级索引读写模式. 这种模式下可以进行查询


查询和扫描管理
启用查询跟踪


关闭查询跟踪


正在运行的查询

查询运行的命令列表: Managing Queries

正在运行的扫描

结束正在运行的任务
KILL_QUERY <id>
KILL_SCAN <id>


查询记录
SELECT * FROM <ns>[.<set>]
select * from test.myset

SELECT <bin>[, <bin>[, ...]] FROM <ns>[.<set>]
select name, age from test.myset

SELECT <bin>[, <bin>[, ...]] FROM <ns>[.<set>] WHERE [<predicate>]
<predicate>只能用在加索引的bin上
<bin> BETWEEN <lower> AND <upper>
<bin> = <value>


aql> CREATE INDEX user_age_idx ON test.myset (age) STRING


当age为数字型时:
aql> CREATE INDEX user_age_idx ON test.myset (age) NUMERIC 





聚合查询或扫描结果
touch profile_aggregator.lua
vim profile_aggregator.lua 
添加如下内容:(得到最年长的女性)
functionavg_age(stream)localfunctionfemale(rec)return rec.gender == "F"endlocalfunctionname_age(rec)return map{ name=rec.name, age=rec.age }
  endlocalfunctioneldest(p1, p2)if p1.age > p2.age thenreturn p1
    elsereturn p2
    endendreturn stream : filter(female) : map(name_age) : reduce(eldest)
end

ascli udf-put profile_aggregator.lua 

AGGREGATE <module>.<function>([<arg>[,...]]) ON <ns>[.<set>] WHERE <predicate>
aql> AGGREGATE profile_aggregator.avg_age() ON users.profiles WHERE age BETWEEN 20 and 29
+--------------------------------------+
+ avg_age                        |
+--------------------------------------+
+ { "name": "Annie Black", "age": 28 } |
+--------------------------------------+

PS:需要关注一下lua这门小脚本语言,将来可以依靠它在aerospike上进行一些统计,当然用户数据的统计如何进行也要进行详细而有远虑的设计。


记录操作
插入一条记录


INSERTINTO <ns>[.<set>] (PK, <bins>) VALUES (<key>, <values>)

得到一条记录

DELETEFROM <ns>[.<set>] WHERE PK=<key>



设置
所有set的值和属性只能保持在当前的session里面
aql> get <setting>
aql> get output
OUTPUT = TABLE
aql> set <setting> <value>
aql> set output json
可用的设置:

VIEW

输出模型.

VIEW ( TABLE | JSON )

例如

aql> set output table

VERBOSE

启用详细输出

VERBOSE ( TRUE | FALSE )

ECHO

Echo commands.

ECHO ( TRUE | FALSE )

TIMEOUT

查询过期时间,单位是毫秒

TIMEOUT <milliseconds>

RECORD_TTL

以秒为单位的时间,随后创建或更新记录服务器将会在设置的这个时间内有效。

RECORD_TTL <seconds>

LUA_USERPATH

用户管理的lua文件的路径
LUA_USERPATH <path>

LUA_SYSPATH

Aerospike管理的lua文件路径

LUA_SYSPATH <path>



统计
系统统计
aql> stat system
+---------------------------------+--------------------+
| name                            | value              |
+---------------------------------+--------------------+
| "cluster_size"                  | 1                  |
| "cluster_key"                   | "AA47E9295DD25BC2" |
| "cluster_integrity"             | "true"             |
| "objects"                       | 12                 |
...
179 rows in set (0.000 secs)

二级索引统计信息
aql> stat index test numindex
+--------------------------+-------+
| name                     | value |
+--------------------------+-------+
| "keys"                   | 6     |
| "objects"                | 11    |
| "data_memory_used"       | 1320  |
| "load_pct"               | 100   |
| "loadtime"               | 6     |
| "stat_write_reqs"        | 11    |
| "stat_write_success"     | 11    |
| "stat_write_errs"        | 0     |
| "stat_delete_reqs"       | 0     |
| "stat_delete_success"    | 0     |
| "stat_delete_errs"       | 0     |
| "stat_defrag_recs"       | 0     |
| "stat_defrag_time"       | 0     |
| "n_query"                | 6     |
| "avg_selectivity"        | 2     |
| "avg_record_size"        | 42    |
| "n_aggregation"          | 5     |
| "agg_avg_selectivity"    | 2     |
| "agg_avg_record_size"    | 8     |
| "n_lookups"              | 1     |
| "lookup_avg_selectivity" | 6     |
| "lookup_avg_record_size" | 106   |
+--------------------------+-------+
22 rows in set (0.000 secs)

查询统计
aql> stat query
+--------------------------+-------+
| name                     | value |
+--------------------------+-------+
| "n_query_reqs"           | 6     |
| "n_query_success"        | 6     |
| "n_query_abort"          | 0     |
| "n_query_fail"           | 0     |
| "avg_selectivity"        | 2     |
| "queue_full"             | 0     |
| "n_aggregations"         | 5     |
| "n_agg_success"          | 5     |
| "n_agg_abort"            | 0     |
| "avg_agg_selectivity"    | 2     |
| "n_lookups"              | 1     |
| "n_lookup_success"       | 1     |
| "n_lookup_abort"         | 0     |
| "avg_lookup_selectivity" | 6     |
+--------------------------+-------+
14 rows in set (0.000 secs)


UDF管理
注册一个模块
REGISTER MODULE '<filepath>'
aql> register module '~/tmp/my_udf.lua'

aql> show modules
+---------------------------+-------+------------------------+
| module                    | type  | hash                   |
+---------------------------+-------+------------------------+
| "example1.lua"            | "lua" | "033671e05067888fce09" |
| "example2.lua"            | "lua" | "07b42082cca8e73a96b2" |
+---------------------------+-------+------------------------+
2 rows in set (0.000 secs)

查看模块信息
DESC MODULE <module>
aql> desc module example2.lua
+----------------------+-------+-------------------------+
| gen                  | type  | content                 |
+----------------------+-------+-------------------------+
| "1t0IoVM2B/zwAb3QMa" | "LUA" | "CmxvY2FsIGZ1bmN0aW9uIG |
+----------------------+-------+-------------------------+
1 row in set (0.000 secs)

删除一个模块
REMOVE MODULE <module>
aql> remove module example2.lua

















  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Aerospike和ClickHouse都是键值对内存数据库,但是它们的使用场景和特点有所不同。 Aerospike是一种高性能、可扩展的键值对内存数据库,适用于需要快速读写大量数据的场景,例如广告技术、实时分析和个性化推荐等。Aerospike支持多种数据类型,包括字符串、整数、浮点数、列表、映射和二进制数据等。Aerospike还支持多种读写操作,例如单个键值对读写、批量读写、范围查询和二次索引查询等。Aerospike的优点是高性能、可扩展、易于使用和部署,缺点是不支持复杂查询和事务。 ClickHouse是一种高性能、可扩展的列式存储数据库,适用于需要快速查询大量数据的场景,例如日志分析、数据仓库和实时报表等。ClickHouse的特点是支持高并发、高吞吐量的查询,支持复杂的SQL查询和聚合操作,支持多种数据格式和压缩算法,支持分布式部署和数据复制。ClickHouse的优点是高性能、可扩展、支持复杂查询和事务,缺点是不支持实时更新和删除操作。 以下是两个例子: 1.使用Aerospike存储和读取数据 ```python import aerospike # 连接Aerospike数据库 config = { 'hosts': [ ('127.0.0.1', 3000) ] } client = aerospike.client(config).connect() # 写入数据 key = ('test', 'demo', 'key1') bins = { 'name': 'Alice', 'age': 25, 'gender': 'female' } client.put(key, bins) # 读取数据 (key, metadata, record) = client.get(key) print(record) # 关闭连接 client.close() ``` 2.使用ClickHouse查询数据 ```sql -- 创建表 CREATE TABLE test ( id UInt32, name String, age UInt8, gender String ) ENGINE = MergeTree() ORDER BY id; -- 插入数据 INSERT INTO test VALUES (1, 'Alice', 25, 'female'), (2, 'Bob', 30, 'male'); -- 查询数据 SELECT * FROM test WHERE age > 25; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值