Redis优化内存记录

 

不管是hash的key还是value 如果能用数字表示尽量用数字吧,类似12345_88这样的字符串如果有规则可以改为1234588这样,以后按位切分获取相应的数字,那么节省的内存量还是很可观的

实际测试,原始下划线连接模式,1400万条数据,11G。使用按位连接的模式可以节约2G的内存占用

 

$id = str_pad(intval($id), 3, “0”, STR_PAD_LEFT);

0补位,获取时截取后3位,去掉前导零即可

 

 

 

 

数据结构描述:
为了记录用户的观看记录,需要记录用户movieid,为了排序需要记录保存时间,还需要记录观看时长,因此用2个ZSET来记录:
KEY     H_13222120124960963
SCORE(保存时间) VALUE(movieid)

1369129543              153540_2412

1369129627             113799_3861

。。。                         。。。

KEY     T_13222120124960963
SCORE(观看时长) VALUE(movieid)

13                                      153540_2412691

113                                    799_3861

。。。                              。。。
用movieid进行关联获取全部数据,在这里H_13222120124960963是有排序需求的,但是T_13222120124960963不需要排序,因为会用movieid关联来取得观看时长数据。
用https://github.com/sripathikrishnan/redis-rdb-tools工具进行比较后发现:
[root@localhost downloads]# /usr/local/bin/redis-memory-for-key -s 192.168.2.126 -p 6379 HH_135601920011139335Key                             “HH_135601920011139335″Bytes                           3589Type                            hashEncoding                        ziplistNumber of Elements              174Length of Largest Element       12

[root@localhost downloads]# /usr/local/bin/redis-memory-for-key -s 192.168.2.126 -p 6379 H_135601920011139335Key                             “H_135601920011139335″Bytes                           27443.0Type                            sortedsetEncoding                        skiplistNumber of Elements              174Length of Largest Element       12
使用hash数据结构比zset节省将近8倍的内存,因此本次优化的方式即为改变数据结构。
public function getTimeCount($key, $field) {        if ($this->_dbh->type($key) == Redis::REDIS_HASH) {        return $this->_dbh->hget($key,$field);        } elseif ($this->_dbh->type($key) == Redis::REDIS_ZSET) {            return $this->_dbh->zScore($key,$field);        } else {            return 0;        }    }        //增加某个视频的观看时长

 

public function addTimeCountNew($data)     {        if (empty($data[‘aid’])) {        $vid_aid = $data[‘vid’];        } else {            $vid_aid = $data[‘vid’].’_’.$data[‘aid’];        }        $key = self::PRE_TIMECOUNT.$data[‘uid’];        if ($this->_dbh->type($key) == Redis::REDIS_HASH || !$this->_dbh->exists($key)) {            $this->_dbh->hSet($key,$vid_aid,$data[‘timecount’]);          } elseif ($this->_dbh->type($key) == Redis::REDIS_ZSET) {            $this->_dbh->zAdd($key, $data[‘timecount’], $vid_aid);            $tmpArr = $this->_dbh->zRevRange($key, 0, -1, true);            $this->_dbh->delete($key);            $this->_dbh->hMset($key, $tmpArr);        }    }