Redis应用(三)实现自动补全

自动补全往往给出部分提示供用户选择,这就涉及排序。有几下几种方法:

一、需要添加元素且数据量少

 1、方案:数据量非常小时,程序从redis中获取数据后,在程序中排序。

(1)写数据:如实现记忆补全,当用户选择性补全后,可以将该元素从列表中LREM删除再LPUSH推进最左端,下次再取出来就靠前了。

(2)排序:使用Redis存储列表,Redis仅做存储功能,自动补全在代码中完成,代码获取整个列表再来进行匹配。

二、需要添加元素且数据量大

1、方案:对于非常长的列表,仅仅为了找到几个元素而获取整个列表,比较浪费资源。可以使用有序集合。直接在redis中排序,并返回自动补全的数据。添加/移除元素使用ZADD、ZREM,难点在于排序。

2、排序:根据有序集合的特点,

假定所有名字都是英文字母,将所有分值都设置为0,通过将给定前缀的 “最后一个字符” “替换”为第一个排在该字符前面的字符,可以得到前缀的前驱;通过给前缀的末尾“拼接”上做花括号,可以得到前缀的后继。 为了防止多个前缀同时进行时出现任何问题,程序还给钱最拼接一个左花括号,以便在需要的时候,根据这个左花括号来过滤掉被插入有序集合里面的起始元素和结束元素。

(1)已前缀字符序列abc为例,查找abc前缀的单词实际上是查找介于 abbz……和 abd…… 之间的字符串。如果知道第一个排在abbz之前元素的排名,以及第一个排在abd之后的元素的排名,那么就可以用一个zrange调用来取得所有abc前缀的列表

(2)为了知道这两个元素的定位,需要向有序集合中插入两个元素,一个排在abbz的后面(这个元素是ab`),另一个排在abd的前面(这个元素是ab{)。这是因为在ASCII编码里面,排在z后面的第一个字符就是做花括号{    所以,只要把 {   拼接到abc前缀的末尾,就可以了;而ASCII中,排在a前面的就是反引号  ` 。

若使用的不是ASCII编码,而使用的是UTF-8、UTF-16、UTF-32等,则需要如下步骤

(1)想办法把所有字符都转换为字节,如UTF-8、UTF-16(大端)、UTF-32(大端)

(2)找出自己想要支持的字符范围,并确保字符编码在所选范围的前面和后面都至少留有一个字符

(3)用支持的字符范围中最前面的字符替换`     最后面的字符替换  {

3、注意点:

(1)为了避免滋扰用户,每次只自动补全 几个元素

(2)为了避免将多个相同的起始元素或结束元素重复地添加到有序集合,或者错误地从有序集合中移除了有其他自动补全程序添加的起始元素或结束元素,建议程序生成UUID,添加到起始元素和结束元素的后面,并使用加锁机制,进行插入。

三、不需要添加元素,来获取自动补全范围。(使用redis进行搜索)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『Open3D』1.10 Tensor数据处理

open3d中实现了自身的数据类型,用于open3d中内部算法的数值计算,但基础使用上与numpy类似。 目录 1、tensor创建 2、tensor数据属性 3、 Tensor数据在CPU与GPU上的转换

Linux/Traceback

Enumeration nmap 使用nmap初步扫描发现只开放了22和80端口&#xff0c;端口详细扫描情况如下 先看看web是什么样子的&#xff0c;打开网站发现有一条留言&#xff0c;显示该站点已经被黑了&#xff0c; 并且留下了后门 查看源代码&#xff0c;可以看到下面的注释 <!--So…

Docker中创建并配置MySQL、nginx、redis等容器

Docker中安装并配置MySQL、nginx、redis等 文章目录 Docker中安装并配置MySQL、nginx、redis等一、创建nginx容器①&#xff1a;拉取镜像②&#xff1a;运行nginx镜像③&#xff1a;从nginx容器中映射nginx配置文件到本地④&#xff1a;重启nginx并重新配置nginx的挂载 二、创建…

python编写的端口扫描脚本

实训项目制作的端口扫描脚本 附有详细的使用命令解释 可以实现单个端口进行扫描和端进行扫描 eg&#xff1a;1-65535 import optparse # 导入用于解析命令行参数的模块 import socket # 导入用于网络通信的模块 # 定义函数&#xff1a;扫描指定主机的指定端口 def PortSca…

Vue透传 Attributes的代码以及总结

//透传简单来说就是在子组件写style,class或者函数可以将它们&#xff0c;自动直接传递给 template&#xff1a;里面的单个节点。 //多个节点透传的自动传递会生效&#xff0c;如果在节点中像使用&#xff0c;那么就需要在对应的节点中写像:style"$attrs.style"的形…

LabVIEW精确测量产品中按键力和行程

项目背景 传统的按键测试方法涉及手工操作&#xff0c;导致不一致和效率低下。在汽车行业中&#xff0c;带有实体按键的控制面板非常常见&#xff0c;确保一致的按键质量至关重要。制造商经常在这些组件的大规模、准确测试中遇到困难。显然&#xff0c;需要一个更自动化、精确…

Kubernetes (十四) 调度策略

一. 调度策略 二. 调度方法 nodeName 创建pod配置文件 vim nodename.yaml apiVersion: v1 kind: Pod metadata: name: nginx labels…

23 SEMC外扩SDRAM

文章目录 23.1 SDRAM 控制原理23.2 SEMC 简介 23.1 SDRAM 控制原理 RT1052 系列芯片扩展内存时可以选择 SRAM 和 SDRAM 由于 SDRAM 的“容量/价格”比较高&#xff0c;即使用 SDRAM 要比 SRAM 要划算得多。 给 RT1052 芯片扩展内存与给 PC 扩展内存的原理是一样的 PC 上一般…

【计算机网络】HTTP协议以及简单的HTTP服务器实现

文章目录 一、HTTP协议1.认识URL2.urlencode和urldecode3.HTTP协议格式4.HTTP的方法5.HTTP的状态码6.HTTP常见Header7.重定向8.长连接9.会话保持10.基本工具 二、简单的HTTP服务器实现1.err.hpp2.log.hpp3.procotol.hpp4.Sock.hpp5.Util.hpp6.httpServer.hpp7.httpServer.cc8.总…

网络编辑day4

思维导图 广播模型发送端-->类似于UDP客户端 #include<head.h> int main(int argc, const char *argv[]) {//1、创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error ");return -1;}//2、将套接字设置成允许广播int broadcast1…

2023年山东省职业院校技能大赛高职组信息安全管理与评估 模块二(正式赛)

2023年山东省职业院校技能大赛高职组信息安全管理与评估 模块二 模块二竞赛项目试题 根据信息安全管理与评估技术文件要求&#xff0c;模块二为网络安全事件响应、数字取证调查和 应用程序安全。本文件为信息安全管理与评估项目竞赛-模块二试题。 介绍 竞赛有固定的开始和结…

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC 博主平时DIY经常使用OLED&#xff0c;其中以4脚的I2C屏最多&#xff0c;就想着总结一下子&#xff0c;让广大DIY朋友更容易找到资源。 驱动采用的时SSD1306 同学们拿到代码后&#xff0c;可以直接用&#xff0c;其中博主给的代码默认…

Windows 常用快捷键

文章目录 前言Win R&#xff1a;打开运行窗口Win D&#xff1a;显示桌面。Win E&#xff1a;打开资源管理器。Ctrl Shift Esc&#xff1a;打开任务管理器。Alt Tab&#xff1a;切换当前打开的窗口。F2&#xff1a;重命名选定的文件或文件夹。Ctrl W&#xff1a;关闭当前…

学习响应式编程中遇到的奇奇怪怪的问题

spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…

【GitHub项目推荐--AI杀入斗地主领域】【转载】

AlphaGo&#xff1a;第一个战胜围棋世界冠军的人工智能机器人。 我不会玩围棋&#xff0c;没办法和 AlphaGO 对局。但是我喜欢玩斗地主&#xff0c;有斗地主人工智能机器人吗&#xff1f; 有&#xff0c;而且还开源了。DouZero&#xff1a;快手团队开发的斗地主AI。别的不说&…

文件共享服务(一)——DAS、NAS、SAN存储类型

一、存储类型 存储类型主要有三种 1. DAS直连式存储 通常由数据线直连电脑就可以用&#xff0c;比如一块新硬盘&#xff0c;只需要利用磁盘模拟器分区&#xff0c;创建文件系统&#xff0c;挂载就可以使用了。 PC中的硬盘或只有一个外部SCSI接口的JBOD存储设备&#xff08;即…

编程框架概述:MVC, MVP, MVVM, Flux/Redux, 和 Clean Architecture

前言 在软件开发中&#xff0c;选择合适的编程框架和架构模式对于构建可维护和可扩展的应用程序至关重要。初学者在面对多种架构选项时可能会感到困惑。本文将详细介绍五种流行的编程框架&#xff1a;MVC、MVP、MVVM、Flux/Redux和Clean Architecture。 MVC&#xff08;Model-V…

1. JDBC 连库操作的基本流程

根据Mysql JDBC基本操作&#xff0c;我们大概可以总结出JDBC的API。 Driver &#xff1a;jdbc驱动DriverManager&#xff1a;驱动注册类&#xff0c;创建Connection连接Connection&#xff1a;物理连接Statement、PreparedStatement&#xff1a;sql语句ResultSet&#xff1a;结…

【前端学习笔记1】css基础

css可以使页面更漂亮&#xff0c;即美化网页 css&#xff1a;层叠样式表 标签选择器&#xff1a; 类选择器&#xff1a; id只能单次调用&#xff0c;类似人的身份证 css里只要是word里面有的功能&#xff0c;他们都有对应的&#xff0c;不会的时候查一下就行 实现垂直居中:h…

[java数据结构] ArrayList和LinkedList介绍与使用

目录 (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的…