自动补全实现方式有两种:

第一种:数据量非常小时,程序从redis中获取数据后,在程序中排序;redis只作为数据存储用;

第二种:数据量较大时,直接在redis中排序,并返回自动补全的数据。

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

第二种实现方式解读:

1、在大多数情况下,使用有序集合是为了快速地判断某个元素是否存在于有序集合中、查看某个成员是否在有序集合中的位置或索引,以及从有序集合的某个地方快速地按范围取出多个元素。

2、有序集合除了按照分值排序外,另外一个特性:当所有成员分值相同时,有序集合将按照名字来排序;而当所有成员的分值都是0 的时候,成员将按照字符串的二进制顺序进行排序。

3、为简单说明,假定所有名字都是英文字母

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

5、为了知道这两个元素的定位,需要向有序集合中插入两个元素,一个排在abbz的后面(这个元素是ab`),另一个排在abd的前面(这个元素是ab{)

6、为什么是 ` 和 {  两个元素呢:因为在ASCII编码里面,排在z后面的第一个字符就是做花括号{    所以,只要把 {   拼接到abc前缀的末尾,就可以了

7、而ASCII中,排在a前面的就是反引号  `

8、总结:通过将给定前缀的 “最后一个字符” “替换”为第一个排在该字符前面的字符,可以得到前缀的前驱

    通过给前缀的末尾“拼接”上做花括号,可以得到前缀的后继。

    为了防止多个前缀同时进行时出现任何问题,程序还给钱最拼接一个左花括号,以便在需要的时候,根据这个左花括号来过滤掉被插入有序集合里面的起始元素和结束元素。

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

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

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

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

10、为了避免滋扰用户,每次只自动补全 10 个元素

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

redis-自动补全的更多相关文章

  1. 使用Redis实现中英文自动补全功能详解

    1.Redis自动补全功能介绍: ​ Redis可以帮我们实现很多种功能,今天这里着重介绍的是Redis的自动补全功能的实现.我们使用有序集合,并score都为0,这样就按元素值的字典序排序.然后我们 ...

  2. 利用redis完成自动补全搜索功能(一)

    最近要做一个搜索自动补全的功能(目前只要求做最前匹配),自动补全就是自动提示,类似于搜索引擎,再上面输入一个字符,下面会提示多个关键词供参考,比如你输入 nb 2字符, 会自动提示nba,nba录像, ...

  3. Redis 实战 —— 08. 实现自动补全、分布式锁和计数信号量

    自动补全 P109 自动补全在日常业务中随处可见,应该算一种最常见最通用的功能.实际业务场景肯定要包括包含子串的情况,其实这在一定程度上转换成了搜索功能,即包含某个子串的串,且优先展示前缀匹配的串.如 ...

  4. jQuery 邮箱下拉列表自动补全

    综述 我想大家一定见到过,在某个网站填写邮箱的时候,还没有填写完,就会出现一系列下拉列表,帮你自动补全邮箱的功能.现在我们就用jQuery来实现一下. 博主原创代码,如有代码写的不完善的地方还望大家多 ...

  5. eclipse自动补全的设置

    eclipse自动补全的设置   如果你用过Visual Studio的自动补全功能后,再来用eclipse的自动补全功能,相信大家会有些许失望. 但是eclipse其实是非常强大的,eclipse的 ...

  6. vim 添加php自动补全 并格式化代码

    自动补全,修改/etc/vimrc的配置 vim /etc/vimrc 添加: filetype plugin on autocmd FileType php set omnifunc=phpcomp ...

  7. Eclipse自动补全设置

    如果你用过Visual Studio的自动补全功能后,再来用eclipse的自动补全功能,相信大家会有些许失望. 但是eclipse其实是非常强大的,eclipse的自动补全没有VS那么好是因为ecl ...

  8. Autocomplete 自动补全(Webform实战篇)

    开篇语 因为项目中需要用到一个自动补全的功能,功能描述: 需求一:新增收件人的时候,自动下拉显示出数据库中所有的收件人信息(显示的信息包括:姓名-收件地址-联系方式) 需求二:选中一个值得时候,分别赋 ...

  9. eclipse自动补全的设置(自动提示)

      如果你用过Visual Studio的自动补全功能后,再来用eclipse的自动补全功能,相信大家会有些许失望. 但是eclipse其实是非常强大的,eclipse的自动补全没有VS那么好是因为e ...

  10. jQuery AutoComplete 自动补全

    jQuery.AutoComplete是一个基于jQuery的自动补全插件.借助于jQuery优秀的跨浏览器特性,可以兼容Chrome/IE/Firefox/Opera/Safari等多种浏览器. 特 ...

随机推荐

  1. C#数据结构_树

    树的定义是递归的,用树来定义树.因此,树(以及二叉 树)的许多算法都使用了递归. 结点(Node):表示树中的数据元素. 结点的度(Degree of Node):结点所拥有的子树的个数. 树的度(D ...

  2. 前端项目升级到React-router5中遇到的问题解决方案以及思路

    我胡汉三有日子没回来写写文章了,最近一直再忙着将老项目升级,所以没时间来搞文章,今天突然感觉开了挂一样,爱因斯坦附体,把之前的bug都搞定了,在这里特意把升级中遇到的问题,记录下来,算是把这个坑填上. ...

  3. javaScript 基础知识汇总(五)

    1.垃圾回收 JavaScript 的内存管理是自动的,不能强制执行或者阻止执行 可达性 JavaScript中主要的内存管理概念是可达性. 什么是可达性? 定义一个对象 let user = { n ...

  4. codeforces 816 E. Karen and Supermarket(树形dp)

    题目链接:http://codeforces.com/contest/816/problem/E 题意:有n件商品,每件有价格ci,优惠券di,对于i>=2,使用di的条件为:xi的优惠券需要被 ...

  5. JavaScript漫谈之理解类型操作符typeof

    在本文中,将简述JavaScript类型系统和数据类型,以及如何使用typeof操作符执行类型检查. 还讲解了使用typeof操作符进行某些数据类型检查是不完善的,并介绍其他几种类型检查的方法. 更多 ...

  6. Go第三方日志库logrus

    日志是程序中必不可少的一个环节,由于Go语言内置的日志库功能比较简洁,我们在实际开发中通常会选择使用第三方的日志库来进行开发.本文介绍了logrus这个日志库的基本使用. logrus介绍 Logru ...

  7. postman--请求以及变量设置的实例练习

    我们可以在2个地方添加需要执行的js脚本,一个是Pre-request Script,还有一个tests,我们先看请求之前的 1 在请求被发送到服务器之前:就是在“Pre-request Script ...

  8. 简单说一下你对http和https的理解

    http是一种超文本传输协议,传输的数据都是未加密的,也就是显示在明面上的,是现在互联网上应用最为广泛的一种网络协议,相对来说不太安全,但是所需成本很小.http一般的端口号为80. https则是具 ...

  9. Linux防火墙管理

    1.临时关闭防火墙 systemctl stop firewalld 2.查看防火墙运行状态 firewall-cmd --state 3.开启防火墙 systemctl start firewall ...

  10. 使用DevExpress的PdfViewer实现PDF打开、预览、另存为、打印(附源码下载)

    场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...