随机一个url锁定随机关键词缓存如何分桶存储架构
一般来说存储对应关系都是以hset的形式存储起来,定义一个hname,然后存到一定数量后程序性能就差了,最好改进成分桶存储。
当前页面url先md5形成唯一识别码,然后定义桶的数量比如100000个,assignBucket获取当前页面分配到哪个桶,
以下就是实现分配关键词与url对应关系的缓存的实现代码:
function hset_url_k($domain,$url_md5,$k_id){
global $pika2;
$kkk='url_k_'.$url_md5;
$bucketIndex=assignBucket($kkk,NUM_TONG);
$hname_bucket=$domain.'_'.$bucketIndex;
if($pika2->hexists($hname_bucket,$kkk)){
$str=$pika2->hdel($hname_bucket,$kkk);
}
if($pika2->hset($hname_bucket,$kkk,$k_id)){
return true;
}else{
return false;
}
}
function assignBucket($data, $numBuckets) {
// 使用哈希算法生成一个哈希值
$hashValue = crc32($data);
// 将哈希值转换为一个非负整数
$hashValue = $hashValue & 0x7FFFFFFF;
return $hashValue % $numBuckets;
}
--------------------------
前端php读取示例:
for($i=1;$i<=$num_friends;$i++){
$k_row=$url_md5.'_'.$bs_now.$i;
$k2_row=$url_md5.'_'.$bs2_now.$i;
$bucketIndex=assignBucket($k_row,NUM_TONG);
$hname_bucket=$h_name.'_'.$bucketIndex;
通过分桶存储就可以实现数据可以纵向无限扩展,当然我们的站群架构采用pika而不是redis,只要磁盘大,数据无限塞~性能也不会差,有效避免了大key导致的内存溢出问题!!!