redis实现自动补全

redis实现自动补全

自动补全,首先脑袋里想到的是冒出一句sqlselect * from t_table where key like key_word%,而且需要实时通过调用ajax每次访问数据库。。。。显然是不太优雅,了解到redis中的sorted set的属性,可以自动给排序

实现

看一波:

127.0.0.1:6379> zadd zset 0 a
(integer) 1
127.0.0.1:6379> zadd zset 0 ab
(integer) 1
127.0.0.1:6379> zadd zset 0 abc
(integer) 1
127.0.0.1:6379> zadd zset 0 abcd
(integer) 1
127.0.0.1:6379> zadd zset 0 b
(integer) 1
127.0.0.1:6379> zadd zset 0 bg
(integer) 1
127.0.0.1:6379> zadd zset 0 bgb

查询一下:

127.0.0.1:6379> zrange zset 0 -1
1) "a"
2) "ab"
3) "abc"
4) "abcd"
5) "b"
6) "bg"
7) "bgb"

是不是很爽,然后通过zrank来定位key值:

127.0.0.1:6379> zrank zset abc
(integer) 2
127.0.0.1:6379> zrange zset 2 -1
1) "abc"
2) "abcd"
3) "b"
4) "bg"
5) "bgb"
127.0.0.1:6379>

这里通过zrank命令定位到了key,然后遍历到zset列表的最后(不一定要到最后,可以指定个数,10个差不多了),其实这样就达到了目的

注意:这里使用zadd命令的时候一定要将score属性设置相同的分数,我这里设置为0,这是因为如果设置不同的分数,可能排序就不一样了,如:

127.0.0.1:6379> zadd zz 1 a
(integer) 1
127.0.0.1:6379> zadd zz 1 ab
(integer) 1
127.0.0.1:6379> zadd zz 2 abc
(integer) 1
127.0.0.1:6379> zadd zz 2 abcd
(integer) 1
127.0.0.1:6379> zadd zz 1 b
(integer) 1
127.0.0.1:6379> zadd zz 1 bc
(integer) 1
127.0.0.1:6379> zadd zz 2 bcd
(integer) 1
127.0.0.1:6379> zrange zz 0 -1
1) "a"
2) "ab"
3) "b"
4) "bc"
5) "abc"
6) "abcd"
7) "bcd"
127.0.0.1:6379>

优化

其实,上一步还是可以优化的,如果通过zrange key 0 -1命令查看后,如果发现列表的前一条不是后一条的前缀,就在这条记录上加个终止符(如*,%)等等,如:

127.0.0.1:6379> zadd zset 0 abcd*
(integer) 1
127.0.0.1:6379> zadd zset 0 bgb*
(integer) 1
127.0.0.1:6379> zrange zset 0 -1
1) "a"
2) "ab"
3) "abc"
4) "abcd"
5) "abcd*"
6) "b"
7) "bg"
8) "bgb"
9) "bgb*"
127.0.0.1:6379>

现在,通过zrank定位到key,然后通过zrange zset index fixnumber,我们遍历的时候在prefix*这里就可以结束了,大大减少了数据量,如果prefix*的位置在fixnumber的位置之前,那么遍历到prefix*的时候就可以停止了;否则就取到fixnumber个数的列表

猜你喜欢

转载自blog.csdn.net/u013887008/article/details/81158945