最近实习单位的leader要求我调研一下RESTful风格的接口命名规范,然后把项目里的URL名整体规范化修改一下,以下是我调研之后的对于RESTful的了解。
REST是一个术语的缩写,REpresentational State Transfer,中文直译是“表征状态转移”。REST是一套风格约定,RESTful是它的形容词形式。比如一套实现了REST风格的接口,可以称之为RESTful接口。
目前,我们的项目里,基本只有GET和POST两种http方法,如下图,无疑浪费了 HTTP 协议的潜力,而 REST 则充分利用了 HTTP 规范中的方法,达到接口描述的语义化。
REST 描述了 HTTP 层里客户端和服务器端的数据交互规则;客户端通过向服务器端发送 HTTP(s)请求,接收服务器的响应,完成一次 HTTP 交互。这个交互过程中,REST 架构约定两个重要方面就是HTTP请求的所采用方法,以及请求的链接。
因此,REST 规范可以简单粗暴抽象成以下两个规则:
请求 API 的 URL 表示用来定位资源;
请求的 METHOD 表示对这个资源进行的操作;
以下将以这两 ...
1. 概述Rete 算法是卡内基梅隆大学的 Charles L.Forgy 博士在 1974 年发表的论文中所阐述的算法。 该算法提供了专家系统的一个高效实现。
Rete 在拉丁语中译为”net”(即网络)。Rete 是一种进行大量模式集合和大量对象集合间比较的高效方法,通过网络筛选的方法找出所有匹配各个模式的对象和规则。
其核心思想是用分离的匹配项构造匹配网络,同时缓存中间结果。以空间换时间。规则编译(rule compilation)和运行时执行(runtime execution)。
2. 规则编译(rule compilation)规则编译是指根据规则集生成高效推理网络的过程
2.1. 相关概念:
Fact(事实):对象之间及对象属性之间的关系
Rule(规则):是由条件和结论构成的推理语句,一般表示为if…Then。一个规则的if部分称为LHS(left-hand-side),then部分称为RHS(right hand side)。
Module(模式):就是指IF语句的条件。这里IF条件可能是有几个更小的条件组成的大条件。模式就是指的不能在继续分割下去的最小的原子条件。
...
Redis的通信协议是Redis Serialization Protocol,简称RESP,是二进制安全的,有如下特性:实现简单、快速解析、可读性好
RESP是Redis客户端和服务端通信的协议
Redis 客户端向服务端发送一组命令,服务端根据不同的命令回复不同类型的数据。但是协议的每部分都是以回车换行\r\n结尾。
1234567891011121314/**setabc123456*/ *3\r\n //消息一共有三行$3\r\n //第一行有字节数为3set\r\n //第一行的消息$3\r\n //第二行字节数为3abc\r\n //第二行的消息$6\r\n //第三行字节数为6123456\r\n //第三行的消息+OK\r\n //操作成功
123456789101112131415161718192021daichangyadeMacBook-Pro:~ daichangya$ redis-cli -h localhost -p 6379l ...
redis
未读前言同整数集合一样压缩列表也不是基础数据结构,而是 Redis 自己设计的一种数据存储结构。它有点儿类似数组,通过一片连续的内存空间,来存储数据。不过,它跟数组不同的一点是,它允许存储的数据大小不同。
一、压缩列表听到“压缩”两个字,直观的反应就是节省内存。之所以说这种存储结构节省内存,是相较于数组的存储思路而言的。我们知道,数组要求每个元素的大小相同,如果我们要存储不同长度的字符串,那我们就需要用最大长度的字符串大小作为元素的大小(假设是20个字节)。存储小于 20 个字节长度的字符串的时候,便会浪费部分存储空间。
数组的优势占用一片连续的空间可以很好的利用CPU缓存访问数据。如果我们想要保留这种优势,又想节省存储空间我们可以对数组进行压缩。
但是这样有一个问题,我们在遍历它的时候由于不知道每个元素的大小是多少,因此也就无法计算出下一个节点的具体位置。这个时候我们可以给每个节点增加一个lenght的属性。
如此。我们在遍历节点的之后就知道每个节点的长度(占用内存的大小),就可以很容易计算出下一个节点再内存中的位置。这种结构就像一个简单的压缩列表了。
二、Redis压 ...
Query Store可帮助您跟踪执行计划(含历史记录)、运行时统计信息。可以快速查找包含多个计划的新查询,识别无效计划并强制制定更好的计划。所有示例使用的是SQL Server 2016 CTP 2.2版。
一、 启用及配置Query Store1. 启用数据库属性 -> Query Store -> Enable
也可以使用T-SQL启用:
12ALTER DATABASE [DEMO_1] SET QUERY_STORE = ON;
2. 配置单击每个属性以查看其描述。可以在官方文档找到有关每个选项的详细信息
https://docs.microsoft.com/en-us/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-2017#Options
还可以使用T-SQL更改Query Store配置:
123456789ALTER DATABASE [DEMO_1] SET QUERY_STORE (OPERAT ...
介绍这是 OAuth 2.0 的用户指南。OAuth 1.0 与之大不相同,若有需求,请阅读 1.0 的用户指南。
本用户指南分为两个部分,一部分针对的是 OAuth 2.0 的提供方[译者注:通常指服务提供方],另一部分则是针对 OAuth 2.0 客户端。对于提供方和客户端双方来说,最好的示例代码是集成测试和示例应用。
OAuth 2.0 提供方OAuth 2.0 提供方通过某种机制来提供受 OAuth 2.0 保护的资源。其配置涉到确立 OAuth 2.0 客户端能做什么,是能独立访问受保护的资源,还是保护用户的利益。提供方通过管理和验证 OAuth 2.0 令牌达到目的,令牌就是用来访问受保护资源的。在某些情况下,提供方还必须为用户提供一个接口用于确认授权客户端访问受保护的资源(比如,确认页面)。
OAuth 2.0 提供方实现OAuth 2.0 的提供方实际涵盖两个角色,即认证服务 (Authorization Service) 和资源服务 (Resource Service),有时候它们会在同一个应用程序中实现。使用 Spring Security OAuth 的时候你可以 ...
spring
未读在Spring中执行存储过程的方法:
JDBC Template
NamedParameterJdbcTemplate
SimpleJdbcCall
JDBC Template示例:
1234567891011String procedureCall = "{call proc_name(?, ?)}";Map<String, Object> inParams = new HashMap<>();inParams.put("inParam1", 1);Map<String, Object> outParams = jdbcTemplate.call(con -> { CallableStatement callableStatement = con.prepareCall(procedureCall); callableStatement.setInt(1, (Integer) inParams.get("inParam1")); call ...
本文主要介绍在SpringBoot项目中如何使用Mybatis的一级、二级缓存,为了演示方便,本文的数据库采用H2内存数据库,数据库连接池默认使用SpringBoot2.X自带的hikariCP。正确的使用Mybatis缓存可以有效减少多余的数据库查询操作,节约IO。接下来我们从实践出发,看一看mybatis的一级,二级缓存如何使用,相关代码请查阅:https://github.com/zhengxl5566/springboot-demo.git
1、概念介绍
什么是一级缓存在日常开发过程中,经常会有相同的sql执行多次查询的情况,mybatis提供了一级缓存来优化这些查询,避免多次请求数据库。一级缓存在mybatis中默认是开启的并且是session级别,它的作用域为一次sqlSession会话。
什么是二级缓存相对于一级缓存,二级缓存的作用域更广泛,它不止局限于一个sqlSession,可以在多个sqlSession之间共享,事实上,它的作用域是namespace。mybatis的二级缓存默认也是开启的,但由于他的作用域是namespace,所以还需要在mapper.xml中开启 ...
**我并没有深入研究过字符编码, 本文是我在为解析器添加 Unicode 支持时参考 Unicode 13.0.0 Core Specification 所做的笔记, 如果你发现了任何错误或不妥的地方, 请在评论区帮助我改正它, 谢谢!
字符集的历史计算机只能处理二进制数字, 如果要处理文本, 就必须建立字符和二进制字节序列之间的关系. ASCII (American Standard Code for Information Interchange) 编码是基于拉丁字母的一套编码系统, 也是最简单的字符集 (character set), 它建立了字符和代码单元 (0 ~ 127 的整数) 之间的映射关系表. 例如 0110 0001 (97) 对应 'a', 0010 0100 (36) 对应 '$', 0010 1000 (40) 对应 '(' 等等.
ASCII 字符集很容易理解, 但问题是, 它能表示的字符数量太少了, ASCII 字符集只包括基本拉丁字母, 阿拉伯数字, 英式标点符号和少许控制字符. 要处理其他语言的文字, 一 ...
spring-cloud
未读本文介绍Zuul路由的源码以及实现动态路由的几种方式,路由信息可以来自Properties文件、DB、Apollo等。
可以阅读 Spring Cloud源码学习之Zuul 简要了解路由源码流程。
本文基于 Spring Cloud Finchley.SR1,Spring Boot 2.0.6.RELEASE。
路由源码本文基于下图场景做演示,文中代码来自源码,但存在大幅删减。
请求达到ZuulServlet后,ZuulServlet 组织了路由的处理逻辑,如下:
12345678public void service(servletRequest, servletResponse) { // 执行 "pre" 类型 ZuulFilter preRoute(); // 执行 "route" 类型 ZuulFilter route(); // 执行 "post" 类型 ZuulFilter postRoute();}
预处理pre 类型 ZuulFilte r中,PreDecorat ...
