我正在研究PHP/MySQL评级系统.对于用户能够评价用户必须登录.每个用户都有一个唯一的"UID".网站上会有多个评级实例(每个游戏一个,在我的情况下),我需要一种在MySQL行中存储UID列表的有效方法(评级系统的每个实例的评级表中有一个MySQL行) )保持一个谁投票的记录.
我在其他系统中看到列表存储在序列化的PHP数组中.每次用户投票时,序列化数组必须被提取,反序列化,插入新的UID,重新序列化数组,并且MySQL行是UPDATEd.每次加载页面时,必须再次对该列表进行反序列化并检查以查看查看该页面的用户是否已投票以确保用户未投票两次.
这似乎是低效和繁琐的.MySQL是否具有内置列表功能以帮助此过程更高效?有没有更聪明的方法可以解决这个问题?
我已经考虑过一种可能的替代方法,即忘记序列化并将UID存储在MySQL数据库的TEXT类型字段中.我会在每个UID之后附加一些非数字字符(比如句号[.]).要添加用户条目,我只需将UID连接到TEXT字段的末尾,然后连接句点.当检查用户是否已经投票时,我可以"SELECT*FROM table WHERE votes ='%$ UID.%';".这会更有效地工作还是有更优雅的方式完成工作?
关于表结构的后续帖子... 评级系统的高效MySQL表结构
我正致力于在C#(.NET 4.0)中使用TPL.
我创建了一个自定义API来简化Web请求的创建和下载内容(异步,使用延续任务).那部分工作正常.
当我尝试使用延迟任务创建LimitedConcurrencyLevelTaskScheduler(在并行编程的示例和任务的MSDN文档中找到)时,我遇到了问题.如果您不熟悉该类,那么它所做的就是限制计划任意数量的任务的并发度.
基本上我想将Web请求任务链的创建推迟到由我们调度的任务中,LimitedConcurrencyLevelTaskScheduler以便我可以限制并发下载的数量.
正如圣人Stephen Toub所建议的那样,当推迟创建a时Task,最好的办法是设计你的API以返回a Func<Task>或Func<Task<TResult>>.我做到了这一点.
不幸的是,我的程序在安排第一组并发任务后挂起.假设我的任务仅限于4度并发.在这种情况下,将启动4个任务,然后程序将挂起.任务永远不会完成.
我创建了一个简单的例子来简单地说明问题.我正在使用文件读取而不是使用WebRequest.我将并发度限制为1.
class Program
{
static Func<Task> GetReadTask()
{
return () =>
{
Console.WriteLine("Opening file.");
FileStream fileStream = File.Open("C:\\Users\\Joel\\Desktop\\1.txt", FileMode.Open);
byte[] buffer = new byte[32];
Console.WriteLine("Beginning read.");
return Task<int>.Factory.FromAsync(fileStream.BeginRead, fileStream.EndRead, buffer, 0, 32, null).ContinueWith(task => fileStream.Close());
};
}
static void Main()
{
LimitedConcurrencyLevelTaskScheduler ts = new LimitedConcurrencyLevelTaskScheduler(1);
TaskFactory factory = new TaskFactory(ts); …Run Code Online (Sandbox Code Playgroud) 这篇文章是这个回答问题的后续内容:存储用户ID列表的最佳方法.
我采用了cletus和Mehrdad Afshari关于使用规范化数据库方法的史诗建议.是否正确设置了以下表格以进行适当的优化?我对MySQL效率有点新意,所以我想确保它有效.
另外,在找到游戏的平均评分和总票数时,我应该分别使用以下两个查询?
SELECT avg(vote) FROM votes WHERE uid = $uid AND gid = $gid;
SELECT count(uid) FROM votes WHERE uid = $uid AND gid = $gid;
CREATE TABLE IF NOT EXISTS `games` (
`id` int(8) NOT NULL auto_increment,
`title` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `users` (
`id` int(8) NOT NULL auto_increment,
`username` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `votes` …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Contact Importer网络应用程序(在PHP中),因此我将能够从Gmail,Yahoo等用户的帐户中获取电子邮件地址,并将其用于我自己的恶意目的.开个玩笑,我的网络应用非常友好.
我以为我会从谷歌开始.我发现他们有一个很棒的小API,叫做Google Contacts API,让像我这样的程序员可以访问用户的联系人.
经过几个小时的挣扎并把糟糕的代码扔在一起后,我遇到了几个路障.我的主要问题是:
有什么方法可以让我的用户在我的网站上为Gmail提供他们的用户名和密码,让我的代码检索联系人而不需要那么讨厌的重定向到Google登录页面?这有点毁了我的网络应用程序的整个流程.
我已经查看了AuthSub,并得到了它的工作,但当然问题是你必须重定向用户以获取访问令牌.看起来OAuth会有同样的问题.
我有一线希望是ClientLogin身份验证方法.同样,有一个问题,有时Google会向您抛出CAPTCHA而不是auth令牌.同样,用户流程也被破坏了.
我注意到我们在Twitter上的好朋友们工作得很好.有谁知道他们是怎么做到的?
谢谢!
我正在使用TagLib(在Windows上,使用MingW构建).我想让TagLib识别MP3文件中没有ID3v1或ID3v2信息.根据TagLib文档,当文件中没有ID3v2信息时,MPEG File对象中的ID3v2Tag()函数应返回NULL指针.
不幸的是,这种情况并未发生.我有一些我在我的代码中使用的测试MP3文件(我已经提供了文件):
这是我的代码.
#include <iostream>
#include <mpeg/mpegfile.h>
#include <mpeg/id3v2/id3v2tag.h>
using namespace std;
int main()
{
cout << "Test." << endl;
TagLib::MPEG::File a("tests/other/blank.mp3");
TagLib::MPEG::File b("tests/id3v2/only_album_id3v2.mp3");
TagLib::MPEG::File c("tests/id3v1/only_album_id3v1.mp3");
TagLib::ID3v2::Tag * at = a.ID3v2Tag();
TagLib::ID3v2::Tag * bt = b.ID3v2Tag();
TagLib::ID3v2::Tag * ct = c.ID3v2Tag();
cout << at->album() << endl;
cout << bt->album() << endl;
cout << ct->album() << endl;
cout << "The program is done.";
return 0;
} …Run Code Online (Sandbox Code Playgroud) 在过去的几天里,我一直在努力学习F#,我一直在困扰着我.我的"学习项目"是一些屏幕抓取器,用于处理我有兴趣操作的一些数据.
在F#PowerPack中有一个调用Stream.AsyncReadToEnd.我不想仅仅为那个单独的电话使用PowerPack,所以我看看他们是如何做到的.
module Downloader =
open System
open System.IO
open System.Net
open System.Collections
type public BulkDownload(uriList : IEnumerable) =
member this.UriList with get() = uriList
member this.ParalellDownload() =
let Download (uri : Uri) = async {
let UnblockViaNewThread f = async {
do! Async.SwitchToNewThread()
let res = f()
do! Async.SwitchToThreadPool()
return res }
let request = HttpWebRequest.Create(uri)
let! response = request.AsyncGetResponse()
use responseStream = response.GetResponseStream()
use reader = new StreamReader(responseStream)
let! contents = UnblockViaNewThread (fun() -> reader.ReadToEnd())
return uri, contents.ToString().Length …Run Code Online (Sandbox Code Playgroud) php ×3
mysql ×2
performance ×2
android ×1
asynchronous ×1
authsub ×1
c# ×1
c++ ×1
f# ×1
google-api ×1
oauth ×1
optimization ×1
taglib ×1
windows ×1