Redis is an open source log-type Key-Value database written in ANSI C language, supports network, can be memory-based and persistent, and provides APIs in multiple languages. Today we will take a look at some application scenarios of PHP combined with redis. I hope it will be helpful to everyone.
Preface
In some cases, some students said why the string type cannot be used. The string type can be implemented completely
I suggest Please take a look at my column "Advanced Usage of Redis", which introduces the benefits of using hash types
Counting product dimensions
For products Count the number of likes, number of comments, number of appraisals, and number of views
Speaking of e-commerce, products are definitely inseparable, and incidental products have various counts (number of likes, number of comments, number of appraisals, number of views, etc.)
Redis commands are all atomic, you can easily use INCR, DECR and other commands to count.
Use the Redis type: Hash. If you are not familiar with the redis data type, you can refer to
http://redis.io/topics/data-types-intro
Product defines a key product:, and defines a hashkey for each value, such as the number of likes like_num
$redis->hSet('product:123', 'like_num ', 5); // 添加 id为123的商品 like_num 为5 $redis->hIncrBy('product:123', 'like_num ', 1); // 添加 id为123的商品like_num +1 $redis->hGetAll('product:123'); // 获取id为123的商品相关信息 array('like_num '=> 1)
User dimension count
The number of user dynamics and number of followers , number of fans, number of liked products, number of posts, etc.
User dimension counting and product dimension counting both use Hash. Define a key for User: user:
Define a hashkey for each value, such as the number of followers follow
$redis->hSet('user:100000', 'follow ', 5); // 添加uid为10000的用户follow 为5 $redis->hIncrBy('user:100000', 'follow ', 1); // 更新uid为10000的用户follow +1 $redis->hGetAll('user:100000'); // 获取uid为10000的用户 array('like_num '=> 1)
since In a sorted set, score can be timestamp
The default set is sorted in ascending order by scoreIn this way, to find the common friends of two people, you may only need to use the intersection command
$redis->zAdd('user:1000:follow', 1463557212, '1001'); #uid为1000用户关注uid为1001 , score值设定时间戳1463557212 $redis->zAdd('user:1000:follow', 1463557333, '1002'); $redis->zAdd('user:2000:follow', 1463577568, '1001'); $redis->zAdd('user:2000:follow', 1463896964, '1003'); #uid为2000用户关注1001和1003用户 , score值设定时间戳 $redis->zInter('com_fllow:1000:2000', array('user:1000:follow', 'user:2000:follow')); #对集合'user:1000:follow'和'user:2000:follow'取交集'com_fllow:1000:2000' #获得共同关注的uid $redis->zRange('com_fllow:1000:2000',0,-1); // 获取全部集合元素 #array('10001','10002')
Relatively simple to memcached In terms of key-value storage, redis' numerous data structures (list, set, sorted set, hash,etc)
NOTE: RPUSH pagewviews.user: EXPIRE pagewviews.user: 60 //Pay attention to update timeout
As an e-commerce website, it is inevitable to be attacked by various spam (spam comments, posting spam products, advertisements, brushing your own product rankings, etc.)
Develop a series of anti-spam rules for these spams, some of which can use redis for real-time analysis
For example: no more than 2 comments in 1 minute, less than 5 comments in 5 minutes, etc. (more Mechanism/rules need to be combined with drools)
Conventional sorted set records user operations in the last day(Why not record all? Save memory, all operations will be recorded in the log, and then use hadoop for more comprehensive analysis and statistics)
#获取5秒内操作记录 $res = $redis->zRangeByScore('user:1000:comment', time() - 5, time()); #判断5秒内不能评论 if (!$res) { $redis->zAdd('user:1000:comment', time(), '评论内容'); } else { echo '5秒之内不能评论'; } #5秒内评论不得超过2次 if($redis->zRangeByScore('user:1000:comment',time()-5 ,time())==1) echo '5秒之内不能评论2次'; #5秒内评论不得少于2次 if(count($redis->zRangeByScore('user:1000:comment',time()-5 ,time()))<2) echo '5秒之内不能评论2次';
redis is mainly used as a cache here
$redis->zAdd('user:2000:feed:topic', time(), '13'); //score 为timestamp uid为2000的用户关注tid为13的topic $redis->expire('user:2000:feed:topic',24*60*60); #关注有效期为24小时 # ttl 30天之内按秒数计算 30天之外以timestamp为准
Latest List & Ranking
Latest list of products-sorted set structure presentation
$redis->zAdd('user:1000:product:like', time(), '3002'); $redis->zAdd('user:1000:product:like', time(), '3001'); $redis->zAdd('user:1000:product:like', time(), '3004'); $redis->zAdd('user:1000:product:like', time(), '3003'); $redis->zRange('user:1000:product:like', 0, -1,true); #默认喜欢时间升序序排列 # Array( [3002] => 1463565179 [3001] => 1463565189 [3004] => 1463565199 [3003] => 1463565209 ) $redis->zRevRange('user:1000:product:like', 0, -1,true); #以喜欢时间降序排列 # Array ( [3003] => 1463565424 [3004] => 1463565414 [3001] => 1463565404 [3002] => 1463565394 )
$redis->lPush('user:1000:product:like', '3002'); $redis->lPush('user:1000:product:like', '3001'); $redis->lPush('user:1000:product:like', '3004'); $redis->lPush('user:1000:product:like', '3003'); $redis->lRange('user:1000:product:like', 0, -1); Array ( [0] => 3003 [1] => 3004 [2] => 3001 [3] => 3002 )
$redis->hSet('user:1000:message:notice', 'system', 1); #设置1条未读系统消息 $redis->hIncrBy('user:1000:message:notice', 'system', 1); #未读系统消息+1 $redis->hSet('user:1000:message:notice', 'comment', 1); #设置1条未读评论 $redis->hIncrBy('user:1000:message:notice', 'comment', 1); #未读评论+1 $redis->hGetAll('user:1000:message:notice'); #查看所有消息通知数量 Array ( [system] => 2 [comment] => 2 )
Related recommendations:
PHP Redis extension from installation to use
PHP uses redis to realize session instance sharing
phalapi-cache usage and redis expansion
The above is the detailed content of Scenarios where Redis needs to be used in PHP projects. For more information, please follow other related articles on the PHP Chinese website!