ITKeyword - 技术文章推荐分享

首页 > 实时投票系统:数据类型上的差异:memcache和redis - 程序开发中遇到的问题

实时投票系统:数据类型上的差异:memcache和redis - 程序开发中遇到的问题

最近要写一个类投票的系统:由于访问量可能会比较大,最好不直接使用mysql数据库,完全使用缓存的话,存在缓存失效等的风险,因此在mysql上面写个缓存中间过渡:1.memcache按照我的习惯,肯定是使用redis,但是公司目前这个项目线上还没有redis服务,只好凑合一下使用memcache。第一次的时候使用memcache这么写:key为'13453' value为13920,key为'13454' value为12989,...但是这么一来的话就不好排序了,每次想排序,都要从缓存中取出很多个值。第二次这么写:memcache中存储了一个数组: 'pid' =>countarray('13453' =>13920,'13454'=>12989,...)每次有人投票需要先取出该数组,然后再对应的pid上面加1,排序,再存入memcache中,代码如下:[php] view plaincopyprint?在CODE上查看代码片派生到我的代码片/** * @brief 从memcache中取出数据,并相应增加一,然后排序 */private function _addCount($uid) {

if(empty($uid)) {

return false;

}

$mc_key = "MEM_KEY_SORT";

$list = self::memcache()->get($mc_key);

$list[$uid]++;

if(empty($list)) {

$list = $this->_getCount();//数据不存在则查询数据库(group by)

}

asort($list);

$ret = self::memcache()->set($mc_key, $list);}[php] view plaincopyprint?在CODE上查看代码片派生到我的代码片/** * @brief 从数据库获取投票次数 * @return array('uid' => '次数') */private function _getCount() {

$sql = "select pid,count(pid) as count from tmp_ssjj_zqwz group by pid";

$query = self::db()->query($sql);

while(($row = self::db()->fetch_array($query))!==FALSE) {

$list[$row['pid']] = $row['count'];

}

return $list;}数据结构如下:CREATE TABLE tmp_ssjj_zqwz (id int(11) NOT NULL AUTO_INCREMENT COMMENT '自增编号',uid int(11) NOT NULL COMMENT '投票id',type int(11) NOT NULL DEFAULT '0' COMMENT '投票类型',pid int(11) NOT NULL DEFAULT '0' COMMENT '被投票id',

PRIMARY KEY (id),

UNIQUE KEY unique_uid_type (uid,type),

KEY index_pid (pid)) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=gbk;加上索引,使用group by来统计数据:select pid,count(pid) as count from tmp_ssjj_zqwz group by pid2.使用redis中的有序集合,直接解决问题:value为'13453' score为13920,value为'13454' score为12989,...一段代码,直接搞定:$list= $redis->zRange($_GET['key'], 0, -1);最后,我是redis的fans。比较支持redis

最近要写一个类投票的系统:由于访问量可能会比较大,最好不直接使用mysql数据库,完全使用缓存的话,存在缓存失效等的风险,因此在mysql上面写个缓存中间过渡:1.memcache按照我的习惯,肯...

------分隔线----------------------------