redis高并发原理

显然,编写URL缩短服务是新的“世界,您好! ”在物联网/微服务/时代的世界中。 一切始于在45行Scala中的URL缩短服务-整洁的Scala,以Spray和Redis进行调味以进行存储。 随后,在35行Clojure中使用了url缩短服务,在Haskell的43行中甚至使用了URL Shortener 。 所以我内心的反时髦人士问:用Java语言要花多长时间? 但是,出于善意,不是普通的Java。 带有Spring Data Redis的Spring Boot是一个很好的起点。 我们需要的只是一个处理GET和POST的简单控制器:

import com.google.common.hash.Hashing;
import org.apache.commons.validator.routines.UrlValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.*;
import java.nio.charset.StandardCharsets;@org.springframework.boot.autoconfigure.EnableAutoConfiguration
@org.springframework.stereotype.Controller
public class UrlShortener {public static void main(String[] args) {SpringApplication.run(UrlShortener.class, args);}@Autowired private StringRedisTemplate redis;@RequestMapping(value = "/{id}", method = RequestMethod.GET)public void redirect(@PathVariable String id, HttpServletResponse resp) throws Exception {final String url = redis.opsForValue().get(id);if (url != null)resp.sendRedirect(url);elseresp.sendError(HttpServletResponse.SC_NOT_FOUND);}@RequestMapping(method = RequestMethod.POST)public ResponseEntity<String> save(HttpServletRequest req) {final String queryParams = (req.getQueryString() != null) ? "?" + req.getQueryString() : "";final String url = (req.getRequestURI() + queryParams).substring(1);final UrlValidator urlValidator = new UrlValidator(new String[]{"http", "https"});if (urlValidator.isValid(url)) {final String id = Hashing.murmur3_32().hashString(url, StandardCharsets.UTF_8).toString();redis.opsForValue().set(id, url);return new ResponseEntity<>("http://mydomain.com/" + id, HttpStatus.OK);} elsereturn new ResponseEntity<>(HttpStatus.BAD_REQUEST);}
}

该代码很好地自我描述,并且在功能上等同于Scala中的版本。 我没有尝试过太多的压缩,以使行数尽可能的短,上面的代码很典型,只有很少的细节:

  • 我通常不使用通配符导入
  • 我不使用完全限定的类名(我承认我想保存一个import行)
  • 我用if括号包围if else用括号括起来
  • 我几乎从不使用场注入,这是控制家族反转中最丑陋的兄弟。 相反,我会去让构造函数允许使用模拟的Redis进行测试:
@Autowired
private final StringRedisTemplate redis;public UrlShortener(StringRedisTemplate redis) {this.redis = redis;
}

我最苦恼的事情是……获取原始的完整URL。 基本上,我需要.com或port之后的所有内容。 没有流血的方式(既没有servlet,也没有Spring MVC),因此笨拙的getQueryString()摆弄着。 您可以按以下方式使用服务-创建较短的URL:

$ curl -vX POST localhost:8080/https://www.google.pl/search?q=tomasz+nurkiewicz> POST /https://www.google.pl/search?q=tomasz+nurkiewicz HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< Content-Type: text/plain;charset=ISO-8859-1
< Content-Length: 28
< Date: Sat, 23 Aug 2014 20:47:40 GMT
<
http://mydomain.com/50784f51

通过较短的网址重定向:

$ curl -v localhost:8080/50784f51> GET /50784f51 HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 302 Found
< Server: Apache-Coyote/1.1
< Location: https://www.google.pl/search?q=tomasz+nurkiewicz
< Content-Length: 0
< Date: Sat, 23 Aug 2014 20:48:00 GMT
<

为了完整起见,这是Gradle中的一个构建文件(maven也可以使用),在所有以前的解决方案中都跳过了:

buildscript {repositories {mavenLocal()maven { url "http://repo.spring.io/libs-snapshot" }mavenCentral()}dependencies {classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.1.5.RELEASE'}
}apply plugin: 'java'
apply plugin: 'spring-boot'sourceCompatibility = '1.8'repositories {mavenLocal()maven { url 'http://repository.codehaus.org' }maven { url 'http://repo.spring.io/milestone' }mavenCentral()
}dependencies {compile "org.springframework.boot:spring-boot-starter-web:1.1.5.RELEASE"compile "org.springframework.boot:spring-boot-starter-redis:1.1.5.RELEASE"compile 'com.google.guava:guava:17.0'compile 'org.apache.commons:commons-lang3:3.3.2'compile 'commons-validator:commons-validator:1.4.0'compile 'org.apache.tomcat.embed:tomcat-embed-el:8.0.9'compile "org.aspectj:aspectjrt:1.8.1"runtime "cglib:cglib-nodep:3.1"
}tasks.withType(GroovyCompile) {groovyOptions.optimizationOptions.indy = true
}task wrapper(type: Wrapper) {gradleVersion = '2.0'
}

实际上也是42行...这就是整个应用程序,没有XML,没有描述符,没有安装。

对于最短,最模糊的工作代码,我不认为此练习只是一个虚拟的代码。 带有Redis后端的URL缩短器Web服务是给定语言和生态系统的语法和功能的有趣展示。 有趣的是,还有很多算法问题,例如在Rosetta代码中发现的。 这也是编写REST服务的一个很好的最低模板。

原始Scala实现的一个重要功能(包括该实现)在所有实现中都以某种方式被默默地忘记了,它是非阻塞的。 HTTP和Redis的访问是事件驱动的(React,没事,我说),所以我想它可以同时处理客户数以万计。 阻止由Tomcat支持的控制器无法实现这一点。 但是,您仍然必须承认,用Java(甚至不是Java 8!)编写的这种服务非常简明,易于遵循和简单明了-其他解决方案都不是可读的(当然这是主观的)。

等待别人!

翻译自: https://www.javacodegeeks.com/2014/08/url-shortener-service-in-42-lines-of-code-in-java-spring-boot-redis.html

redis高并发原理

redis高并发原理_Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis...相关推荐

  1. java spr_Java中的42行代码中的URL缩短器服务(Java(?!)Spring Boot + Redis

    java spr 显然,编写URL缩短服务是新的" Hello,world! "在IoT /微服务/时代的世界中. 一切始于在45行Scala中的URL缩短服务 -整洁的Scala ...

  2. Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis

    显然,编写URL缩短服务是新的" Hello,world! "在IoT /微服务/时代的世界中. 一切始于在45行Scala中的URL缩短服务 -整洁的Scala,以Spray和R ...

  3. java连接redis不稳定_java相关:jedispool连redis高并发卡死的问题

    java相关:jedispool连redis高并发卡死的问题 发布于 2020-6-30| 复制链接 本篇文章主要介绍了jedispool连redis高并发卡死的问题,小妖觉得挺不错的,现在分享给大家 ...

  4. Redis高并发点赞

    1.redis高并发点赞就是保护数据库进行的操作 原理:就是将点赞数和点赞用户先存入redis中(防止大量用户数据对数据库的操作),通过定时任务在将数据取出来. 操作: 1.先将前端的数据存入redi ...

  5. 解决redis高并发问题的几种思路

    解决redis高并发问题的几种思路 1:布隆过滤器 首先,布隆过滤器能解决绝大部分恶意攻击的请求,比如我们数据库中的id通常都设为自增的,是有一定范围大小的,如果有黑客恶意用数据库中没有的id一直访问 ...

  6. 高并发专题--5:关于redis高并发你晓得多少?

    关于redis高并发你晓得多少? 1.redis高并发跟整个系统的高并发之间的关系 2.redis不能支撑高并发的瓶颈在哪里? 3.如果redis要支撑超过10万+的并发,那应该怎么做? 4.redi ...

  7. redis高并发抽奖

    2019独角兽企业重金招聘Python工程师标准>>> redis高并发抽奖 代码有点缭乱,没时间整理,如果有误还请留言斧正.现在进入正题. 一.思路 1.奖品: 奖品分为奖品id( ...

  8. cpu多核 node 单线程_详解node单线程实现高并发原理与node异步I/O

    一.node单线程实现高并发原理 众所周知nodejs是单线程且支持高并发的脚本语言.可为什么单线程的nodejs可以支持高并发呢?很多人都不明白其原理,下面我来谈谈我的理解: 1. node的优点: ...

  9. cpu多核 node 单线程_node单线程支撑高并发原理(node异步I/O)

    一.node单线程实现高并发原理 众所周知nodejs是单线程且支持高并发的脚本语言.可为什么单线程的nodejs可以支持高并发呢?很多人都不明白其原理,下面我来谈谈我的理解: 1. node的优点: ...

最新文章

  1. 腾讯新公开这张「图」,我看了眼,上面写满「智驾」二字
  2. linux系统无法启动提示give root password for maintenance的解决方法
  3. r 保留之前曲线_R简单数据处理和分析
  4. Android 开发之多线程处理、Handler 详解
  5. flowable实战(九)flowable数据库表中流程实例、活动实例、任务实例三者之间关系分析
  6. 搭建自己的Nuget服务器
  7. c#ftp操作全解:创建删除目录,上传下载文件,删除移动文件,文件改名,文件目录查询
  8. 2022年考研计算机-数据库原理8-11章
  9. Android之BInder分析
  10. redis缓存数据库技术
  11. 软件测试报告模板_详细版
  12. 宇视摄像机如何快速计算存储容量?
  13. js 微信小程序根据身份证号计算年龄
  14. php qq邮箱群发
  15. C++字符串常量总结(包含表达式必须是可修改的左值问题)
  16. Linux的markdown笔记软件,Markdown工具满天飞,哪一款适合用印象笔记的你?
  17. for update造成的锁表以及解锁
  18. P2P流媒体开源项目汇总与简述
  19. JAVA支付宝和微信(APP支付,提现,退款)
  20. 十字路头的拼音及解释

热门文章

  1. 年度编程语言最佳候选人:Kotlin vs. C
  2. 使用 flex 实现 5 种常用布局
  3. 流利的验证组件:FluentValidation
  4. 动辄数百TB级数据的分析平台 海量并发无压力
  5. Android Studio 第四十九期 - Sqlite数据库四种写法
  6. CentOS 7.2 安装教程
  7. 迷你MVVM框架 avalonjs 学习教程14、事件绑定
  8. 如何汉化DNN--中文语言包的使用
  9. python3 报错 TypeError: load() got an unexpected keyword argument ‘encoding‘ 解决方法
  10. linux 修改 ko文件内核版本号