Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP - Redis/Memcachedb/Mongodb or other persistent storage to store counter

By counter it could be pageviews, downloads, number of votes etc. Basically, not very 'critical' data.

What is the 'best' way to store those information? Mysql is not a good option. What do you guys use?

like image 867
Patrick Avatar asked Jan 10 '10 02:01

Patrick


2 Answers

I think I would go with Redis, because:

  • Antirediz(his nickname) is really actively developing Redis. (Every time when I look at my github dashboard he has commited some new code). He now is developing redis fulltime thanks to VMware
  • Redis is eventually persistent so the performance is kickass (first only uses memory which is fast).
  • Redis has an atomic increment operation which you need.
  • Redis has a a lot good PHP libraries. There is also one which is written as a C extension so it has really good performance. Redis website also has an overview off these extensions. Some are pure PHP code (run a litle but slower, but are easier to configure).
like image 161
Alfred Avatar answered Oct 20 '22 00:10

Alfred


MongoDB with upserts is great for this.

If you're storing something like:

{ "url" : "www.example.com", "pageviews" : 0 }

you can atomically increment pageviews really quickly with the atomic operation $inc:

db.downloads.update({'url' : 'www.example.com'}, {'$inc' : {pageviews : 1}})

If you use upserts, you don't have to check whether a document exists before updating it. For example, if you say:

db.downloads.update({'url' : 'www.example.com'}, {'$inc' : {pageviews : 1}}, {"upsert" : true})

the document with the url www.example.com will be created if it doesn't exist (with pageviews set to 1) or, if it does exist, pageviews will be incremented. This means you don't have to worry about pre-populating the collection.

like image 26
kristina Avatar answered Oct 19 '22 23:10

kristina