返回顶部
首页 > 资讯 > 数据库 >使用高斯Redis实现二级索引的方法
  • 660
分享到

使用高斯Redis实现二级索引的方法

Redis二级索引Redis二级索引使用高斯Redis索引 2022-07-08 12:07:26 660人浏览 八月长安
摘要

目录一、背景二、场景一:词典补全2.1 基本方案2.2 与频率相关的词典补全三、场景二:多维索引3.1 数据编码3.2 添加新元素3.3 查询四、总结一、背景 提起索引,第一印象就是数据库的名词,但是,高斯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 10
1) "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:123
ZADD 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}"
        }
    }
end
spacequery(50,100,100,300,6)

四、总结

本文介绍了如何通过高斯Redis搭建二级索引,二级索引在电商、图(hexastore)、游戏等领域具有广泛的应用场景,高斯redis现网亦有很多类似应用。高斯Redis基于存算分离架构,依托分布式存储池确保数据强一致,可方便的支持二级索引功能,为企业客户提供稳定可靠、超高并发,且能够极速弹性扩容的核心数据存储服务。

到此这篇关于使用高斯Redis实现二级索引的文章就介绍到这了,更多相关Redis二级索引内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: 使用高斯Redis实现二级索引的方法

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

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

猜你喜欢
  • 使用高斯Redis实现二级索引的方法
    目录一、背景二、场景一:词典补全2.1 基本方案2.2 与频率相关的词典补全三、场景二:多维索引3.1 数据编码3.2 添加新元素3.3 查询四、总结一、背景 提起索引,第一印象就是数据库的名词,但是,高斯Redis也可...
    99+
    2022-07-08
    Redis二级索引 Redis二级索引使用 高斯Redis索引
  • 怎么使用高斯Redis实现二级索引
    这篇“怎么使用高斯Redis实现二级索引”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用高斯Redis实现二级索引”文...
    99+
    2023-07-02
  • C#中高斯消元法的实现方法
    这篇文章主要介绍“C#中高斯消元法的实现方法”,在日常操作中,相信很多人在C#中高斯消元法的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中高斯消元法的实现方法”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-18
  • mysql索引的实现方法
    mysql索引的实现方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!MySQL索引的概念索引是一种特殊的文件(InnoD...
    99+
    2024-04-02
  • MySQL与Redis实现二级缓存的方法是什么
    这篇文章将为大家详细讲解有关MySQL与Redis实现二级缓存的方法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。redis简介Redis 是完全开源免费的,遵守B...
    99+
    2024-04-02
  • 使数据库索引使用效率更高的方法
    这篇文章将为大家详细讲解有关使数据库索引使用效率更高的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优...
    99+
    2024-04-02
  • PHP高级特性:使用Redis实现高速缓存
    在 php 中使用 redis 实现高速缓存,可显著提升应用程序性能和可扩展性。首先安装 redis,其次使用 predis 库连接到 redis。可通过 set 方法设置缓存,使用 g...
    99+
    2024-05-15
    php redis 数据访问
  • Java编程中的索引:如何实现高效的索引算法?
    在Java编程中,索引是一种非常重要的数据结构。它可以帮助我们快速地查找和访问数据,提高程序的运行效率。在本文中,我们将探讨Java编程中的索引,以及如何实现高效的索引算法。 一、什么是索引? 在计算机科学中,索引是一种数据结构,它通常用...
    99+
    2023-06-30
    索引 编程算法 并发
  • 使用ElasticSearch赋能HBase二级索引 | 实践一年后总结
    前言:还记得那是2018年的一个夏天,天气特别热,我一边擦汗一边听领导大刀阔斧的讲述自己未来的改革蓝图。会议开完了,核心思想就是:我们要搞一个数据大池子,要把公司能灌的数据都灌入这个大池子,然后让别人用 各种姿势 来捞这些数据。...
    99+
    2019-05-04
    使用ElasticSearch赋能HBase二级索引 | 实践一年后总结
  • React实现二级联动的方法
    本文实例为大家分享了React实现二级联动的具体代码,供大家参考,具体内容如下 实现效果: 普通h5页,图片我进行了裁剪,把用户那部分删掉了,不过也不影响说明 大体思路就是把数据接口...
    99+
    2024-04-02
  • Python利用treap实现双索引的方法
    前言: 在很多应用场景下,我们不但需要堆的特性,例如快速知道数据最大值或最小值,同时还需要知道元素的排序信息,因此本节我们看看如何实现鱼和熊掌如何兼得。假设我们有一系列数据,它的元...
    99+
    2024-04-02
  • PHP数组索引的高级技巧:如何使用path和numy索引来提高性能?
    PHP作为一种流行的编程语言,广泛应用于Web开发领域。在PHP中,数组是一种常用的数据结构,用于存储和处理数据。数组索引是数组的一个关键部分,它允许我们通过特定的值来访问数组中的元素。在本文中,我们将讨论PHP数组索引的高级技巧,特别是如...
    99+
    2023-10-01
    path numy 索引
  • Redis使用Bitmap的方法实现
    目录1. Bitmap 是什么2. 占用存储空间3. 命令3.1 SETBIT3.2 GETBIT3.3 BITCOUNT3.4 BITOP3.5 BITPOS1. Bitmap 是什么 Bitmap(也称为位数组或者位...
    99+
    2023-01-28
    Redis使用Bitmap
  • 如何使用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
  • 如何使用 ASP 和 Bash 实现高效的索引 API?
    在现代的Web应用程序开发中,数据的高效检索是非常关键的。而实现高效的索引API是实现这个目标的关键之一。本文将介绍如何使用ASP.NET和Bash实现高效的索引API。 ASP.NET是一种基于.NET框架的Web应用程序开发框架。它提供...
    99+
    2023-10-22
    bash 索引 api
  • Spring框架如何使用PHP实现高效索引?
    在当今互联网时代,数据的管理和处理已经成为了企业开发中的重要一环。而索引则是一种高效的数据管理方式,能够提升数据的查询效率和响应速度。Spring框架是一个Java平台的企业应用开发框架,而PHP是一种流行的Web编程语言。本文将介绍如何...
    99+
    2023-09-08
    索引 实时 spring
  • NumPy索引的PHP打包实现方法?
    对于数据科学和计算机编程的爱好者而言,NumPy是一个非常重要的Python库,可以用于处理和操作大型数组和矩阵。然而,有时候我们需要在其他编程语言中使用NumPy的功能。在这篇文章中,我们将讨论如何使用PHP中的打包功能实现NumPy的索...
    99+
    2023-09-04
    打包 numpy 索引
  • 使用mysql索引的操作方法
    下文我给大家简单讲讲关于使用mysql索引的操作方法,大家之前了解过相关类似主题内容吗?感兴趣的话就一起来看看这篇文章吧,相信看完使用mysql索引的操作方法对大家多少有点帮助吧。mysql索引的目的在于提...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作