返回顶部
首页 > 资讯 > 精选 >怎么使用高斯Redis实现二级索引
  • 725
分享到

怎么使用高斯Redis实现二级索引

2023-07-02 15:07:58 725人浏览 独家记忆
摘要

这篇“怎么使用高斯Redis实现二级索引”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用高斯Redis实现二级索引”文

这篇“怎么使用高斯Redis实现二级索引”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用高斯Redis实现二级索引”文章吧。

一、背景

提起索引,第一印象就是数据库的名词,但是,高斯Redis也可以实现二级索引!!!高斯Redis中的二级索引一般利用zset来实现。高斯Redis相比开源Redis有着更高的稳定性、以及成本优势,使用高斯Redis zset实现业务二级索引,可以获得性能与成本的双赢。

索引的本质就是利用有序结构来加速查询,因而通过Zset结构高斯Redis可以轻松实现数值类型以及字符类型索引。

• 数值类型索引(zset按分数排序):

怎么使用高斯Redis实现二级索引

怎么使用高斯Redis实现二级索引

• 字符类型索引(分数相同时zset按字典序排序):

怎么使用高斯Redis实现二级索引

怎么使用高斯Redis实现二级索引

下面让我们切入两类经典业务场景,看看如何使用高斯Redis来构建稳定可靠的二级索引系统。

二、场景一:词典补全

当在浏览器中键入查询时,浏览器通常会按照可能性推荐相同前缀的搜索,这种场景可以用高斯Redis二级索引功能实现。

怎么使用高斯Redis实现二级索引

2.1 基本方案

最简单的方法是将用户的每个查询添加到索引中。当需要进行用户输入补全推荐时,使用ZRANGEBYLEX执行范围查询即可。如果不希望返回太多条目,高斯Redis还支持使用LIMIT选项来减少结果数量。

• 将用户搜索banana添加进索引:

ZADD myindex 0 banana:1

• 假设用户在搜索表单中输入“bit”,并且我们想提供可能以“bit”开头的搜索关键字。

ZRANGEBYLEX myindex "[bit" "[bit\xff"

即使用ZRANGEBYLEX进行范围查询,查询的区间为用户现在输入的字符串,以及相同的字符串加上一个尾随字节255(\xff)。通过这种方式,我们可以获得以用户键入字符串为前缀的所有字符串。

2.2 与频率相关的词典补全

实际应用中通常希望按照出现频率自动排序补全词条,同时可以清除不再流行的词条,并自动适应未来的输入。我们依然可以使用高斯Redis的ZSet结构实现这一目标,只是在索引结构中,不仅需要存储搜索词,还需要存储与之关联的频率。

• 将用户搜索banana添加进索引

• 判断banana是否存在

ZRANGEBYLEX myindex "[banana:" + LIMIT 0 1

• 假设banana不存在,添加banana:1,其中1是频率

ZADD myindex 0 banana:1

• 假设banana存在,需要递增频率

若ZRANGEBYLEX myindex "[banana:" + LIMIT 0 1 中返回的频率为1

1)删除旧条目:

ZREM myindex 0 banana:1

2)频率加一重新加入:

ZADD myindex 0 banana:2

请注意,由于可能存在并发更新,因此应通过lua脚本发送上述三个命令,用Lua script自动获得旧计数并增加分数后重新添加条目。

• 假设用户在搜索表单中输入“banana”,并且我们想提供相似的搜索关键字。通过ZRANGEBYLEX获得结果后按频率排序。

ZRANGEBYLEX myindex "[banana:" + LIMIT 0 101) "banana:123"2) "banaooo:1"3) "banned user:49"4) "banning:89"

• 使用流算法清除不常用输入。从返回的条目中随机选择一个条目,将其分数减1,然后将其与新分数重新添加。但是,如果新分数为0,我们需从列表中删除该条目。

• 若随机挑选的条目频率是1,如banaooo:1

ZREM myindex 0 banaooo:1

• 若随机挑选的条目频率大于1,如banana:123

ZREM myindex 0 banana:123ZADD myindex 0 banana:122

从长远来看,该索引会包含热门搜索,如果热门搜索随时间变化,它还会自动适应。

三、场景二:多维索引

除了单一维度上的查询,高斯Redis同样支持在多维数据中的检索。例如,检索所有年龄在50至55岁之间,同时薪水在70000至85000之间的人。实现多维二级索引的关键是通过编码将二维的数据转化为一维数据,再基于高斯Redis zset存储。

可视化视角表示二维索引。下图空间中有一些点,它们代表我们的数据样本,其中x和y是两个变量,其最大值均为400。图片中的蓝色框代表我们的查询。我们希望查询x介于50和100之间,y介于100和300之间的所有点。

怎么使用高斯Redis实现二级索引

3.1 数据编码

若插入数据点为x = 75和y = 200

1)填充0(数据最大为400,故填充3位)

x = 075

y = 200

2)交织数字,以x表示最左边的数字,以y表示最左边的数字,依此类推,以便创建一个编码

027050

若使用00和99替换最后两位,即027000 to 027099,map回x和y,即:

x = 70-79

y = 200-209

因此,针对x=70-79和y = 200-209的二维查询,可以通过编码map成027000 to 027099的一维查询,这可以通过高斯Redis的Zset结构轻松实现。

怎么使用高斯Redis实现二级索引

同理,我们可以针对后四/六/etc位数字进行相同操作,从而获得更大范围。

3)使用二进制

为获得更细的粒度,可以将数据用二进制表示,这样在替换数字时,每次会得到比原来大二倍的搜索范围。假设我们每个变量仅需要9位(以表示最多400个值的数字),我们采用二进制形式的数字将是:

x = 75 -> 001001011

y = 200 -> 011001000

交织后,000111000011001010

让我们看看在交错表示中用0s ad 1s替换最后的2、4、6、8,...位时我们的范围是什么:

怎么使用高斯Redis实现二级索引

3.2 添加新元素

若插入数据点为x = 75和y = 200

x = 75和y = 200二进制交织编码后为000111000011001010,

ZADD myindex 0 000111000011001010

3.3 查询

查询:x介于50和100之间,y介于100和300之间的所有点

从索引中替换N位会给我们边长为2^(N/2)的搜索框。因此,我们要做的是检查搜索框较小的尺寸,并检查与该数字最接近的2的幂,并不断切分剩余空间,随后用ZRANGEBYLEX进行搜索。

下面是示例代码:

def spacequery(x0,y0,x1,y1,exp)    bits=exp*2    x_start = x0/(2**exp)    x_end = x1/(2**exp)    y_start = y0/(2**exp)    y_end = y1/(2**exp)    (x_start..x_end).each{|x|        (y_start..y_end).each{|y|            x_range_start = x*(2**exp)            x_range_end = x_range_start | ((2**exp)-1)            y_range_start = y*(2**exp)            y_range_end = y_range_start | ((2**exp)-1)            puts "#{x},#{y} x from #{x_range_start} to #{x_range_end}, y from #{y_range_start} to #{y_range_end}"            # Turn it into interleaved fORM for ZRANGEBYLEX query.            # We assume we need 9 bits for each integer, so the final            # interleaved representation will be 18 bits.            xbin = x_range_start.to_s(2).rjust(9,'0')            ybin = y_range_start.to_s(2).rjust(9,'0')            s = xbin.split("").zip(ybin.split("")).flatten.compact.join("")            # Now that we have the start of the range, calculate the end            # by replacing the specified number of bits from 0 to 1.            e = s[0..-(bits+1)]+("1"*bits)            puts "ZRANGEBYLEX myindex [#{s} [#{e}"        }    }endspacequery(50,100,100,300,6)

以上就是关于“怎么使用高斯Redis实现二级索引”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: 怎么使用高斯Redis实现二级索引

本文链接: https://lsjlt.com/news/343016.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么使用高斯Redis实现二级索引
    这篇“怎么使用高斯Redis实现二级索引”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用高斯Redis实现二级索引”文...
    99+
    2023-07-02
  • 使用高斯Redis实现二级索引的方法
    目录一、背景二、场景一:词典补全2.1 基本方案2.2 与频率相关的词典补全三、场景二:多维索引3.1 数据编码3.2 添加新元素3.3 查询四、总结一、背景 提起索引,第一印象就是数据库的名词,但是,高斯Redis也可...
    99+
    2022-07-08
    Redis二级索引 Redis二级索引使用 高斯Redis索引
  • PHP高级特性:使用Redis实现高速缓存
    在 php 中使用 redis 实现高速缓存,可显著提升应用程序性能和可扩展性。首先安装 redis,其次使用 predis 库连接到 redis。可通过 set 方法设置缓存,使用 g...
    99+
    2024-05-15
    php redis 数据访问
  • 使用Ajax怎么实现二级联动
    这篇文章将为大家详细讲解有关使用Ajax怎么实现二级联动,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。html<select id="province"&...
    99+
    2023-06-08
  • python高级搜索怎么实现高效搜索GitHub资源
    这篇文章主要讲解了“python高级搜索怎么实现高效搜索GitHub资源”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python高级搜索怎么实现高效搜索GitHub资源”吧!搜索资源通过 ...
    99+
    2023-06-25
  • MySQL中怎么实现高性能索引
    本篇文章为大家展示了MySQL中怎么实现高性能索引,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是索引索引又可以称为键(key)是存储引擎用于快速找到记录的一种...
    99+
    2024-04-02
  • 使用ElasticSearch赋能HBase二级索引 | 实践一年后总结
    前言:还记得那是2018年的一个夏天,天气特别热,我一边擦汗一边听领导大刀阔斧的讲述自己未来的改革蓝图。会议开完了,核心思想就是:我们要搞一个数据大池子,要把公司能灌的数据都灌入这个大池子,然后让别人用 各种姿势 来捞这些数据。...
    99+
    2019-05-04
    使用ElasticSearch赋能HBase二级索引 | 实践一年后总结
  • 怎么在MySQL和Redis中实现二级缓存
    这期内容当中小编将会给大家带来有关怎么在MySQL和Redis中实现二级缓存,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。redis简介Redis 是完全开源免费的,遵守...
    99+
    2024-04-02
  • MySQL二级索引查询过程是怎么样的
    这篇文章将为大家详细讲解有关MySQL二级索引查询过程是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言聚簇索引就是innodb默认创建的基于主键的索引结构,而且表里的数据就是直接放在聚簇索引里...
    99+
    2023-06-29
  • Spring框架如何使用PHP实现高效索引?
    在当今互联网时代,数据的管理和处理已经成为了企业开发中的重要一环。而索引则是一种高效的数据管理方式,能够提升数据的查询效率和响应速度。Spring框架是一个Java平台的企业应用开发框架,而PHP是一种流行的Web编程语言。本文将介绍如何...
    99+
    2023-09-08
    索引 实时 spring
  • PHP数组索引的高级技巧:如何使用path和numy索引来提高性能?
    PHP作为一种流行的编程语言,广泛应用于Web开发领域。在PHP中,数组是一种常用的数据结构,用于存储和处理数据。数组索引是数组的一个关键部分,它允许我们通过特定的值来访问数组中的元素。在本文中,我们将讨论PHP数组索引的高级技巧,特别是如...
    99+
    2023-10-01
    path numy 索引
  • 如何使用Java实现高性能的分布式索引和二维码生成?
    Java是一种广泛使用的编程语言,它可以实现高性能的分布式索引和二维码生成。本文将介绍如何使用Java实现这两个功能。 一、高性能的分布式索引 分布式索引是一种将数据存储在多个节点上的技术,它可以提高数据的可靠性和性能。Java可以使用El...
    99+
    2023-09-26
    分布式 索引 二维码
  • 如何使用 Java 和 Bash 实现高效的实时索引?
    在现代的数据处理领域中,数据索引是一个非常重要的环节。无论是互联网搜索引擎、大数据分析还是数据挖掘,都需要高效的数据索引来支持其运行。本文将介绍如何使用 Java 和 Bash 实现高效的实时索引。 一、了解数据索引 在介绍如何实现高效的...
    99+
    2023-08-26
    bash 索引 实时
  • RiSearch PHP 与 Redis 的配合使用实现高速搜索
    摘要:在日常的开发中,搜索功能是非常常见的一个需求。传统的数据库搜索效率较低,不能满足高速搜索的要求。本文介绍了如何使用 RiSearch PHP 和 Redis 配合实现高速搜索功能,并提供了相关的代码示例。简介RiSearch PHP ...
    99+
    2023-10-21
    PHP redis RiSearch
  • 使用JavaScript怎么实现一个二叉搜索树
    今天就跟大家聊聊有关使用JavaScript怎么实现一个二叉搜索树,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点...
    99+
    2023-06-07
  • 如何使用 ASP 和 Bash 实现高效的索引 API?
    在现代的Web应用程序开发中,数据的高效检索是非常关键的。而实现高效的索引API是实现这个目标的关键之一。本文将介绍如何使用ASP.NET和Bash实现高效的索引API。 ASP.NET是一种基于.NET框架的Web应用程序开发框架。它提供...
    99+
    2023-10-22
    bash 索引 api
  • 如何使用Java编程实现高效索引技术?
    随着大数据时代的到来,数据量的快速增长让数据的检索变得愈发困难,因此,高效的索引技术是必不可少的。Java是一种广泛应用于企业级应用程序开发的编程语言,提供了丰富的API,包括高效的索引技术。本文将介绍如何使用Java编程实现高效索引技术...
    99+
    2023-11-13
    索引 编程算法 开发技术
  • 怎么用Redis实现搜索接口
    这篇文章主要为大家分析了怎么用Redis实现搜索接口的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“怎么用Redis实现搜索接口”的知识吧。对于后端开发人员来...
    99+
    2023-06-28
  • 怎么实现Redis的高可用
    这篇文章主要介绍了怎么实现Redis的高可用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。怎么实现Redis的高可用?要想实现高可用,一台机...
    99+
    2024-04-02
  • MySQL索引怎么使用
    小编给大家分享一下MySQL索引怎么使用,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!MySQL索引的使用实例一. 慢查询日志二. 查询分析器——explain三. 索引的基本使用四. 复合索...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作