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


      

      自从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], &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,还是蛮有意思的。

  • 相关阅读:
    sql 大数据量 的分表操作
    NHibernate 2.0 配置
    NHibernate 之调用存储过程
    k-v-o 扫盲
    320学习笔记 2
    GCD之dispatch queue
    使用KVO体会
    timer,runloop,thread,task小总结
    Run Loop
    iPh oto的删除动画
  • 原文地址:https://www.cnblogs.com/huangxincheng/p/10292303.html
Copyright © 2020-2023  润新知