redis:auto-complete
“Redis IN Action” 這本書的中的實現思路
理論基礎,以下3篇文章:
jedis:向redis server提交bytes
redis:encoding
redis: lexicographic ordering
redis: Details on strings comparison
redis commands: zrangebylex
演算法說明:
redis in action: 6.1.2 Address book autocomplete
簡化問題, username 字元的取值範圍是 [a,z]
使用者輸入: "abc"
查詢以 “abc” 打頭的usernames
確定下限:
“abb{”
確定上限:
“abc{”
範圍在:
[ "abb{", "abc{" ]
我來解釋下:
lexical order:
abb
abba
abbb
abbc
...
abb{
abc
abca
abcb
...
abc{
abd
所以,以"abc"打頭的usernames都在 "abb{" 和 "abc{"之間。
Notes: 如果 為什麼要用 { , 可以檢視 unicode code points
繼續擴充套件範圍, 構成 username 的 字元範圍 擴充套件整個 unicode: BMP
unicode:BMP
指代unicode code points在
U+0000 to U+FFFF
範圍內的字元。
private static void autoCompleteBMP(Jedis conn, String key, String prefix) {
if (prefix == null || prefix.isEmpty()) {
return;
}
int len = prefix.length();
//1. header tail
String header = prefix;
String tail = prefix;
if (len > 1) {
header = prefix.substring(0, len - 1);
tail = prefix.substring(len - 1, len);
}
//2. min, max
int codePoint = tail.codePointAt(0);
String start = "\u0000";
if (Character.isValidCodePoint(codePoint - 1)) {
start = new String(new int[]{codePoint - 1}, 0, 1);
}
String min = start + "\uFFFF";
String max = tail + "\uFFFF";
if (len > 1) {
min = header + start + "\uFFFF";
max = header + tail + "\uFFFF";
}
// System.out.println("min: " + min + " ; " + "max: " + max);
//3. zrangebylex
Set<String> strings = conn.zrangeByLex(key, "(" + min, "(" + max);
System.out.println(strings);
}
相關文章
- (Redis):Redis入門Redis
- 【Redis】Redis 學習Redis
- 【Redis】redis遷移資料到redis-clusterRedis
- 【Redis】Redis的操作命令(一)——Redis Key命令Redis
- Redis Labs更名為RedisRedis
- redis面試題 redis總結 redis簡述Redis面試題
- 【Azure Redis 快取 Azure Cache For Redis】Redis連線池Redis快取
- redis之 Redis持久化配置Redis持久化
- 【Redis】 redis資料遷移Redis
- 【Redis】Windows下安裝RedisRedisWindows
- 操作Redis之go-redisRedisGo
- Redis服務之Redis ClusterRedis
- Redis基礎:redis特點Redis
- [Redis 概述] 什麼是 Redis?Redis
- [Redis 系列]redis 學習二Redis
- 【Redis 系列】redis 學習二Redis
- 【Azure Redis 快取 Azure Cache For Redis】使用Redis自帶redis-benchmark.exe命令測試Azure Redis的效能Redis快取
- 看看redis中那些好玩的module (sql on redis, bf/cf on redis)RedisSQL
- 【Redis】redis-cluster到redis-cluster的快速複製Redis
- 【Redis 系列】redis 學習八,redis 持久化 RDB 和 AOFRedis持久化
- RedisRedis
- Redis那些事(一) — Redis簡介Redis
- Redis Manager Build Redis 安裝包RedisUI
- 【Redis】用python操作redis叢集RedisPython
- Redis(1)_Redis的基本認識Redis
- Redis 高階特性 Redis Stream使用Redis
- Redis系列24:Redis使用規範Redis
- Redis(四)--- Redis的命令參考Redis
- Redis 分析工具 redis-rdb-toolsRedis
- Redis學習(一)——初識RedisRedis
- 認識Redis叢集——Redis ClusterRedis
- Redis 知多少 (一)---Redis 簡介Redis
- 【Redis】redis阻塞監控項分析Redis
- redis:新增redis到服務列表Redis
- 高可用Redis(七):Redis持久化Redis持久化
- 圖解Redis,Redis主從複製與Redis哨兵機制圖解Redis
- redis學習(九) redis事務和redis指令碼的比較Redis指令碼
- Redis | 第7章 Redis 伺服器《Redis設計與實現》Redis伺服器