实时投票系统:数据类型上redis和memcache的差距
来源:互联网 发布:淘宝卖家的货款在哪里 编辑:程序博客网 时间:2024/05/16 06:24
最近要写一个类投票的系统:由于访问量可能会比较大,不能直接使用mysql数据库,完全使用缓存的话,存在缓存失效等的风险,因此在mysql上面写个缓存中间过渡:
1.memcache
按照我的习惯,肯定是使用redis,但是公司目前这个项目线上还没有redis服务,只好凑合一下使用memcache。
第一次的时候使用memcache
这么写:
key为'13453' value为13920,
key为'13454' value为12989,
...
但是这么一来的话就不好排序了,每次想排序,都要从缓存中取出很多个值。
第二次这么写:
memcache中存储了一个数组: 'pid' =>count
array(
'13453' =>13920,
'13454'=>12989,
...
)
每次有人投票需要先取出该数组,然后再对应的pid上面加1,排序,再存入memcache中,代码如下:
/** * @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); }
/** * @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 pid
2.使用redis中的有序集合,直接解决问题:
value为'13453' score为13920,
value为'13454' score为12989,
...一段代码,直接搞定:
$list= $redis->zRange($_GET['key'], 0, -1);
最后,我是redis的fans。比较支持redis
- 实时投票系统:数据类型上redis和memcache的差距
- 在VMware的Linux系统上安装Redis redis及memcache使用
- Redis和Memcache的比较
- memcache 和 redis 的区别
- redis和memcache的对比
- redis和memcache的对比
- Redis和Memcache的区别?
- Redis和Memcache的区别
- memcache和redis的区别
- Redis和Memcache的区别
- Redis和Memcache的区别?
- Redis和Memcache的区别
- Redis和Memcache的区别
- redis和memcache的区别
- redis和memcache的区别
- Redis 和Memcache的区别
- Redis和Memcache的区别
- Redis和Memcache的区别
- Verilog之i2c协议
- ssh服务器的建立
- ASP.NET 中文COOKIE乱码
- discuzX 回话保存机制
- Linux环境之1_临时文件
- 实时投票系统:数据类型上redis和memcache的差距
- Building a 3D MMO using Websockets
- poj3080
- 使用 CSS3 实现超炫的 Loading(加载)动画效果
- 3个著名加密算法(MD5、RSA、DES)的解析
- 最小二乘法及其c++实现
- 如何在Windows2008 r2 防火墙下设置QL Server 2005、2008 的1433端口
- protobuf中 repeated[Ptr]Field的序列化
- linux下mysql的卸载、安装全过程