资讯专栏INFORMATION COLUMN

实时投票系统:数据类型上的差异:memcache和redis

muzhuyu / 2399人阅读

摘要:最近要写一个类投票的系统由于访问量可能会比较大,最好不直接使用数据库,完全使用缓存的话,存在缓存失效等的风险,因此在上面写个缓存中间过渡按照我的习惯,肯定是使用,但是公司目前这个项目线上还没有服务,只好凑合一下使用。

最近要写一个类投票的系统:由于访问量可能会比较大,最好不直接使用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中,代码如下:

[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 pid

2.使用redis中的有序集合,直接解决问题:

value为"13453" score为13920,

value为"13454" score为12989,

...
一段代码,直接搞定:

$list= $redis->zRange($_GET["key"], 0, -1);

最后,我是redis的fans。比较支持redis

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/61678.html

相关文章

  • [转载] Redis、MongoDB及Memcached的区别

    摘要:单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。只能使用单线程,性能受限于性能,故单实例最高才可能达到取决于数据结构,数据大小以及服务器硬件性能,日常环境中高峰大约在左右。 1 基本概念 1.1 Redis(内存数据库) Redis是一个key-value存储系统(布式内缓存,高性能的key-value数据库)。和Memcached类似,它支持存储的value类型相对...

    jcc 评论0 收藏0
  • [转载] Redis、MongoDB及Memcached的区别

    摘要:单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。只能使用单线程,性能受限于性能,故单实例最高才可能达到取决于数据结构,数据大小以及服务器硬件性能,日常环境中高峰大约在左右。 1 基本概念 1.1 Redis(内存数据库) Redis是一个key-value存储系统(布式内缓存,高性能的key-value数据库)。和Memcached类似,它支持存储的value类型相对...

    liaosilzu2007 评论0 收藏0
  • 现代软件开发流程-by 12-Factor

    摘要:将开发环境和生产环境的差异降至最低,并使用持续交付实施敏捷开发。可以在工具架构和开发流程不发生明显变化的前提下实现扩展。我们的初衷是分享在现代软件开发过程中发现的一些系统性问题,并加深对这些问题的认识。 简介 如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。12-Factor 为构建如下的 SaaS 应用提供了方法论: 使用标准化流程自动配置,从...

    draveness 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<