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

第一种:数据量非常小时,程序从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. 剖析nsq消息队列(一) 简介及去中心化实现原理

    分布式消息队列nsq,简单易用,去中心化的设计使nsq更健壮,nsq充分利用了go语言的goroutine和channel来实现的消息处理,代码量也不大,读不了多久就没了.后期的文章我会把nsq的源码 ...

  2. HDU 2516

    题意略. 思路: 典型的斐波那契博弈,这里说一下结论: 如果先手面对的n不是斐波那契数,那么先手必胜:否则后手胜. 详见代码: #include<bits/stdc++.h> using ...

  3. Java并发编程——线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  4. python3 使用urllib报错urlopen error EOF occurred in violation of protocol (_ssl.c:841)

    python3源码: import urllib.request from bs4 import BeautifulSoup response = urllib.request.urlopen(&qu ...

  5. 《阿里巴巴Java开发手册1.4.0》阅读总结与心得(二)

    (六)并发处理 12. [推荐] 在并发场景下, 通过双重检查锁(double-checked locking) 实现延迟初始化的优化问题隐患(可参考 The "Double-Checked ...

  6. 在Azure云上实现postgres主备切换

    以下是工作上实现postgres主备切换功能所用到的代码和步骤,中间走了不少弯路,在此记录下.所用到的操作系统为centos 7.5,安装了两台服务器,hostname为VM7的为Master,VM8 ...

  7. BZOJ2152 聪聪可可 (点分治)

    2152: 聪聪可可 题意: 在一棵边带权的树中,问任取两个点,这两个点间的权值和是3的倍数的概率. 思路: 经典的点分治题目. 利用点分治在计算所有路径长度,把路径长度对3取模,用t[0],t[1] ...

  8. 牛客OI测试赛 F 子序列 组合数学 欧拉降幂公式模板

    链接:https://www.nowcoder.com/acm/contest/181/F来源:牛客网 题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘 ...

  9. ☆1003 Dijstra

    循环N次 算法分为两部分: 1)找到距离最小的城市,找不到距离更小的城市时退出方法 2)更新距离 实际操作时,先初始化: 更新dis为INF,更新dis[start] = 0: 变种: 找最短路径的条 ...

  10. mysql 主主从配置

    配置主服务器:主服务器1 Ip:  192.168.0.1 主服务器2 Ip:  192.168.0.2 主服务器1配置 2.1.修改mysql配置文件 vim /etc/my.conf Server ...