redis-自动补全
自动补全实现方式有两种:
第一种:数据量非常小时,程序从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,添加到起始元素和结束元素的后面,并使用加锁机制,进行插入
最新文章
- C#开发微信门户及应用(20)-微信企业号的菜单管理
- 19.在HTTP 1.0中,状态码401的含义是(?);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(?)写出http常见的状态码和含义,至少5个.[完善题目]
- Unix时间戳转换怎样在Excel批量修改?
- MySQL使用小记
- Python数学运算的一个小算法(求一元二次方程的实根)
- WebForm MapPageRoute 路由配置(转载)
- Python 温习
- js代码性能优化的几个方法
- docker swarm集群搭建
- Android中常用开发工具类—持续更新...
- T-SQL中的APPLY用法(半翻译)
- android glide图片加载框架
- php html生成页面二维码
- 单点登录(SSO)详解
- python 数据可视化 -- matplotlib02
- numpy 与 pandas
- python unittest装载、执行、造成报告
- Pandas重塑和轴向旋转
- socket 映射服务器--(可处理多客户端连接(fork),显示退出信息)
- linux安装mysql数据库和简单配置
热门文章
- 设置ABP默认使用中文
- 初识JAVA语言
- Oracle中的一些基本sql语句
- netcore 中的动态代理与RPC实现(微服务专题)
- Badboy参数化 - Add Variable(循环使用不同的关键字进行搜索)
- BZOJ3170 	[Tjoi2013]松鼠聚会 切比雪夫距离 - 曼哈顿距离 - 前缀和
- STL中set和multiset小结
- lightoj 1095 - Arrange the Numbers(dp+组合数)
- ZOJ 3872 Beauty of Array 连续子序列求和
- yzoj P2343 &; 洛谷 P1437 [HNOI2004]敲砖块