高並發12-Redis布隆過濾器安裝+與springboot的整合


- 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);
    }

}

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM