自從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/releases
直接下載這個編譯好的檔案,拿來就用就好了。
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 。
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], ¶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.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,還是蠻有意思的。