看看redis中那些好玩的module (sql on redis, bf/cf on redis)

  

  自從redis加入了module功能以後,redis的生態就頗有意思了,每一個領域的大佬都會以插件的形式給redis擴展一些新的功能,好比本篇說到的rediSQL,rebloom。git

 

一:rediSQL程序員

  1. 背景github

        redis雖然是牛逼,但仍是有不少人吐槽redis操做性太弱,好比你想要在redis上實現一個比較複雜的業務邏輯,可能對你來講是一個災難,有些同窗會說用redis的redis

存儲過程lua撒,可是lua不是每一個程序員都會的,更況且那些數據分析師,但要是問sql會不會,基本上合格的程序員和分析師在這個上面都是沒毛病的,真的要是讓sqlsql

落在redis上,那真是如虎添翼,可能最先讓sql落到redis上的,應該是spark sql 吧,讓redis做爲spark的rdd,但這裏說到的是另一個經過module實現的sql on redis。centos

 

  2. 下載app

     源代碼能夠到 github:https://github.com/RedBeardLab/rediSQL  ,下載地址是:https://github.com/RedBeardLab/rediSQL/releases    ui

直接下載這個編譯好的文件,拿來就用就行了。lua

 

3. 加載spa

    這個簡單,先把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 。

 

2. 下載

    github地址: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], &params); ^ /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.md rebloom.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,仍是蠻有意思的。

相關文章
相關標籤/搜索