SpringBoot(18)---通过Lua脚本批量插入数据到Redis布隆过滤器

本文介绍了SpringBoot项目中使用Redis布隆过滤器进行数据存在的判断,对比了List、Map和Google布隆过滤器的性能,探讨了不同数据量场景下的适用方案。通过Lua脚本实现批量插入,分析了Redis服务器搭建和脚本执行过程,并提供了测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际开发过程中经常会做的一步操作,就是判断当前的key是否存在。

那这篇博客主要分为三部分:

1、几种方式判断当前key是否存在的性能进行比较。
2、Redis实现布隆过滤器并批量插入数据,并判断当前key值是否存在。
3、针对以上做一个总结。

一、性能对比

主要对以下方法进行性能测试比较:

1、List的 contains 方法

2、Map的 containsKey 方法

3、Google布隆过滤器 mightContain 方法

前提准备

在SpringBoot项目启动的时候,向 List集合Map集合Google布隆过滤器 分布存储500万条,长度为32位的String字符串。

1、演示代码

@Slf4j
@RestController
public class PerformanceController {

    /**
     * 存储500万条数据
     */
    public static final int SIZE = 5000000;
    /**
     * list集合存储数据
     */
    public static List<String> list = Lists.newArrayListWithCapacity(SIZE);
    /**
     * map集合存储数据
     */
    public static Map<String, Integer> map = Maps.newHashMapWithExpectedSize(SIZE);
    /**
     * guava 布隆过滤器
     */
    BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.unencodedCharsFunnel(), SIZE);
    /**
     * 用来校验的集合
     */
    public static List<String> exist = Lists.newArrayList();
    /**
     * 计时工具类
     */
    public static Stopwatch stopwatch = Stopwatch.createUnstarted();

    /**
     * 初始化数据
     */
    @PostConstruct
    public void insertData() {
        for (int i = 0; i < SIZE; i++) {
            String data = UUID.randomUUID().toString();
            data = data.replace("-", "");
            //1、存入list
            list.add(data);
            //2、存入map
           map.put(data, 0);
            //3、存入本地布隆过滤器
            bloomFilter.put(data);
            //校验数据 相当于从这500万条数据,存储5条到这个集合中
        
### 如何正确渲染 `uni-data-select` 组件 对于 `uni-data-select` 组件无法正常显示文字的问题,通常是因为数据源配置不正确或是组件属性设置不当。以下是几种常见原因及其解决方案: #### 数据源格式错误 确保传递给 `localdata` 属性的数据是一个对象数组,其中每个对象都应包含 `value` 和 `text` 键[^1]。 ```javascript // 正确的数据结构示例 let selectlist = [ { value: '0', text: '选项一' }, { value: '1', text: '选项二' } ]; ``` 如果从服务器获取到的是键值对形式的数据,则需转换成上述格式后再赋值给 `localdata`[^2]。 #### 缺少必要的绑定或事件处理函数 确认已经绑定了 `v-model` 并定义了相应的变更回调方法来响应用户的交互操作。 ```html <template> <view> <!-- 使用 v-bind 动态绑定 localdata --> <uni-data-select v-model="selectedValue" :localdata="selectOptions" @change="handleChange"> </uni-data-select> </view> </template> <script> export default { data() { return { selectedValue: '', selectOptions: [] // 初始化为空数组,在 mounted 生命周期内填充实际数据 }; }, methods: { handleChange(e){ console.log('Selected:', e.detail.value); } }, async mounted(){ try{ const response = await fetch('/api/getSelectData'); let rawData = await response.json(); this.selectOptions = rawData.map(item => ({ value: String(item.id), // 确保 id 转换成字符串类型 text: item.name || '' })); }catch(error){ console.error('Failed to load options.', error); } } } </script> ``` 通过以上调整可以有效解决大部分关于 `uni-data-select` 渲染失败的情况。需要注意的是,当涉及到异步加载远程数据时,应当考虑网络延迟等因素的影响,并适当增加 loading 提示等功能提升用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值