自从redis加入了module功能之后,redis的生态就很有意思了,每个领域的大佬都会以插件的形式给redis扩展一些新的功能,比如本篇说到的rediSQL,rebloom。

 

一:rediSQL

  1. 背景

        redis虽然是牛逼,但还是有很多人吐槽redis操作性太弱
,比如你想要在redis上实现一个比较复杂的业务逻辑,可能对你来说是一个灾难,有些同学会说用redis的


存储过程lua撒,但是lua不是每个程序员都会的,更何况那些数据分析师,但要是问sql会不会,基本上合格的程序员和分析师在这个上面都是没毛病的,真的要是让sql

落在redis上,那真是如虎添翼,可能最早让sql落到redis上的,应该是spark sql
吧,让redis作为spark的rdd,但这里说到的是另外一个通过module实现的sql on redis。

 

  2. 下载

     源代码可以到 github:https://github.com/RedBeardLab/rediSQL
<https://github.com/RedBeardLab/rediSQL>  ,下载地址是:
https://github.com/RedBeardLab/rediSQL/releases 
<https://github.com/RedBeardLab/rediSQL/releases%20>   



直接下载这个编译好的文件,拿来就用就好了。

 

3. 加载

    这个简单,先把rediSQL_0.7.1.so 导入到centos中,然后只需使用module load  rediSQL_0.7.1.so
返回ok即可。
1 [root@localhost redis]# ls 2 00-RELEASENOTES COPYING Makefile README.md
redis.conf runtest src 3 appendonly.aof deps MANIFESTO redis-check-aof
rediSQL_0.7.1.so runtest-cluster tests 4 BUGS dump.rdb module redis-check-rdb
redis-server runtest-sentinel utils 5 CONTRIBUTING INSTALL mydata redis-cli
redis-trib.rb sentinel.conf
 
[root@localhost redis]# ./redis-cli 127.0.0.1:6379> module load
/data/redis/rediSQL_0.7.1.so OK
 

4. 简单使用

    既然要让sql落到redis中,那就先得建库建表啦,这里database:Datamip,
table:customer,然后做了一个简单的查询,如下:
127.0.0.1:6379> REDISQL.CREATE_DB Datamip OK 127.0.0.1:6379> REDISQL.EXEC
Datamip "CREATE TABLE customer(id int, username varchar(10));" 1) DONE 2)
(integer) 0 127.0.0.1:6379> REDISQL.EXEC Datamip "INSERT INTO customer
VALUES(1, 'jack');" 1) DONE 2) (integer) 1 127.0.0.1:6379> REDISQL.EXEC Datamip
"INSERT INTO customer VALUES(2, 'mary');" 1) DONE 2) (integer) 1
127.0.0.1:6379> REDISQL.EXEC Datamip "SELECT * FROM customer WHERE id=2" 1) 1)
(integer) 2 2) "mary" 127.0.0.1:6379>
 

   是不是很爽的感觉,不过作者也是要吃饭的,所以企业版还是要收点压箱底的钱。

 

二: rebloom

1. 背景

  这个module也很有意思,它给redis新增了两种过滤器,一个叫做bloom filter,一个叫做 cuckoo filter,
bloomfilter 估计大家都知道,用极小的错误率换取

原有的HashSet的1/8 -1/4的空间利用率,具体场景大家看着用吧,cuckoofilter
翻译过来就是布谷鸟过滤性,可能作者家就是养鸟的,不然怎么那么多鸟呢,

大家只要理解cuckoofilter比bloomfilter更省空间,更低的错误率,而且还是支持删除。

具体的大家可以看论文:http://www.cs.cmu.edu/~binfan/papers/conext14_cuckoofilter.pdf
<http://www.cs.cmu.edu/~binfan/papers/conext14_cuckoofilter.pdf> 。

 

2. 下载

    github地址:https://github.com/RedisLabsModules/rebloom
<https://github.com/RedisLabsModules/rebloom>   然后找到release模式,下载完之后需要自己make一下。


[root@localhost module]# ls v1.1.0.tar.gz [root@localhost module]# tar -xzvf
v1.1.0.tar.gz rebloom-1.1.0/ rebloom-1.1.0/.circleci/ rebloom-1.1.0/.circleci/
config.yml rebloom-1.1.0/.clang-format rebloom-1.1.0/.gitignore rebloom-1.1.0/
Dockerfile rebloom-1.1.0/LICENSE rebloom-1.1.0/Makefile rebloom-1.1.0/README.md
rebloom-1.1.0/contrib/ rebloom-1.1.0/contrib/MurmurHash2.c
rebloom-1.1.0/contrib/bloom.c rebloom-1.1.0/contrib/bloom.h
rebloom-1.1.0/contrib/murmurhash2.h rebloom-1.1.0/docs/ rebloom-1.1.0/docs/
Bloom_Commands.md rebloom-1.1.0/docs/CNAME rebloom-1.1.0/docs/
Cuckoo_Commands.md rebloom-1.1.0/docs/Java_Client.md rebloom-1.1.0/docs/
Quick_Start.md rebloom-1.1.0/docs/_config.yml rebloom-1.1.0/docs/index.md
rebloom-1.1.0/mkdocs.yml rebloom-1.1.0/ramp.yml rebloom-1.1.0/src/
rebloom-1.1.0/src/cf.c rebloom-1.1.0/src/cf.h rebloom-1.1.0/src/cuckoo.c
rebloom-1.1.0/src/cuckoo.h rebloom-1.1.0/src/print_version.c rebloom-1.1.0/src/
rebloom.c rebloom-1.1.0/src/redismodule.h rebloom-1.1.0/src/sb.c
rebloom-1.1.0/src/sb.h rebloom-1.1.0/src/version.h rebloom-1.1.0/tests/
rebloom-1.1.0/tests/Makefile rebloom-1.1.0/tests/cuckoo.py rebloom-1.1.0/tests/
pytests.py rebloom-1.1.0/tests/test-basic.c rebloom-1.1.0/tests/test-cuckoo.c
rebloom-1.1.0/tests/test-perf.c rebloom-1.1.0/tests/test.h [root@localhost
module]# ls rebloom-1.1.0 v1.1.0.tar.gz [root@localhost module]# cd
rebloom-1.1.0 [root@localhost rebloom-1.1.0]# ls contrib Dockerfile docs
LICENSE Makefile mkdocs.yml ramp.yml README.md src tests [root@localhost
rebloom-1.1.0]# make cc -Wall -Wno-unused-function -g -ggdb -O2 -fPIC
-std=gnu99 -D_GNU_SOURCE -I/data/redis/module/rebloom-1.1.0
-I/data/redis/module/rebloom-1.1.0/contrib -c -o
/data/redis/module/rebloom-1.1.0/src/rebloom.o
/data/redis/module/rebloom-1.1.0/src/rebloom.c cc -Wall -Wno-unused-function -g
-ggdb -O2 -fPIC -std=gnu99 -D_GNU_SOURCE -I/data/redis/module/rebloom-1.1.0
-I/data/redis/module/rebloom-1.1.0/contrib -c -o
/data/redis/module/rebloom-1.1.0/contrib/MurmurHash2.o
/data/redis/module/rebloom-1.1.0/contrib/MurmurHash2.c cc -Wall
-Wno-unused-function -g -ggdb -O2 -fPIC -std=gnu99 -D_GNU_SOURCE
-I/data/redis/module/rebloom-1.1.0 -I/data/redis/module/rebloom-1.1.0/contrib
-c -o /data/redis/module/rebloom-1.1.0/src/sb.o
/data/redis/module/rebloom-1.1.0/src/sb.c cc -Wall -Wno-unused-function -g
-ggdb -O2 -fPIC -std=gnu99 -D_GNU_SOURCE -I/data/redis/module/rebloom-1.1.0
-I/data/redis/module/rebloom-1.1.0/contrib -c -o
/data/redis/module/rebloom-1.1.0/src/cf.o /data/redis/module/rebloom-1.1.0/src/
cf.c In file included from /data/redis/module/rebloom-1.1.0/src/cf.c:6:0:
/data/redis/module/rebloom-1.1.0/src/cuckoo.c: In function
‘CuckooFilter_Count’: /data/redis/module/rebloom-1.1.0/src/cuckoo.c:157:9:
warning: passing argument 1 of ‘filterCount’ from incompatible pointer type
[enabled by default] ret += filterCount(filter->filters[ii], ¶ms); ^
/data/redis/module/rebloom-1.1.0/src/cuckoo.c:139:15: note: expected ‘const
uint8_t (*)[2]’ but argument is of type ‘uint8_t (*)[2]’ static size_t
filterCount(const CuckooBucket *filter, const LookupParams *params) { ^ ld
/data/redis/module/rebloom-1.1.0/src/rebloom.o
/data/redis/module/rebloom-1.1.0/contrib/MurmurHash2.o
/data/redis/module/rebloom-1.1.0/src/sb.o
/data/redis/module/rebloom-1.1.0/src/cf.o -o
/data/redis/module/rebloom-1.1.0/rebloom.so -shared -Bsymbolic
-Bsymbolic-functions -lm -lc [root@localhost rebloom-1.1.0]# ls contrib
Dockerfile docs LICENSE Makefile mkdocs.yml ramp.yml README.mdrebloom.so src
tests
 

最后标红的 rebloom.so 就是你最终要找的加载文件。
[root@localhost redis]# ./redis-cli 127.0.0.1:6379> module load
/data/redis/module/rebloom-1.1.0/rebloom.so OK
 

3.  简单使用

 

《1》 bloomfilter 的简单使用,比如塞入1,2,3,4 。 判断3,5是否在其中,如下:
127.0.0.1:6379> bf.add myfilter 1 (integer) 1 127.0.0.1:6379> bf.add myfilter 2
(integer) 1 127.0.0.1:6379> bf.add myfilter 3 (integer) 1 127.0.0.1:6379>
bf.add myfilter 4 (integer) 1 127.0.0.1:6379> bf.exists myfilter 3 (integer) 1
127.0.0.1:6379> bf.exists myfilter 5 (integer) 0 127.0.0.1:6379>
 

《2》 在github的quickstart中并没有找到cuckoofilter的使用方式,没关系撒,找找源文件就好啦。

   

比如下面的源码就是告诉你怎么去使用。



 

接下来就可以简单的add,delete,exists 啦。
127.0.0.1:6379> cf.add myfilter2 1 (integer) 1 127.0.0.1:6379> cf.add
myfilter2 2 (integer) 1 127.0.0.1:6379> cf.add myfilter2 3 (integer) 1
127.0.0.1:6379> cf.add myfilter2 4 (integer) 1 127.0.0.1:6379> cf.del myfilter 2
(error) Not found 127.0.0.1:6379> cf.del myfilter2 2 (integer) 1
127.0.0.1:6379> cf.exists myfilter2 1 (integer) 1
 

   好了,这就是本篇给大家介绍的module,还是蛮有意思的。