前篇:最近在做一个将redis中大数据量进行合并缩减优化的工作,其中一项按月将数据进行合并。将一个月的数据放入一个key-value键值对中。
例:p2d20180901-3、p2d20180902-4、p2d20180903-2...p2d20180901-10 合并成 p2d201809 - $value,有两种方案。
一种使用string类型:将value值变成以“,”分隔的字符串,一种是使用hash类型:将value值变成以日期为key的数组。
现在对这两种做相应的数据分析。看执行效率。
分析使用string 和 hash 类型合并一个月的数据,两者性能的差别。50000数据写入,20000数据的随机读取。
1、 本地127.0.0.1 (均值) 线上服务器IP(均值)
string类型写入 18-44s (31.8s) 51-61s(57s)
hash类型写入 26-53s (37.2s) 50-61s (58s)
string类型读取 20-25s (22.4s) 18-25s (22s)
hash类型读取 24-26s(25s) 19-26s(26.2s)
通过数据可以分析得出当value值为简单的数组时 使用string类型,无论是本地还是线上服务器都优于hash类型,故使用string类型作为数据合并工作。
当然这里的前提条件是原先的value值为简单的数组或字符,写入和读取中字符串和数组之间转换以及内存占用量不大时,使用string类型;如果value 值为图片,长度很大的字符串...等大数据量时,使用hash类型更为简便,性能更高。
2、在随机读取中使用了mt_rand(),而不适用rand(),他们两者的区别:
mt_rand()是更好地随机数生成器,因为它跟rand()相比播下了一个更好地随机数种子;而且性能上比rand()快4倍,mt_getrandmax()所表示的数值范围也更大
getrandmax():32767 2^15-1
mt_getrandmax():2147483647 2^31-1
无符号长整型的最大值是2^32-1,即42E,但是这种类型无法表示负数,长整型的负数可以表示到-2147483648)
http://www.w3school.com.cn/php/func_math_mt_getrandmax.asp 上得输出类似数据 3147483649 的答案有待考证?理论上不可能大于最大值2^32-1