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

看看redis中那些好玩的module (sql on redis, bf/cf on redis)的更多相关文章

  1. Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性

    Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...

  2. Redis 中的事务分析,Redis 中的事务可以满足ACID属性吗?

    Redis 中的事务 什么是事务 1.原子性(Atomicity) 2.一致性(Consistency) 3.隔离性(Isolation) 4.持久性(Durability) 分析下 Redis 中的 ...

  3. redis中的key设置过期时间

    EXPIRE key seconds 为给定  key  设置生存时间,当  key  过期时(生存时间为  0  ),它会被自动删除. 在 Redis 中,带有生存时间的  key  被称为『易失的 ...

  4. redis中使用java脚本实现分布式锁

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/115.html?1455860390 edis被大量用在分布式的环境中,自 ...

  5. Redis中的数据对象

    redis对象 redis中有五种常用对象 我们所说的对象的类型大多是值的类型,键的类型大多是字符串对象,值得类型大概有以下几种,但是无论哪种都是基于redisObject实现的 redisObjec ...

  6. Redis 中 redis.conf配置详细解析

    ########################################### 基本配置 ##################################### # 端口 port 666 ...

  7. 新姿势!Redis中调用Lua脚本以实现原子性操作

    背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...

  8. Java微信公众号开发----定时获取access_token并保存到redis中

    本人原本是想做微信公众号菜单的创建修改删除等操作的,但是发现需要access_token,通过阅读文档,发现文档要求有以下几点: 1.access_token 获取后有效期是2小时 2.access_ ...

  9. 如何使redis中存放的都是热点数据?

    当redis使用的内存超过设置的最大内存时,会触发redis的key淘汰机制,在redis3.0中的6中淘汰策略如下: (1)noeviction :不删除策略.当达到最大内存限制时,如果需要使用更多 ...

随机推荐

  1. webpack的css压缩不兼容IOS8问题探索

    webpack使用postcss的autoprefixer插件,并在压缩css时使用了cssnano,处理不当的情况下会导致压缩css后,部分兼容前缀(比如-webkit-)被删除的问题. postc ...

  2. leetCode刷题(找到两个数组拼接后的中间数)

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  3. 【方案】mvc 保证定时器回收限制

    在项目中我们或多或少的遇到一些需要定时触发或者计算的东西,这个时候我们就需要定时器来作为解决方案.非常好思路清晰,业务逻辑完好,定时器也开好了,当我们信心满满的挂到IIS服务器的时候,发现写的定时器在 ...

  4. tensorflow 1.8, ubuntu 16.04, cuda 9.0, nvidia-390,安装踩坑指南。

    被tensorflow 1.8, ubuntu 16.04, cuda 9.0, nvidia-390折磨了5天,终于上坑,留下指南,造福后人. 1.先把依赖搞清楚: tensorflow 1.8依赖 ...

  5. Unity3D学习(五):实现一个简单的视觉感知

    前言 在很多第一人称或者第三人称射击游戏的单人模式中,玩家的乐趣往往来源于和各式各样的AI敌人的战斗.而战斗的爆发很多时候是因为这些AI在"看见"玩家后就会立即做出反应,比如开火. ...

  6. PAT1002:A+B for Polynomials

    1002. A+B for Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue T ...

  7. Java开源生鲜电商平台-账单模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-账单模块的设计与架构(源码可下载) 补充说明:Java开源生鲜电商平台-账单模块的设计与架构,即用户的账单形成过程. 由于系统存在一个押账功能的需求,(何为押账,就是形成公司 ...

  8. 对混合数值,字符,null的字段进行排序

    今天有个需求是进行排序.  这一列值是字符串类型的, 但是里面有数值型 比如"1" 和null类型的.  实现效果是需要 数值型的先按照数值的方式先排,然后字符串按照字符传排,最后 ...

  9. Yii 1.1 请求报400错误

    Yii的action可以带参数,比如: class PostController extends CController { public function actionCreate($categor ...

  10. 聊聊 Spring Boot 2.x 那些事儿

    本文目录: 即将的 Spring 2.0 - Spring 2.0 是什么 - 开发环境和 IDE - 使用 Spring Initializr 快速入门 Starter 组件 - Web:REST ...