39、生鲜电商平台-redis缓存在商品中的设计与架构
说明:Java开源生鲜电商平台-redis缓存在商品中的设计与架构。
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}
[第二条未读信息, 第一条未读信息] Java开源生鲜电商平台-redis缓存在商品中的设计与架构(源码可下载),如果需要下载的话,可以在我的github下面进行下载。
群号:168096884

转载自-- https://www.cnblogs.com/jurendage/p/9181380.html
39、生鲜电商平台-redis缓存在商品中的设计与架构的更多相关文章
- Java生鲜电商平台-redis缓存在商品中的设计与架构
Java生鲜电商平台-redis缓存在商品中的设计与架构 说明:Java开源生鲜电商平台-redis缓存在商品中的设计与架构. 1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而 ...
- Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载)
Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载) 说明:Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构,我采用以下三种维度来讲解 1. 代码层面. 2. 数 ...
- Java生鲜电商平台-高可用微服务系统如何设计?
Java生鲜电商平台-高可用微服务系统如何设计? 说明:Java生鲜电商平台高可用架构往往有以下的要求: 高可用.这类的系统往往需要保持一定的 SLA,7*24 时不间断运行不代表完全不挂,而是有一定 ...
- Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计
Java生鲜电商平台-商品分类表和商品类型表的区别与数据库设计 二者服务的对象不一样 目的也是不一样的 商品分类是为商品服务的 用来管理商品 商品类型是为扩展属性服务的 用来管理属性 举例:[转] ...
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...
- Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战
Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战 说明:Java生鲜电商平台-小程序或者APP优惠券的设计与源码实战,优惠券是一种常见的促销方式,在规定的周期内购买对应商品类型和额度的商品 ...
- Java生鲜电商平台-小程序或者APP拼团功能设计与架构实战
Java生鲜电商平台-小程序或者APP拼团功能设计与架构实战 说明:Java生鲜电商平台拼团是拉新引流的利器,将拼团运用到极致的就是拼多多,前期通过选取性价比高.实用性强的商品进行拼团,在社交圈(主要 ...
- Java生鲜电商平台-缓存架构实战
Java生鲜电商平台-缓存架构实战 说明:在Java生鲜电商中,缓存起到了非常重要的作用,目前整个项目中才用的是redis做分布式缓存. 缓存集群 缓存集群存在的问题 1.热key 缓存集群中的某个k ...
- Java开源生鲜电商平台-系统架构与技术选型(源码可下载)
Java开源生鲜电商平台-系统架构与技术选型(源码可下载) 1. 硬件环境 公司服务器 2. 软件环境 2.1 操作系统 Linux CentOS 6.8系列 2.2 反向代理/web服务器 ...
随机推荐
- poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
题目地址:http://poj.org/problem?id=3264 Sample Input 6 3 1 7 3 4 2 5 1 5 4 6 2 2 Sample Output 6 3 0分析:标 ...
- 转 Java Classloader机制解析
转 Java Classloader机制解析 发表于11个月前(2014-05-09 11:36) 阅读(693) | 评论(0) 9人收藏此文章, 我要收藏 赞1 慕课网,程序员升职加薪神器,点 ...
- matlab产生很多个相同的数字
如产生100行1列的0.5: ones(100,1)*0.5:
- 分享知识-快乐自己:Shiro 退出登陆清空缓存实现
shiro是一个被广泛使用的安全层框架,通过xml配置方式与spring无缝对接,用户的登陆/退出/权限控制/Cookie等管理系统基础功能交给shiro来管理. 一般,在JavaWEB管理平台系统时 ...
- 十八 Django框架,生成二维码
用Python来生成二维码,需要qrcode模块,qrcode模块依赖Image 模块,所以首先安装这两个模块 生成二维码保存图片在本地 import qrcode img = qrcode.make ...
- scanf ---------未完待续
1.不可读入空格 #include<iostream> #include<stdio.h> using namespace std; int main() { char c[5 ...
- java - BigDecimal的format()方法和setScale()方法格式字符串
1.BigDecimal.setScale()方法用于格式化小数点 setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接删 ...
- luogu1754卡特兰数
卡特兰数 打表 滑稽 #include<iostream> #include<cstdio> #include<algorithm> #include<cst ...
- ACM学习历程—Rotate(HDU 2014 Anshan网赛)(几何)
Problem Description Noting is more interesting than rotation! Your little sister likes to rotate thi ...
- oracle单实例12.2.0.1安装
说明:本文描述oracle linux 6.8 安装 oracle 12.2.0.1 0. 查看操作系统版本 [root@12c01 ~]# cat /etc/os-release NAME=&quo ...