高并发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