Redis在Php项目中的实际应用场景

时间: 2019-02-02阅读: 242标签: redis

商品维度计数

对商品喜欢数,评论数,鉴定数,浏览数进行计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc)

Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等命令来计数。 

 采用Redis 的类型: Hash. 如果你对redis数据类型不太熟悉,可以参考 http://redis.io/topics/data-types-intro 为product定义个key product:,为每种数值定义hashkey, 譬如喜欢数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)


用户维度计数

对用户动态数、关注数、粉丝数、喜欢商品数、发帖数等计数

用户维度计数同商品维度计数都采用 Hash. 为User定义个key 为 user: 为每种数值定义hashkey, 譬如关注数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)                             


存储社交关系

譬如将用戶的好友/粉丝/关注,可以存在一个sorted set中,score可以是timestamp
默认集合按照score递增排序
这样求两个人的共同好友的操作,可能就只需要用求交集命令即可  

$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'


用作缓存代替memcached

应用于商品列表,评论列表,@提示列表

相对memcached 简单的key-value存储来说,redis众多的数据结构(list,set,sorted set,hash,etc)

可以更方便cache各种业务数据,性能也不亚于memcached。

NOTE: RPUSH pagewviews.user: EXPIRE pagewviews.user: 60 //注意要update timeou


反spam系统

应用系统评论、发布商品、论坛发贴的spam控制。

作为一个电商网站被各种spam攻击是少不免(垃圾评论、发布垃圾商品、广告、刷自家商品排名等),针对这些spam制定一系列anti-spam规则,其中有些规则可以利用redis做实时分析

譬如:1分钟评论不得超过2次、5分钟评论少于5次等(更多机制/规则需要结合drools )
常规sorted set将最近一天用户操作记录起来。(为什么不全部记录?节省memory,全部操作会记录到log,后续利用hadoop进行更全面分析统计)

#获取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次';


用户Timeline/Feeds

应用于关注的人、主题、品牌及专栏

redis在这边主要当作cache使用

$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为准


最新列表&排行榜

用于记录用户刚刚喜欢的商品最新列表or排行榜 等业务场景  

#商品最新列表-sorted set结构呈现
        $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
            )
        

排行榜-list数据结构呈现

        $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
        )


消息通知

采用Hash结构对消息通知业务场景计数  

$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
)


将Redis用作消息队列

采用Redis的List数据结构实现分布式的消息队列  

Redis的基本数据结构及基本命令详解

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)

Redis分布式锁

redis:Redis是开源,内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.采用单进程单线程模型,并发能力强大,主流的分布式缓存工具。加锁通过setnx向特定的key值写入一个随机值,并且同时设置失效时间,写值成功即加锁成功.

我眼中的 Redis

本来对这个Redis没什么兴趣的,不就是一个缓存的数据库而已吗?直到上次配置spring-redis的时候,发现这个东西没有用户名。配置如上所示,只有主机、端口和密码

PHP操作Redis常用技巧总结

Redis连接与认证连接参数:ip、端口、连接超时时间,连接成功返回true,否则返回false,设置键值:成功返回true,否则返回false,获取键值:成功返回String类型键值

redis用在哪里?redis 应用场景

Redis是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis的正确使用姿势

说到分布式缓存,可能大多数人脑海浮现的就是redis了,为什么redis能够在竞争激烈的缓存大战中脱颖而出呢?原因无非有一下几点:性能好,丰富的特性跟数据结构,api操作简单。但是用的人多了,就会出现很多不规范或者疏忽的地方,严重的时候甚至会导致生产事故

分布式锁的redis缓存使用方式

目前有很多成熟的缓存产品,包括Redis,memcached等。这里以Redis为例来分析下使用缓存实现分布式锁的方案。主要的实现方式是使用Jedis.setNX方法来实现。以上实现方式同样存在几个问题:

Redis常用命令

连接操作命令,持久化,远程服务控制,对value操作的命令,String,List,Set,Hash,Redis 发布订阅命令,Redis 事务命令,查看keys个数,清空数据库

PHP使用redis防止大并发下二次写入

php调用redis进去读写操作,大并发下会出现:读取key1,没有内容则写入内容,但是大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写。

Redis 中 Lua 脚本的应用和实践

前段时间组内有个投票的产品,上线前考虑欠缺,导致被刷票严重。后来,通过研究,发现可以通过 redis lua 脚本实现限流,这里将 redis lua 脚本相关的知识分享出来,讲的不到位的地方还望斧正。

fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

广告赞助文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全