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 學習Redis
- (Redis):Redis入門Redis
- redis面試題 redis總結 redis簡述Redis面試題
- 【Redis】redis遷移資料到redis-clusterRedis
- 【Redis】Redis的操作命令(一)——Redis Key命令Redis
- 【redis】redis的bind配置Redis
- 【Azure Redis 快取 Azure Cache For Redis】Redis連線池Redis快取
- Redis服務之Redis ClusterRedis
- Redis基礎:redis特點Redis
- [Redis 系列]redis 學習二Redis
- 【Redis 系列】redis 學習二Redis
- Redis Labs更名為RedisRedis
- 【Redis】 redis資料遷移Redis
- redis之 Redis持久化配置Redis持久化
- 【redis】centOS安裝配置redisRedisCentOS
- redis監控之Redis LiveRedis
- 懶 Redis 是更好的 RedisRedis
- 《Redis官方文件》Redis事件庫Redis事件
- 操作Redis之go-redisRedisGo
- 【Redis】Windows下安裝RedisRedisWindows
- 【Azure Redis 快取 Azure Cache For Redis】使用Redis自帶redis-benchmark.exe命令測試Azure Redis的效能Redis快取
- java程式碼中操作Redis:單機redis、叢集redis(spring+redis整合)JavaRedisSpring
- redisRedis
- 【Redis】redis-cluster到redis-cluster的快速複製Redis
- 看看redis中那些好玩的module (sql on redis, bf/cf on redis)RedisSQL
- 【Redis 系列】redis 學習八,redis 持久化 RDB 和 AOFRedis持久化
- Redis 知多少 (一)---Redis 簡介Redis
- Redis(四)--- Redis的命令參考Redis
- 高可用Redis(七):Redis持久化Redis持久化
- 【Redis】redis阻塞監控項分析Redis
- Redis那些事(一) — Redis簡介Redis
- Redis Manager Build Redis 安裝包RedisUI
- 認識Redis叢集——Redis ClusterRedis
- Redis學習(一)——初識RedisRedis
- Redis 分析工具 redis-rdb-toolsRedis
- Redis系列24:Redis使用規範Redis