ES(Elastic Stack)和redis建立检索数据库

需求

  • 要建立一个千万级的数据库,来检索图片的特征并不断插入。(这段时间不断摸索踩了很多的坑,不过也算是最后终结了这个问题。简单记录下遇到的主要的问题)

方法

  • 首先是es建立了一个生命周期30天的数据库,把数据的一些信息和id写进去,心里的数据查看有没有相似特征。如果有,就把指纹定位对方的指纹,如果没有就是自己的。

    • 特征是hash值。hash值可以分桶,因为大部分都不一样,用汉明距离卡了一个阈值,比如5或者10等等。那再检索的时候可以用这个阈值降低数据访问量的。具体是桶号设计为hash值中1有效的数目,也可以反过来用0的数目,效果是一样的。检索的时候先用桶号过滤一遍,桶号±阈值。在桶号阈值内的,肯定是符合汉明阈值的;反过来却不一定。所以这个分桶是充分不必要条件,多少可以减少一部分检索量。
    • es的时间差问题:es从插入到可被检索到,是有一个时间差的。在这段时间数据对检索来说就是不可见的。并发调用的情况下,这个时间差的峰值应该可以超过了10-20ms。
  • 如何避免不可见问题。

    • 使用redis的高速反应来处理这个问题。
    • reids的不可见时间差要短的多,甚至redis锁是比python的锁靠谱不知道多少倍的。在分布式服务上更是少有的几个现成方案。
    • 可使用的方法有scan_iter(count=n),scan(count=n)以及hset,hgetall。总起来说就是以redis做cache,这个任务里我选用了当前和上一秒共两秒的缓冲区。具体的:
      • 1.0. 以自定义id为key,特征(hash值)为value插入redis里,然后去scan redis的数据库。对可看到的数据做个结构化——相同的去排序进入下一步,不相同的直接进入下一步,也就是es数据库访问。
      • 1.1. 这种存储方式会占用整个DB。我也尝试过以hash为key,以指纹为value的方式。但是这种就要看id是否matters,是否有影响,因为不能排除后面有相同特征的情况出现,实际上我这里结构化的时候需要排序,时间戳对排序很重要。
      • 1.2. 另外,如果并发的插入,这种方式redis也会有不可见的时间差:插入redis后,随机time.sleep(n),然后开始scan(count=n)。那如果有应该看到却看不到的情况,那通过调整n的值就可以发现这种情况下不可见的时间差峰值是多少。我测了一下,如果有300项并发进入,峰值有大概15ms的时间差。
      • 2.0 另外一种方式是hset和hgetall。这种情况是分桶,桶号是时间戳,key还是id,value是特征值和时间戳。这种情况基本上不会有看不见的情况,偶尔出现过一次,我把n延迟到了10ms,至今没再出现过,这儿没去深究,一位组里的redis大神说他从没见过这种情况。所以这儿的不可见是不是一定存在,我没有百分之百的把握。
      • 2.1. 另外一个小坑是id的问题,因为时间戳用来帮助结构化,我用了图片的url做md5做id,后来遇到了一个问题。后来的请求项有相同的url,直接写入了redis覆盖了前一个的时间戳。在这个空档,正好有一个相同特征的但是url却不一样的请求项,进行结构化,比较时间戳时引起了bug。所以接下来的md5,我都用的“文章url+图片url”的方式来做。
      • 3.0. 结构化,一直再提,具体是什么呢。总起来说就是相同的特征不要一下子都进去es去查询,redis对他们其他缓冲的效果。然后完整执行完es的再把结果广播给剩下排队的项。那些没有相同特征的,就正常进入es查询了。特征相同的时候,需要有个先来后到,不然就让一些请求项一直在等了,那这儿就有个时间戳的概念。
  • es是组里另外一个专业的大神写的,但是中间也犯了几个错误,发现这些小bug用了些精力。也简单记录一下。

    • 分桶过滤时的标准需要检查好,特征是1*64维的,他只查了一半。
    • es单个查询时间、插入时间最好确认下,这儿踩了两次坑,时间太长引起的系统性问题。
  • 目前基本上就这些问题了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: B树是一种用于索引的数据结构,它能够大幅度地提高数据库的读取速度。但是,B树并不是唯一的数据结构,也不是所有数据库使用B树来索引数据。 RedisESElasticsearch)是两种不同类型的数据库系统。Redis是一种高性能的内存数据库,它提供了丰富的数据结构和操作,可以用于实现缓存、消息队列、聊天机器人等应用。ES是一种基于Lucene的搜索引擎,提供了高效的全文搜索、分析和统计功能,常用于搜索引擎、日志分析、实时分析等应用。 因此,即使B树能够优化数据库的读取速度,RedisES也仍然有其独特的用途,并且仍然有必要存在。 ### 回答2: B树是一种多路搜索树,被广泛用于数据库索引结构中,通过优化数据的存储和访问方式,可以大大提高数据库的读取速度。然而,即使存在B树这种高效的数据结构,RedisElasticsearchES)仍然需要存在,原因如下: 首先,Redis是一个基于内存的数据存储系统,通过将数据存储在内存中,可以快速地进行数据读取和写入操作。虽然B树可以提高数据库的读取速度,但当需要频繁地进行数据的读写操作时,Redis的内存存储特性仍然具有很大的优势。此外,Redis还提供了丰富的数据结构和功能,如缓存、发布订阅、事务等,这些功能对于许多应用程序而言是非常重要的。 其次,ES是一种分布式搜索和分析引擎,它构建在Lucene之上,具有强大的全文搜索和复杂查询的能力。虽然B树可以优化数据库的读取速度,但ES在全文搜索和复杂查询方面仍然是非常强大和高效的。ES可以对文本、数值和地理位置等各种类型的数据进行高效的检索和分析,能够满足许多大规模数据处理和分析的需求。 综上所述,尽管B树可以优化数据库的读取速度,但RedisES仍然有它们存在的必要性。Redis的内存存储特性和丰富的功能使其成为高效的数据存储和缓存系统。而ES的全文搜索和复杂查询能力使其成为强大的搜索和分析引擎。因此,根据具体的应用场景和需求,选择合适的技术和工具可以进一步提高系统的性能和效率。 ### 回答3: B树是一种用于索引的数据结构,可以提高数据库的读取速度。它具有自平衡的特性,能够高效地支持范围查询和快速查找。由于这些优点,使用B树索引可以大大减少数据库的IO操作,从而提高读取数据的效率。 然而,尽管B树在读取方面表现出色,但它并不能完全取代RedisES等工具的存在。 首先,Redis是一种基于内存的高性能键值存储,对于大量的数据缓存和快速的数据读写操作非常高效。Redis具有性能高、功能丰富和支持多种数据结构的特点,适用于许多场景,如缓存、会话管理、消息队列等。因此,即使数据库的读取速度得到了优化,Redis仍有它特殊的应用场景存在。 其次,ESElasticsearch)是一种全文搜索引擎,具有实时分析和查询的能力。ES使用倒排索引来实现全文搜索,它能够快速地处理和搜索大量的文本数据。ES不仅支持分布式部署,还提供了丰富的聚合功能和地理位置搜索等高级特性。因此,对于需要进行全文搜索和复杂的数据分析的场景,ES仍然具有不可替代的作用。 综上所述,虽然B树优化了数据库的读取速度,但RedisES仍然有其自身的优势和应用场景。在实际应用中,根据具体的需求和场景,选用适当的工具和技术能够更好地满足业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值