En matière d'indexation, la première impression est le terme base de données, mais Gaussian Redis peut également implémenter une indexation secondaire ! ! ! Les index secondaires dans Gaussian Redis sont généralement implémentés à l'aide de zset. Gaussian Redis présente des avantages en termes de stabilité et de coût plus élevés que Redis open source. L'utilisation de Gaussian Redis zset pour implémenter des index secondaires commerciaux peut permettre d'obtenir une situation gagnant-gagnant en termes de performances et de coûts.
L'essence de l'indexation est d'utiliser des structures ordonnées pour accélérer les requêtes, de sorte que les index de type numérique et caractère puissent être facilement implémentés via la structure Zset Gaussian Redis.
• Index de type numérique (zset est trié par score) :
•
Passons en deux types de scénarios commerciaux classiques, voyons comment utiliser Gaussian Redis pour créer un système d'index secondaire stable et fiable.2. Scénario 1 : Complétion du dictionnaire
Lors de la saisie d'une requête dans le navigateur, le navigateur recommande généralement des recherches avec le même préfixe en fonction de la vraisemblance. Ce scénario peut être réalisé à l'aide de la fonction d'index secondaire Gaussian Redis.
Le moyen le plus simple est d'ajouter chaque requête de l'utilisateur à l'index. Si vous devez fournir des invites de complétion aux utilisateurs, vous pouvez utiliser ZRANGEBYLEX pour effectuer des requêtes de plage. Pour réduire le nombre de résultats, l'utilisation de l'option LIMIT est une méthode prise en charge par Gaussian Redis.
• Ajoutez une banane de recherche d'utilisateur à l'index :
ZADD myindex 0 banana:1
ZRANGEBYLEX myindex "[bit" "[bit\xff"
ZRANGEBYLEX myindex "[banana:" + LIMIT 0 1
ZADD myindex 0 banana:1
ZREM myindex 0 banana:1
ZADD myindex 0 banana:2
ZRANGEBYLEX myindex "[banana:" + LIMIT 0 10 1) "banana:123" 2) "banaooo:1" 3) "banned user:49" 4) "banning:89"
ZREM myindex 0 banaooo:1
ZREM myindex 0 banana:123 ZADD myindex 0 banana:122
3.1 Codage des données
Si le point de données inséré est x = 75 et y = 200
1) Remplissez 0 (la donnée maximale est de 400, donc remplissez 3 chiffres)
x = 075 y = 2002)交织数字,以x表示最左边的数字,以y表示最左边的数字,依此类推,以便创建一个编码
027050
若使用00和99替换最后两位,即027000 to 027099,map回x和y,即:
x = 70-79
y = 200-209
因此,针对x=70-79和y = 200-209的二维查询,可以通过编码map成027000 to 027099的一维查询,这可以通过高斯Redis的Zset结构轻松实现。
同理,我们可以针对后四/六/etc位数字进行相同操作,从而获得更大范围。
3)使用二进制
如果将数据表示为二进制,就可以获得更细的粒度,而在数字替换时,每次都将搜索范围扩大两倍。如果我们使用二进制表示法数字,每个变量最多需要9位(表示最多400个值),那么我们将得到:
x = 75 -> 001001011
y = 200 -> 011001000
交织后,000111000011001010
让我们看看在交错表示中用0s ad 1s替换最后的2、4、6、8,...位时我们的范围是什么:
若插入数据点为x = 75和y = 200
x = 75和y = 200二进制交织编码后为000111000011001010,
ZADD myindex 0 000111000011001010
查询:x介于50和100之间,y介于100和300之间的所有点
从索引中替换N位会给我们边长为2^(N/2)的搜索框。因此,我们要做的是检查搜索框较小的尺寸,并检查与该数字最接近的2的幂,并不断切分剩余空间,随后用ZRANGEBYLEX进行搜索。
下面是示例代码:
def spacequery(x0,y0,x1,y1,exp) bits=exp*2 x_start = x0/(2**exp) x_end = x1/(2**exp) y_start = y0/(2**exp) y_end = y1/(2**exp) (x_start..x_end).each{|x| (y_start..y_end).each{|y| x_range_start = x*(2**exp) x_range_end = x_range_start | ((2**exp)-1) y_range_start = y*(2**exp) y_range_end = y_range_start | ((2**exp)-1) puts "#{x},#{y} x from #{x_range_start} to #{x_range_end}, y from #{y_range_start} to #{y_range_end}" # Turn it into interleaved form for ZRANGEBYLEX query. # We assume we need 9 bits for each integer, so the final # interleaved representation will be 18 bits. xbin = x_range_start.to_s(2).rjust(9,'0') ybin = y_range_start.to_s(2).rjust(9,'0') s = xbin.split("").zip(ybin.split("")).flatten.compact.join("") # Now that we have the start of the range, calculate the end # by replacing the specified number of bits from 0 to 1. e = s[0..-(bits+1)]+("1"*bits) puts "ZRANGEBYLEX myindex [#{s} [#{e}" } } end spacequery(50,100,100,300,6)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!