Redis在电商中的实际应用-Java
示例代码用Jedis编写。
1. 各种计数,商品维度计数和用户维度计数
说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等命令来计数。
- 商品维度计数(喜欢数,评论数,鉴定数,浏览数,etc)
采用Redis 的类型: Hash
. 如果你对redis数据类型不太熟悉,可以参考 http://redis.io/topics/data-types-intro。为product定义个key product:
,为每种数值定义hashkey, 譬如喜欢数like
jedis.hset("product:1", "like", "5");
jedis.hincrBy("product:1", "like", 1);//喜欢加一
System.out.print(jedis.hget("product:1", "like"));
- 用户维度计数(动态数、关注数、粉丝数、喜欢商品数、发帖数 等)
用户维度计数同商品维度计数都采用 Hash
. 为User定义个key user:
,为每种数值定义hashkey, 譬如关注数follow
jedis.hset("user:1", "follow", "5");
jedis.hincrBy("user:1", "follow", 1);//关注数加一
System.out.print(jedis.hget("user:1", "follow"));
2. 存储社交关系
譬如将用戶的好友/粉丝/关注,可以存在一个sorted set
中,score可以是timestamp,这样求两个人的共同好友的操作,可能就只需要用求交集命令即可。
jedis.zadd("user:1000:friends", System.currentTimeMillis(), "user:1001");
//uid为1000用户和uid为1001是朋友 , score值设定时间戳
jedis.zadd("user:1000:friends", System.currentTimeMillis(), "user:1002");
//uid为1000用户和uid为1002是朋友 , score值设定时间戳 jedis.zadd("user:2000:friends", System.currentTimeMillis(), "user:1001");
jedis.zadd("user:2000:friends", System.currentTimeMillis(), "user:1003"); jedis.zinterstore("com_friends:1000:2000", "user:1000:friends", "user:2000:friends");
System.out.println(jedis.zrange("com_friends:1000:2000", 0, -1));
3. 用作缓存代替memcached(商品列表,评论列表,@提示列表,etc)
相对memcached 简单的key-value存储来说,redis众多的数据结构(list,set,sorted set,hash, etc)可以更方便cache各种业务数据,性能也不亚于memcached。
4. 反spam系统(评论,发布商品,论坛发贴,etc)
作为一个电商网站被各种spam攻击是少不免(垃圾评论、发布垃圾商品、广告、刷自家商品排名等),针对这些spam制定一系列anti-spam规则,其中有些规则可以利用redis做实时分
析,譬如:1分钟评论不得超过2次、5分钟评论少于5次等(更多机制/规则需要结合drools )。
采用sorted set
将最近一天用户操作记录起来(为什么不全部记录?节省memory,全部操作会记录到log,后续利用hadoop进行更全面分析统计)
if(!jedis.exists("user:1000:comment")){//还没有评论
jedis.zadd("user:1000:comment", System.currentTimeMillis(), "uid为1000的评论内容");
System.out.println(jedis.zrange("user:1000:comment", 0, -1));
}else{
//获取一分钟内的评论记录
Set<String> result = jedis.zrangeByScore("user:1000:comment", System.currentTimeMillis() - 60 * 1000, System.currentTimeMillis());
if(!result.isEmpty()){
System.out.println("1分钟内不能评论两次");
}else{
jedis.zadd("user:1000:comment", System.currentTimeMillis(), "uid为1000的评论内容"+System.currentTimeMillis());
System.out.println(jedis.zrange("user:1000:comment", 0, -1));
}
}
5. 用户Timeline/Feeds
应用于关注的人、主题、品牌及专栏,redis在这边主要当作cache使用
jedis.zadd("user:2000:feed:topic", System.currentTimeMillis(), "13topic" + System.currentTimeMillis());
//score为timestamp uid为2000的用户关注tid为13的topic
jedis.expire("user:2000:feed:topic", 10);
//关注有效期为10秒
System.out.println(jedis.zrange("user:2000:feed:topic", 0, -1));
6. 最新列表&排行榜
用于记录用户刚刚喜欢的商品最新列表or排行榜 等业务场景
jedis.zadd("user:1000:product:like", System.currentTimeMillis(), "003");
Thread.currentThread();
Thread.sleep(10);
jedis.zadd("user:1000:product:like", System.currentTimeMillis(), "001");
Thread.sleep(10);
jedis.zadd("user:1000:product:like", System.currentTimeMillis(), "004");
Thread.sleep(10);
jedis.zadd("user:1000:product:like", System.currentTimeMillis(), "002");
Thread.sleep(10); //默认喜欢时间升序排列
Set<String> result = jedis.zrange("user:1000:product:like", 0, -1);
System.out.println(result); //按喜欢时间降序排列
result = jedis.zrevrange("user:1000:product:like", 0, -1);
System.out.println(result);
[003, 001, 004, 002]
[002, 004, 001, 003]
7. 消息通知
采用Hash结构对消息通知业务场景计数
//设置1条未读系统消息
jedis.hset("user:1000:message:num", "sysmessagenum", "1");
jedis.sadd("user:1000:message:content", "第一条未读信息");
//未读系统消息+1
jedis.hincrBy("user:1000:message:num", "sysmessagenum", 1);
jedis.sadd("user:1000:message:content", "第二条未读信息");
//查看所有消息通知数量
System.out.println(jedis.hgetAll("user:1000:message:num"));
//查看所有消息通知内容
System.out.println(jedis.smembers("user:1000:message:content"));
{sysmessagenum=2}
[第二条未读信息, 第一条未读信息]
Redis在电商中的实际应用-Java的更多相关文章
- REDIS 在电商中的实际应用场景(转)
1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等 ...
- TP5使用Redis处理电商秒杀
本篇文章介绍了ThinkPHP使用Redis实现电商秒杀的处理方法,具有一定的参考价值,希望对学习ThinkPHP的朋友有帮助! TP5使用Redis处理电商秒杀 1.首先在TP5中创建抢购活动所需要 ...
- Java生鲜电商平台-生鲜电商中商品类目、属性、品牌、单位架构设计与实战
Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战 说明:Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战经验分享 凡是涉及到购物,必然是建立在商品的基础 ...
- Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析
Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...
- SpringBoot+Neo4j在社交电商中,讲述你是怎么被绑定为下线的
上两篇文章我们主要讲解了Neo4j的基本知识以及Neo4j的基本使用,这篇文章我们就以实例来深入的理解一下,我们以社交电商中的绑定关系为例,使用SpringBoot+Neo4j来实现. Neo4j文章 ...
- Java生鲜电商平台-电商中"再来一单"功能架构与详细设计(APP/小程序)
Java生鲜电商平台-电商中"再来一单"功能架构与详细设计(APP/小程序) 说明:在实际的业务场景中(无论是TO B还是TO C)不管是休闲食品.餐饮.水果.日用百货.母婴等高频 ...
- 电商中的库存管理实现-mysql与redis
库存是电商系统的核心环节,如何做到不少卖,不超卖是库存关心的核心业务问题.业务量大时带来的问题是如何更快速的处理库存计算. 此处以最简模式来讨论库存设计. 以下内容只做分析,不能直接套用,欢迎 ...
- php+redis实现电商秒杀功能
这一次总结和分享用Redis实现分布式锁来完成电商的秒杀功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意思,若有误请谅解 ...
- 使用Redis搭建电商秒杀系统
背景 秒杀活动是绝大部分电商选择的低价促销.推广品牌的方式.不仅可以给平台带来用户量,还可以提高平台知名度.一个好的秒杀系统,可以提高平台系统的稳定性和公平性,获得更好的用户体验,提升平台的口碑,从而 ...
随机推荐
- UVALive - 5107 - A hard Aoshu Problem
题目链接:https://vjudge.net/problem/UVALive-5107 题目大意:用ABCDE代表不同的数字,给出形如ABBDE___ABCCC = BDBDE的东西: 空格里面可以 ...
- Linux安装搜狗输入法教程
最近开始学习linux 在安装输入法中遇到的一些问题,最终成功安装,也得益于网络上的前辈写的文章,现在将全部安装步骤以及遇到的一些问题总结如下: 基本上分三步走 1,添加fcitx的键盘输入法系统 ...
- 【设计模式】Bridge模式(桥接模式)
最近的一次面试中,被问到桥接模式,以前呢并没有很仔细的研究过这个设计模式,借此机会剖析一下. 先给出自己对这个模式理解后的源码: interface A{ void methodA(); } inte ...
- 正则替换内容中图片的src
string test = "<IMG src=\"http://www.baidu.com/upload/2009_11/09112110144808.jpg\" ...
- vue2 和 webpack 配置环境使用
http://blog.csdn.net/fungleo/article/details/53171052
- 快捷使用Node Inspector调试NodeJS
一:介绍 NodeJS开发有很多种调试方式,比如输出Log.WebStorm自带的调试器.Node Inspector等,其中Node Inspector是比较流行和被推荐的一种. 但是Node In ...
- websocket 70K连接测试
websocket 70K连接测试 最近使用socket.io做了一个实时应用,实时性.稳定性还是很让人满意的.如果拿socket.io来做小型应用,综合效率应该是最高的.但是网上少有socket.i ...
- Javascript随笔2(JQuery)
1.jQuery 语法 Tips: 通过 CDN(内容分发网络)引用JQuery:(link的引用最好放在script的引用之前) <script src="http://apps.b ...
- 1.three.js世界的4大要素
一.三大组件 在Three.js中,要渲染物体到网页中,我们需要3个组建:场景(scene).相机(camera)和渲染器(renderer).有了这三样东西,才能将物体渲染到网页中去. 记住关建语句 ...
- shell编程之echo printf 命令
shell中 echo 和printf 都能用作输出,printf可以算是echo的增强版 显示转义字符 echo \""abcdef\"" >>& ...