怎样设计一个轻量的用户autocomplete系统
2011-12-12 18:09
211 查看
http://antirez.com/post/autocomplete-with-redis.html
怎样设计一个轻量的用户autocomplete系统
好问题1烂问题未收藏1我最近在设计一个系统时需要有一个用户下拉选择的功能,设计成输入首字母自动联想的autocomplete模式。现在在设计后端数据结构上遇到了些麻烦。目前是我直接用mysql的LIKE来做的这一功能,但如果随着用户和访问量的增长,这样肯定很慢。
我使用的是redis缓存,用redis的朋友都应该读过那篇用redis实现autocomplete的文章。不过我要说的是,这篇文章并不解决我的问题。因为它只能完成关键词的联想功能,但它的关键词是无状态的,没有任何索引标记它的id。也就是说它除了能完成自动联想以外,无法完成关键词与用户的关联过程。
另一个缺点是,这玩意索引的代价太高了,要对每个字都做分词,然后存入cache中做索引。而用户名是可以修改的,我觉得每次修改再重建索引的成本太大。
我想了另一个方案,利用redis的交集功能来做搜索,这也是比较流行的方法。比如一个用户名叫
Hello,用php代码来展示如何处理这个用户名,为了展示方便,我只处理英文字母
$user_name = strtolower('Hello'); $user_id = 1001; $len = strlen($user_name); for ($pos = 0; $pos < $len; $pos ++) { $key = md5($user_name[$pos]); $redis->sAdd('user_name:' . $key . ':' . $pos, $user_id); }在上面的代码中,我把每个字母用
md5哈希一下然后和他的位置值
$pos共同组成一个redis索引。这样如果在所有用户名都用这种办法做索引后,我们就可以使用redis的交集功能来做搜索了
$keyword = strtolower('he'); // 测试的关键词 $indexes = array(); // 索引集合 $len = strlen($keyword); for ($pos = 0; $pos < $len; $pos ++) { $key = md5($keyword[$pos]); $indexes[] = 'user_name:' . $key . ':' . $pos; } // 得出结果仅需一步, 求它们的交集 $result = $redis->sInter($indexes);但这个办法有几个缺陷
我觉得还是偏重,因为我只想实现一个用户名自动联想的功能而不是搜索。这样的系统还要维护一套庞大的索引,每次更新用户名还得一个一个删掉然后再塞入新的。
无法做
LIMIT和
OFFSET啊,翻页怎么半,万一一个交集非常大,岂不是要把系统撑死
模糊查询的功能偏弱,只能处理以关键词开头的情况。不过这个不是重点,能把上面两点解决就很好了。
不知道各位有什么好的方案?
redis mysql autocomplete0条评论 | 修改 | 链接时间先后
得票数
1 个回答
好答案0烂答案huacnlee 1 14分钟前http://github.com/huacnlee/redis-sear...
并没有每个字都索引的,只是在 zset 里面才有每个字,但是数据重复的会被合并掉,我那个模糊查询是以分词的结果作为索引的;
用户与某些特别关键词的关联这种功能是我下阶段的实现目标(加别名字段)
内存占用方面:
89m, 7500+ 实际数据在前缀匹配索引里面, 2086+ 分词索引,此外,一起还有1万多条实际数据在
huacnlee 1 修改于 9分钟前
相关文章推荐
- 怎样不使用Useradd在linux下创建一个新的用户
- 怎样设计一个合理的软件试用机制或类似机制?
- 设计一个可扩展的用户登录系统
- Java 异常类层次结构及怎样设计一个高效合理的异常处理框架
- 设计一个User类,并定义类的三个构造方法,类中有三个变量有用户名、口令、记录用户个数
- web开发,是个非常敏捷的过程,变化随时都在产生,用户需求千变万化,许多方面偶然性非常高,较之软件开发,希望用一个架构规划以后的所有设计,是不现实的
- 如何从用户体验的角度去做一个网站的页面设计
- 如何从用户体验的角度去做一个网站的页面设计
- Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入。 那么,弹出软键盘后必然会造成原有布局高度的减少,那么系统应该如何来处理布局的减少
- 如何设计一个基于角色的用户权限系统?
- 利用Java Swing技术设计一个鼠标点击速度比赛游戏程序。程序显示一个按钮和一个文本框,用户点击按钮,文本框显示鼠标点击次数。
- 怎样利用移动设计技巧来吸引用户
- 设计一个高效的网络服务器用户管理类
- BBS 设计思路系列 ---- 网友提供的一个用户在CSDN的总分算法
- 怎样做好一个产品之用户体验
- 怎样做符合用户预期的设计
- 蛙蛙推荐:设计一个高效的网络服务器用户管理类
- 一个很简单的用户登录设计
- 如何设计一个不打扰用户的提示?
- BBS 设计思路系列 ---- 为了推实名制,一个用户一个账号??取消奖励转移??