自动补全实现方式有两种:
第一种:数据量非常小时,程序从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,添加到起始元素和结束元素的后面,并使用加锁机制,进行插入