redis高级篇 springboot+redis+bloomfilter实现过滤案例

这篇具有很好参考价值的文章主要介绍了redis高级篇 springboot+redis+bloomfilter实现过滤案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 bloomfilter的作用

1.1 作用

Bloomfilter:默认是有0组成bit数组和hash函数构成的数据结构,用来判断在海量数据中是否存在某个元素。

应用案例:解决缓存穿透。Bloomfilter放在redis前面,如果查询bf中没有则直接返回,如果存在则查询redis,如果redis不存在,则查询mysql数据库。bf拦截一些不必要的请求。

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

1.2 案例

1.2.1 流程逻辑

1.构建过程

1)预加载符合条件的记录;2)计算每条记录的hash值;3)计算hash值对应bitmap数组的位置;4)修改值为1;

2.查询过程

1)计算元素的hash位置;2)计算hash值对应二进制数组的位置;3)找到数组中对应位置的值,0代表不存在;1代表存在。

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

1.2.2 setbit的构建过程

1.@postConstruct初始化白名单数据

2.计算元素的hash值

3.通过上一步的hash值算出对应的二进制数组的坑位,将对应坑位的值修改为数字;1表示存在。

1.2.3 查询是否存在

1.计算元素的hash值;2通过上一步的hash值计算出对应的二进制数组对应的坑位,返回对应坑位的值,0表示无;1表示存在。

二 工程搭建

2.1 工程结构

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

2.2 不使用bloomfilter过滤器的情况 

2.2.1 新增初始化数据

1.controller

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

2.service

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

 2.2.2 查询数据

1.controller

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

 2.service

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

 2.2.3 初始化数据库

1.数据库配置

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

2.数据库脚本

CREATE TABLE `t_customer` (
  `id` bigint(11) NOT NULL,
  `cname` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  `sex` varchar(255) DEFAULT NULL,
  `birth` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 2.2.4 启动服务测试

1.页面访问新增数据

http://localhost:8083/customer/add

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

2.访问查询接口

访问存在的数据id=1

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

访问不存在的数据id=3

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

 控制台显示信息:

2023-07-31 18:44:11.850  INFO 4172 --- [nio-8083-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
刚开始redis不存在。。。。。。

 3.查看数据库接口

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

4.查看redis

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

 2.3 使用bloomfilter过滤器的情况 

2.3.1 逻辑架构

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

2.3.2 初始化白名单数据

这里将customer:12作为key,存储到redis数据库中。

@Component
@Slf4j
public class BloomFilterInit
{
    @Resource
    private RedisTemplate redisTemplate;

    @PostConstruct //初始化白名单数据
    public void initWhiteListData(){
        //1.白名单客户加载到布隆过滤器中
        String key="customer:12";
        //2.计算hashvalues,由于存储计算出来可能存在负数,我们取绝对值
        int hashValue=Math.abs(key.hashCode());
        //3.通过hashvalue和2的32次方后取余,获得对应的下标坑位
        long index=(long)(hashValue%Math.pow(2,32));
        log.info("key"+"对应的index:"+index);
        //4.设置redis里面的bitmap对应的白名单 whitelistcustomer的坑位,将改值设置为1;
        redisTemplate.opsForValue().setBit("whiteListCustomer",index,true);
    }
}

截图

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

 2.3.3 使用bloomfilter过滤判断

 public Customer findDataByBloomFilter(Integer id){
        //1.封装key
        String key=CACHA_KEY_CUSTOMER+id;
        //2.布隆过滤器check,无是绝对无,有是可能有
        //===============================================
        if(!checkUtils.checkWithBloomFilter("whiteListCustomer",key))
        {
            log.info("白名单无此顾客,不可以访问: "+key);
            return null;
        }
       //3.查询redis
        Customer customer=(Customer) redisTemplate.opsForValue().get(key);
        if(customer==null){
            System.out.println("redis不存在。。。。。。");
            //4.redis为空,查询mysql
            customer=customerDao.selectByPrimaryKey(id);
            if(customer!=null){
                System.out.println("redis不存在,查询mysql存在");
                //5.mysql中数据存在, 把mysq查询出来的数据回写redis,保持一致性
                redisTemplate.opsForValue().set(key,customer);
                System.out.println("redis不存在,查询mysql存在,回写redis最新数据....");
            }
        }
        return customer;

    }

checkutil工具类:

package com.ljf.redis.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @auther zzyy
 * @create 2022-12-27 14:56
 */
@Component
@Slf4j
public class CheckUtils
{
    @Resource
    private RedisTemplate redisTemplate;

    public boolean checkWithBloomFilter(String checkItem,String key)
    {
        int hashValue = Math.abs(key.hashCode());
        long index = (long)(hashValue % Math.pow(2,32));
        boolean existOK = redisTemplate.opsForValue().getBit(checkItem,index);
        log.info("--->key:"+key+" 对应坑位下标index: "+index+" 是否存在:"+existOK);

        return existOK;
    }
}

2.截图

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

  2.3.4 判断测试

1.访问customer:1 但是初始白名单放入的是customer:12; 不存在则一定过滤掉。

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

控制台:

2023-07-31 18:47:43.243  INFO 4172 --- [io-8083-exec-10] com.ljf.redis.util.CheckUtils            : --->key:customer:1 对应坑位下标index: 1581185131 是否存在:false
2023-07-31 18:47:43.243  INFO 4172 --- [io-8083-exec-10] c.l.r.service.impl.CustomerServiceImpl   : 白名单无此顾客,不可以访问: customer:1

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

2.修改初始化白名单,customer:12 改为customer:1

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

3.再次启动服务,再次访问

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存

4.控制台信息

 2023-07-31 19:10:08.794  INFO 19236 --- [nio-8083-exec-2] com.ljf.redis.util.CheckUtils            : --->key:customer:1 对应坑位下标index: 1581185131 是否存在:true

5.redis中查看

127.0.0.1:6379> get whiteListCustomer
@
127.0.0.1:6379> 

redis高级篇 springboot+redis+bloomfilter实现过滤案例,redis,redis,数据库,缓存文章来源地址https://www.toymoban.com/news/detail-607221.html

到了这里,关于redis高级篇 springboot+redis+bloomfilter实现过滤案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【案例实战】SpringBoot整合Redis的GEO实现查找附近门店功能

    像我们平常美团点外卖的时候,都会看到一个商家距离我们多少米。还有类似QQ附近的人,我们能看到附近的人距离我们有多少米。 那么这些业务是怎么做的呢?是如何实现 基于位置的附近服务 系统呢。 在去了解基于位置的附近服务之前,我们先来看一下什么是GIS技术。

    2024年02月10日
    浏览(29)
  • 【案例实战】SpringBoot整合Redis实现缓存分页数据查询

    正式观看本文之前,设想一个问题,高并发情况下,首页列表数据怎么做? 类似淘宝首页,这些商品是从数据库中查出来的吗?答案肯定不是,在高并发的情况下,数据库是扛不住的,那么我们要怎么去扛住C端大并发量呢,这块我们可以借助Redis,我们知道Redis是一个基于内

    2024年02月09日
    浏览(43)
  • redis中使用bloomfilter判断元素是否存在

    由一个初始值为0的bit数组组成,和多个hash函数构成,用来判断集合中是否存在某个元素。 一个很长的二进制数组(00000000)+一系列随机hash算法映射函数。主要用于判断一个元素是否存在集合中。 本质:判断一个数据是否存在一个大的集合中。有,可能有,无则一定没有 一

    2024年02月15日
    浏览(37)
  • redis中使用bloomfilter的白名单功能解决缓存穿透问题

    将需要的数据提前缓存到缓存redis中,可以在服务启动时候,或者在使用前一天完成数据的同步等操作。保证后续能够正常使用。 在redis中,查询redis缓存数据没有内容,接着查询mysql数据库,也没有需要的内容,做了两次无用的查询。进而造成mysql数据库的负担,造成一系列

    2024年02月16日
    浏览(36)
  • Springboot 在 redis 中使用 Guava 布隆过滤器机制

    在 pom.xml 文件中,引入Spring Boot和Redis相关依赖 创建一个布隆过滤器配置类 BloomFilterConfig : 创建一个BloomFilterController。使用布隆过滤器判断数据是否存在,从而避免缓存穿透: 向里面添加元素  获取元素

    2024年02月12日
    浏览(28)
  • 全网唯一解决Mysql数据库宕机生产事故的通用方法高级DBA真实案例解答

    国内90%的生产数据库用的最多的就是MySql数据库。企业软件生产环境通常情况下,都有一主一从,或者一主多从的HA高可用架构。结合作者本人实际经验结合一个实际的生产数据库宕机的例子,来讲解应该用怎么样的思路去解决问题。在生产事故过程中,有那些注意的关键点

    2024年02月05日
    浏览(47)
  • SpringBoot集成Lettuce连接Redis方法和案例

    说明: SpringBoot从2.0起默认使用lettuce客户端进行连接。 此次使用的版本:springboot:2.6.6,lettuce:6.1.8。 Springboot+Lettuce 单连方式 连接Redis单机/主备/Proxy集群示例。 1、在application.properties配置文件中加上redis相关配置。  2、Redis配置类RedisConfiguration。 3、Redis操作类RedisUtil。 4、

    2024年02月08日
    浏览(25)
  • 高级数据结构与算法 | 布谷鸟过滤器(Cuckoo Filter):原理、实现、LSM Tree 优化

    如果对布隆过滤器不太了解,可以看看往期博客:海量数据处理(一) :位图与布隆过滤器的概念以及实现 布隆过滤器 局限 对于需要处理海量数据的时候,如果我们需要快速判断一条记录是否,通常会使用过滤器来进行验证,而其中最常见的就是布隆过滤器(Bloom Filter)—

    2024年02月19日
    浏览(38)
  • springboot+redis+mysql+quartz-通过Java操作redis的KEYS*命令获取缓存数据定时更新数据库

    代码讲解: 3-点赞功能-定时持久化到数据库(pipeline+lua)-完善过程2_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1w14y1o7BV 本文章代码: blogLike_schedule/like03 · xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like03 数据

    2024年02月15日
    浏览(40)
  • python+redis实现布隆过滤器(含redis5.0版本以上和5.0以下版本的两份代码)

    布隆过滤器是一种空间效率极高的概率数据结构,用于测试一个元素是否是集合的成员。如果布隆过滤器返回 False ,则元素绝对不在集合中。如果返回 True ,则元素可能在集合中,但也可能是一个误报。布隆过滤器利用了多个不同的哈希函数对元素进行哈希,并将结果的位置

    2024年02月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包