好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

权重随机算法php 权重随机算法 原理

很多站长朋友们都不太清楚权重随机算法php,今天小编就来给大家整理权重随机算法php,希望对各位有所帮助,具体内容如下:

本文目录一览: 1、 php取随机数概率算法 2、 php的memcached分布式hash算法,如何解决分布不均?crc32这个算法没办法把key值均匀的分布出去 3、 求友情链接的随机算法(PHP) php取随机数概率算法

问题有点模糊,我先暂时把“保留两位小数”理解成“[输出的随机数]保留两位小数”,而非其他因素保留多少小数。

又把“1-10”,理解成包括1和10在内其两数之间的小数,

把10-50,理解成10.01到50.00之间的数,不包括10.00。以此类推。

<?php

function genRandom(){

$p=rand(1,100);

if($p<=60) $r=rand(100,1000);

elseif($p>60 and $p<=85) $r=rand(1001,5000);

elseif($p>85 and $p<=95) $r=rand(5001,10000);

else $r=rand(10001, 20000);

return $r/100;

}

$a=array();

$total=50000;

for($i=0;$i<$total;$i++){

$c=genRandom();

if($c>=1 and $c<=10) $p=0;

elseif($c>10 and $c<=50) $p=1;

elseif($c>50 and $c<=100) $p=2;

elseif($c>100 and $c<=200) $p=3;

else $p=4;

if(!array_key_exists($p, $a)) $a[$p]=1;

else $a[$p]++;

}

if(!array_key_exists(4, $a)) $a[4]=0;

echo "总样本数".$total.'<br/>';

echo "1-10样本数".$a[0].', 占'.($a[0]/$total*100).'%<br/>';

echo ">10-50样本数".$a[1].', 占'.($a[1]/$total*100).'%<br/>';

echo ">50-100样本数".$a[2].', 占'.($a[2]/$total*100).'%<br/>';

echo ">100-200样本数".$a[3].', 占'.($a[3]/$total*100).'%<br/>';

echo "其他样本数".$a[4].', 占'.($a[4]/$total*100).'%<br/>';

总样本数50000

1-10样本数30052, 占60.104%

>10-50样本数12404, 占24.808%

>50-100样本数4993, 占9.986%

>100-200样本数2551, 占5.102%

其他样本数0, 占0%

php的memcached分布式hash算法,如何解决分布不均?crc32这个算法没办法把key值均匀的分布出去

memcached的总结和分布式一致性hash

当前很多大型的web系统为了减轻数据库服务器负载,会采用memchached作为缓存系统以提高响应速度。

目录: ()

memchached简介

hash

取模

一致性hash

虚拟节点

源码解析

参考资料

1. memchached简介

memcached是一个开源的高性能分布式内存对象缓存系统。

其实思想还是比较简单的,实现包括server端(memcached开源项目一般只单指server端)和client端两部分:

server端本质是一个in-memory key-value store,通过在内存中维护一个大的hashmap用来存储小块的任意数据,对外通过统一的简单接口(memcached protocol)来提供操作。

client端是一个library,负责处理memcached protocol的网络通信细节,与memcached server通信,针对各种语言的不同实现分装了易用的API实现了与不同语言平台的集成。

web系统则通过client库来使用memcached进行对象缓存。

2. hash

memcached的分布式主要体现在client端,对于server端,仅仅是部署多个memcached server组成集群,每个server独自维护自己的数据(互相之间没有任何通信),通过daemon监听端口等待client端的请求。

而在client端,通过一致的hash算法,将要存储的数据分布到某个特定的server上进行存储,后续读取查询使用同样的hash算法即可定位。

client端可以采用各种hash算法来定位server:

取模

最简单的hash算法

targetServer = serverList[hash(key) % serverList.size]

直接用key的hash值(计算key的hash值的方法可以自由选择,比如算法CRC32、MD5,甚至本地hash系统,如java的hashcode)模上server总数来定位目标server。这种算法不仅简单,而且具有不错的随机分布特性。

但是问题也很明显,server总数不能轻易变化。因为如果增加/减少memcached server的数量,对原先存储的所有key的后续查询都将定位到别的server上,导致所有的cache都不能被命中而失效。

一致性hash

为了解决这个问题,需要采用一致性hash算法(consistent hash)

相对于取模的算法,一致性hash算法除了计算key的hash值外,还会计算每个server对应的hash值,然后将这些hash值映射到一个有限的值域上(比如0~2^32)。通过寻找hash值大于hash(key)的最小server作为存储该key数据的目标server。如果找不到,则直接把具有最小hash值的server作为目标server。

为了方便理解,可以把这个有限值域理解成一个环,值顺时针递增。

如上图所示,集群中一共有5个memcached server,已通过server的hash值分布到环中。

如果现在有一个写入cache的请求,首先计算x=hash(key),映射到环中,然后从x顺时针查找,把找到的第一个server作为目标server来存储cache,如果超过了2^32仍然找不到,则命中第一个server。比如x的值介于A~B之间,那么命中的server节点应该是B节点

可以看到,通过这种算法,对于同一个key,存储和后续的查询都会定位到同一个memcached server上。

那么它是怎么解决增/删server导致的cache不能命中的问题呢?

假设,现在增加一个server F,如下图

此时,cache不能命中的问题仍然存在,但是只存在于B~F之间的位置(由C变成了F),其他位置(包括F~C)的cache的命中不受影响(删除server的情况类似)。尽管仍然有cache不能命中的存在,但是相对于取模的方式已经大幅减少了不能命中的cache数量。

虚拟节点

但是,这种算法相对于取模方式也有一个缺陷:当server数量很少时,很可能他们在环中的分布不是特别均匀,进而导致cache不能均匀分布到所有的server上。

如图,一共有3台server – 1,2,4。命中4的几率远远高于1和2。

为解决这个问题,需要使用虚拟节点的思想:为每个物理节点(server)在环上分配100~200个点,这样环上的节点较多,就能抑制分布不均匀。

当为cache定位目标server时,如果定位到虚拟节点上,就表示cache真正的存储位置是在该虚拟节点代表的实际物理server上。

另外,如果每个实际server的负载能力不同,可以赋予不同的权重,根据权重分配不同数量的虚拟节点。

// 采用有序map来模拟环

this.consistentBuckets = new TreeMap();

MessageDigest md5 = MD5.get();//用MD5来计算key和server的hash值

// 计算总权重

if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )

this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];

} else if ( this.weights == null ) {

this.totalWeight = this.servers.length;

}

// 为每个server分配虚拟节点

for ( int i = 0; i < servers.length; i++ ) {

// 计算当前server的权重

int thisWeight = 1;

if ( this.weights != null this.weights[i] != null )

thisWeight = this.weights[i];

// factor用来控制每个server分配的虚拟节点数量

// 权重都相同时,factor=40

// 权重不同时,factor=40*server总数*该server权重所占的百分比

// 总的来说,权重越大,factor越大,可以分配越多的虚拟节点

double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );

for ( long j = 0; j < factor; j++ ) {

// 每个server有factor个hash值

// 使用server的域名或IP加上编号来计算hash值

// 比如server - "172.45.155.25:11111"就有factor个数据用来生成hash值:

// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor

byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );

// 每个hash值生成4个虚拟节点

for ( int h = 0 ; h < 4; h++ ) {

Long k =

((long)(d[3+h*4]0xFF) << 24)

| ((long)(d[2+h*4]0xFF) << 16)

| ((long)(d[1+h*4]0xFF) << 8 )

| ((long)(d[0+h*4]0xFF));

// 在环上保存节点

consistentBuckets.put( k, servers[i] );

}

}

// 每个server一共分配4*factor个虚拟节点

}

// 采用有序map来模拟环

this.consistentBuckets = new TreeMap();

MessageDigest md5 = MD5.get();//用MD5来计算key和server的hash值

// 计算总权重

if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )

this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];

} else if ( this.weights == null ) {

this.totalWeight = this.servers.length;

}

// 为每个server分配虚拟节点

for ( int i = 0; i < servers.length; i++ ) {

// 计算当前server的权重

int thisWeight = 1;

if ( this.weights != null this.weights[i] != null )

thisWeight = this.weights[i];

// factor用来控制每个server分配的虚拟节点数量

// 权重都相同时,factor=40

// 权重不同时,factor=40*server总数*该server权重所占的百分比

// 总的来说,权重越大,factor越大,可以分配越多的虚拟节点

double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );

for ( long j = 0; j < factor; j++ ) {

// 每个server有factor个hash值

// 使用server的域名或IP加上编号来计算hash值

// 比如server - "172.45.155.25:11111"就有factor个数据用来生成hash值:

// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor

byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );

// 每个hash值生成4个虚拟节点

for ( int h = 0 ; h < 4; h++ ) {

Long k =

((long)(d[3+h*4]0xFF) << 24)

| ((long)(d[2+h*4]0xFF) << 16)

| ((long)(d[1+h*4]0xFF) << 8 )

| ((long)(d[0+h*4]0xFF));

// 在环上保存节点

consistentBuckets.put( k, servers[i] );

}

}

// 每个server一共分配4*factor个虚拟节点

}

// 用MD5来计算key的hash值

MessageDigest md5 = MD5.get();

md5.reset();

md5.update( key.getBytes() );

byte[] bKey = md5.digest();

// 取MD5值的低32位作为key的hash值

long hv = ((long)(bKey[3]0xFF) << 24) | ((long)(bKey[2]0xFF) << 16) | ((long)(bKey[1]0xFF) << 8 ) | (long)(bKey[0]0xFF);

// hv的tailMap的第一个虚拟节点对应的即是目标server

SortedMap tmap = this.consistentBuckets.tailMap( hv );

return ( tmap.isEmpty() ) ? this.consistentBuckets.firstKey() : tmap.firstKey();

更多问题到问题求助专区()

求友情链接的随机算法(PHP)

用一个表来做这个事,

思路是除开自己的9个网站机率是100%,取其中的3个,

也就是每个网站出现的概率是3/9;

然后这个概率是通过已经出现的网站友情链接来进行分配的,

就是说每个友情链接出现的次数是3次,出现3次了他的概率就是0,

其它的概率 剩余次数/(9-出现3次的友情链接次数),

这样能达到你的要求了。

关于权重随机算法php的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于权重随机算法php 权重随机算法 原理的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did209484
更新时间:2023-05-03   阅读:23次

上一篇: vsphp插件开发 vs 插件开发

下一篇:php正则获取匹配部分 phpemail正则

最新资料更新

  • 1.php的项目开发 php项目开发案例整合
  • 2.有没有php扩展 php扩展怎么安装
  • 3.php脚本在线解密 php解密网站程序源码
  • 4.csrfphp防的简单介绍
  • 5.iPad上装php iPad上装修建模app
  • 6.php绘制健康码 php源码怎么搭建网站
  • 7.php项目补充redis php+redis
  • 8.php解析img PHP解析器
  • 9.php网站下载图片 网站的php文件下载
  • 10.php做vip解析 php解析器是什么
  • 11.php内存管理垃圾回收 php的垃圾回收机制是怎样的
  • 12.phpajax日历 php如何生成一年的日历
  • 13.phpcurl带证书 php证书查询系统
  • 14.破解php登录才能查看 破解php登录才能查看吗
  • 15.php实例上传txt代码的简单介绍
  • 16.PHP画饼图动态 python 动态饼图
  • 17.php手机qr php手机编程软件
  • 18.phpword读写 php读写word 文档
  • 19.php蓝色的代码 html颜色代码
  • 20.php函数补全 php自动补全

CopyRight:2016-{hedonghua:year}{hedonghua:sitegs} 备案ICP:湘ICP备09009000号-16 {hedonghua:sitejym}
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2026 「好得很程序员自学网」
[ SiteMap ]