redis中关于使用string类型还是hash类型

时间:2023-03-09 07:33:34
redis中关于使用string类型还是hash类型

前篇:最近在做一个将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

redis中关于使用string类型还是hash类型

相关文章