本系列教程内容提要

Java工程师之Redis实战系列教程教程是一个学习教程,是关于Java工程师的Redis知识的实战系列教程,本系列教程均以解决特定问题为目标,使用Redis快速解决在实际生产中的相关问题,为了更方便的与大家一起探讨与学习,每个章节均提供尽可能详细的示例源码及注释,所有示例源码均可在javacourse-redis-in-action找到相关帮助!

什么是大型网站?

从技术上的角度来看,大型网站的实现是能够应对各种突发事件,能够处理海量数据等因素.... 这里我们抓住“处理海量数据”这一点来进行探讨学习。

何提高网站处理海量数据?

  • 减少用户请求体大小
  • 响应数据进行缓存

我们应该怎么做?

第一步:拒绝cookie,使用token令牌登录 github示例源码下载

Cookie是常见的记录用户会话的解决方案,但在某些场景下其并不适用,如前后端分离,如Cookie体积大时影响请求速率。

  • 用户发起操作请求
  • Redis校验是否拥有TOKEN令牌
  • 没有令牌跳转登录
  • 登录成功生成TOKEN保存至Redis
  • ......

Redis数据结构

核心源码

@RequestMapping("/register")
public String register(User user, Model model) {
userFactory.put(user.getUsername(), user);
model.addAttribute("result", "注册成功!");
return "RegAndLog";
} @RequestMapping("/login")
public String login(User user, Model model, @RequestParam(required = false) String token, HttpServletRequest request) {
Boolean exists = jedis.exists("login:" + token);
String clientIp = getClientIp(request);
String url = getURL(request);
if (!exists) {
User result = userFactory.get(user.getUsername());
if (result != null && user.getUsername().equals(result.getUsername()) && user.getPassword().equals(result.getPassword())) {
/*将用户登录缓存到Redis*/
String tokenUUID = UUID.randomUUID().toString();
updateToken(jedis, tokenUUID, result, clientIp, url);
/*获取用户的登录记录*/
Set<String> IPList = jedis.zrange("recent:" + user.getUsername(), 0, -1);
/*获取用户最新访问的页面*/
Set<String> URLList = jedis.zrange("viewed:" + user.getUsername(), 0, -1);
model.addAttribute("record", IPList);
model.addAttribute("URLList", URLList);
model.addAttribute("result", "登录成功!TOKEN为" + tokenUUID + ",30秒后过期.....30秒内可使用Token登录");
return "RegAndLog";
}
model.addAttribute("result", "登录失败!");
return "RegAndLog";
}
model.addAttribute("result", "使用Token登录成功!");
return "RegAndLog";
}

各位友友运行本小结源码:访问 http://localhost:8080/cookie/LogOrReg

第二步:拒绝cookie,使用Redis构造购物车 github示例源码下载

对于一个购物网站来说,购物车就是一个必不可少的功能,从长远来看对用户购物车的数据的统计与分析有利于进行大数据的分析,提高网站的营业额。但在服务端每次解析,校验,设置Cookie,会增加程序的响应时间。同样;随着Cookie体积的增大,也会增加用户请求时间,所以我们在Redis上进行包存购物车。

Redis数据接结构

核心源码

    @GetMapping("/addCart")
public String addCart(Item item, Model model) {
User user = getUser();
addTOCart(jedis, user, item);
Map<String, String> cart = getCart(jedis, user);
model.addAttribute("result", "添加购物车成功!");
model.addAttribute("cartList", cart);
return "ProductList";
}

各位友友运行本小结源码:访问 http://localhost:8080/cart/productlist.html

第三步:缓存网页数据,提高网页响应 github示例源码下载

对于我们网站的大多数网页,一般都很少改动,例如商品页面,商品的标题和商品的介绍基本上不会改动,但是商品的剩余数量你又不得不去数据库实时查询,这将会导致“用户每打开或刷新一次网页,你不得不去数据库查询一次数据”,对于一般的关系数据库数据库每秒处理200~2000上限,就成为了你网站的瓶颈所在。

Reids数据结构图

核心源码

    @RequestMapping("/testCacheForItem/{itemname}")
public String testCacheForItem(Model model, @PathVariable(required = true, name = "itemname") String itemname) {
/*模拟数据*/
Item item = new Item(itemname, itemname + "这是商品的介绍" + itemname, new Random().nextInt(10));
/*判断是否被缓存*/
Boolean hexists = jedis.exists("cache:" + itemname);
if (!hexists) {
Gson gson = new Gson();
String s = gson.toJson(item);
jedis.set("cache:" + itemname, s);
model.addAttribute("s", s);
model.addAttribute("result", "第一次访问,已经加入Redis缓存");
return "CacheItem";
}
String s = jedis.get("cache:" + itemname);
model.addAttribute("s", s);
model.addAttribute("result", "重复访问,从Redis中读取数据");
return "CacheItem";
}

各位友友运行本小结源码:访问 http://localhost:8080/cache/testCacheForItem/吃鸡神枪



本章小结

对于真正实现一个能处理海量数据的购物网站来说,我们做的实在是太简单了...是使用各种语言和工具的相互配置,程序逻辑的优化,才能构建出一个真正的能处理海量数据的网站。当然我们做的也不差....hhhh

Redis构建处理海量数据的大型购物网站的更多相关文章

  1. <转>大型分布式网站术语浅析

    夜半睡起看书,看到一篇关于分布式网站性能优化术语的文章,个人觉得不错,分享出来... 原文地址:大型分布式网站术语分析 一.I/O优化 1.增加缓存,减少磁盘的访问次数. 2.优化磁盘的管理系统,设计 ...

  2. redis实战笔记(2)-第2章 使用 Redis构建Web应用

    第2章 使用 Redis构建Web应用 本章主要内容   1.登录cookie 2.购物车cookie 3.缓存生成的网页 4.缓存数据库行 5.分析网页访问记录   本章的所有内容都是围绕着发现并解 ...

  3. css3购物网站商品文字提示实例

    css3购物网站商品文字提示实例先来看效果图:<ignore_js_op> 当鼠标划过图片时,有着泰迪熊黑色长方形的背景就会出现.来看HTML5+CSS3代码: <!DOCTYPE ...

  4. 大型B2C网站高性能可伸缩架构技术探秘

    大型B2C网站高性能可伸缩架构技术探秘 2010-07-21 08:51 狂放不羁 JavaEye 字号:T | T 向您介绍大型B2C网站高性能的网站架构技术,包括缓存的使用.应用程序和数据库的拆分 ...

  5. redis实战笔记(6)-第6章 使用 Redis构建应用程序组件

    本章主要内容   1.构建两个前缀匹配自 动补全程序 2.通过构建分布式锁来提高性能 3.通过开发计数信号量来控制并发 4.构建两个不同用途的任务队列 5.通过消息拉取系统来实现延迟消息传递 6.学习 ...

  6. 基于Spring+Spring MVC+Mybatis的B2C购物网站

    代码地址如下:http://www.demodashi.com/demo/12935.html 准备工作 当前项目运行的系统环境是MacOS,已经测试可以正常运行,并且之前开发的时候也在Windows ...

  7. [CareerCup] 10.2 Data Structures for Large Social Network 大型社交网站的数据结构

    10.2 How would you design the data structures for a very large social network like Facebook or Linke ...

  8. nginx+lua+redis构建高并发应用(转)

    nginx+lua+redis构建高并发应用 ngx_lua将lua嵌入到nginx,让nginx执行lua脚本,高并发,非阻塞的处理各种请求. url请求nginx服务器,然后lua查询redis, ...

  9. springMVC+angular+bootstrap+mysql的简易购物网站搭建

    springMVC+angular+bootstrap+mysql的简易购物网站搭建 介绍 前端的css框架用了bootstrap, 以及bootstrap的JS组件, 以及很好用的angular(a ...

随机推荐

  1. eclipse的Maven项目pom.xml错误信息提示missingxxxjar解决方案

    今天在学习的时候需要用到maven工程,当时找完所依赖的包的三要素就开始下载了,写完pom.xml需要一段时间下载这些jar包,就躺在一边等了.可能是笔记本有节能功能这个原因导致我醒来时断网发现满屏m ...

  2. 【F12】网络面板

    使用网络面板了解请求和下载的资源文件并优化网页加载性能 (1)网络面板基础 测量资源加载时间 使用 Network 面板测量您的网站网络性能. Network 面板记录页面上每个网络操作的相关信息,包 ...

  3. BaaS后端即服务 - 概念篇

    摘要: 什么是BaaS? BaaS(Backend as a Service)是一种新型的云服务,旨在为移动和Web应用提供后端云服务,包括云端数据/文件存储.账户管理.消息推送.社交媒体整合等.Ba ...

  4. static、extern分析

    1.extern extern在变量声明中有这样一个作用:你要在demo2.cpp中引用demo1.cpp中的一个全局变量,就要在demo2.h中用extern来声明这个全局变量(或者在demo1.h ...

  5. e1086. if/else语句

    The if statement encloses some code which is executed only if a condition is true. The general synta ...

  6. 利用KEGG的API获取基因对应的pathway 信息

    KEGG 官网提供了API, 可以方便的访问KEGG 数据库中的内容,链接如下: http://www.kegg.jp/kegg/rest/keggapi.html 利用API可以得到某一个基因参与的 ...

  7. R语言绘图布局

    在R语言中,par 函数可以设置图形边距,其中oma 参数设置outer margin, mar 参数设置margin, 这些边距有什么不同呢,通过box函数可以直观的看到 box 默认在当前图形绘制 ...

  8. ASP.NET WebApi 路由配置【转】

    一.路由介绍 ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们 ...

  9. POJ 3211 Washing Clothes 背包题解

    本题是背包问题,可是须要转化成背包的. 由于是两个人洗衣服,那么就是说一个人仅仅须要洗一半就能够了,由于不能两个人同一时候洗一件衣服,所以就成了01背包问题了. 思路: 1 计算洗完同一颜色的衣服须要 ...

  10. UGUI 的多分辨率适配

    1.Canvas的属性配置 2.Canvas Scaler的属性配置 3.根据不同的屏幕的比例动态修改缩放基准 void Start () { float standard_width = 960f; ...