- Redis布隆過濾器安裝過程 自己構建一個bitMap
* git在centos7下面的安裝
1、安裝git,直接使用yum安裝即可:
yum -y install git
2、創建git用戶,git用戶可以正常通過ssh使用git,但無法登錄shell,因為我們為git用戶指定的git-shell每次一登錄就自動退出。
useradd -m -d /home/git -s /usr/bin/git-shell git
3、初始化git倉庫
mkdir -p /data/git
cd /data/git
git init --bare project1.git
chown git.git project1.git -R
4、創建免密鑰
cd /home/git
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
chown git.git .ssh -R
* 您應該首先下載並編譯模塊:
$ git clone git://github.com/RedisLabsModules/rebloom
$ cd rebloom
$ make
* 將Rebloom加載到Redis中,在redis.conf里面添加
loadmodule /path/to/rebloom.so(或者redisbloom.so)
注意:/path/to/代表的是so文件所在目錄
* 命令實戰
BF.ADD 布隆過濾器名字(集合名) key
BF.ADD bloom redis
BF.EXISTS bloom redis
BF.EXISTS bloom nonxist
Redis布隆過濾器與springboot的整合
**基於lua腳本實現springboot和布隆過濾器的整合**
- 通過普通命令無法實現springboot整合布隆過濾器
- 查找github開源框架的流程
- 分析開源框架的實現原理
- 通過lua腳本自己實現布隆過濾器
- 編寫兩個lua腳本
* 添加數據到指定名稱的布隆過濾器
* 從指定名稱的布隆過濾器獲取key是否存在的腳本
bloomFilterAdd.lua
local bloomName = KEYS[1] local value = KEYS[2] -- bloomFilter local result_1 = redis.call('BF.ADD', bloomName, value) return result_1
bloomFilterExist.lua
local bloomName = KEYS[1] local value = KEYS[2] -- bloomFilter local result_1 = redis.call('BF.EXISTS', bloomName, value) return result_1
redisService.java工具類
package com.concurrent.util; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.data.redis.core.*; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.scripting.support.ResourceScriptSource; import org.springframework.stereotype.Service; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; /** * Created by Administrator on 2018/10/6. */ @Service public class RedisService { @Autowired private RedisTemplate redisTemplate; private static double size = Math.pow(2, 32); private static final String bloomFilterName = "isVipBloom"; /** * 有序集合獲取排名 * * @param key */ public Set<ZSetOperations.TypedTuple<Object>> reverseZRankWithRank(String key, long start, long end) { ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); Set<ZSetOperations.TypedTuple<Object>> ret = zset.reverseRangeWithScores(key, start, end); return ret; } public Boolean bloomFilterAdd(int value){ DefaultRedisScript<Boolean> bloomAdd = new DefaultRedisScript<>(); bloomAdd.setScriptSource(new ResourceScriptSource(new ClassPathResource("bloomFilterAdd.lua"))); bloomAdd.setResultType(Boolean.class); List<Object> keyList= new ArrayList<>(); keyList.add(bloomFilterName); keyList.add(value+""); Boolean result = (Boolean) redisTemplate.execute(bloomAdd,keyList); return result; } public Boolean bloomFilterExists(int value) { DefaultRedisScript<Boolean> bloomExists = new DefaultRedisScript<>(); bloomExists.setScriptSource(new ResourceScriptSource(new ClassPathResource("bloomFilterExist.lua"))); bloomExists.setResultType(Boolean.class); List<Object> keyList = new ArrayList<>(); keyList.add(bloomFilterName); keyList.add(value + ""); Boolean result = (Boolean) redisTemplate.execute(bloomExists, keyList); return result; } }
controller:
package com.concurrent.controller; import com.concurrent.service.BloomFilterService; import com.concurrent.util.RedisService; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController public class RedisBloomFilterController { @Resource private BloomFilterService bloomFilterService; @Resource private RedisService redisService; @RequestMapping("/bloom/redisIdExists") public boolean redisidExists(int id){ return redisService.bloomFilterExists(id); } @RequestMapping("/bloom/redisIdAdd") public boolean redisidAdd(int id){ return redisService.bloomFilterAdd(id); } }