Guava

Activiti流程引擎配置实战

*爱你&永不变心* 提交于 2020-04-14 12:04:58
【推荐阅读】微服务还能火多久?>>> 一 pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath/> </parent> <groupId>com.syc.activiti</groupId> <artifactId>activiti6-helloworld</artifactId> <version>1.0-SNAPSHOT</version> <dependencies>

高可用服务设计之如何应对缓存穿透

╄→尐↘猪︶ㄣ 提交于 2020-04-14 11:53:44
【推荐阅读】微服务还能火多久?>>> 背景 用户中心是 授权逻辑与用户信息相关逻辑 构建的应用。分布式系统中,大多数业务都需要和用户中心打交道,为了保证用户中心服务的高可用,避免不了做缓存、导入搜索引擎从而降低数据库的压力。然而有些不经过用户中心授权的业务场景查询用户中心的数据,可能引发大量无效的查询,发生缓存穿透,直接对搜索引擎和数据库造成压力。如何解决用户中心缓存穿透的问题呢?接下来就着重说一下布隆过滤器是怎么 “隔档”这些无效查询的 。 缓存穿透 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到对应 key 的 value ,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库 。 布隆过滤器 基本概念 布隆过滤器( Bloom Filter )是 1970 年由布隆提出的。它实际上是一个很长的二进制向量 ( 位图 ) 和一系列随机映射函数(哈希函数)。 布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 特点 空间效率高 和查询效率高 的概率型数据结构。 对于一个元素检测是否存在的调用, BloomFilter 会告诉调用者两个结果之一:可能存在或者一定不存在。 一个很长的二进制向量 (位数组

springboot + aop的最佳实践,再也不怕双击666

点点圈 提交于 2020-04-13 17:03:19
【今日推荐】:为什么一到面试就懵逼!>>> 唠唠叨叨 复工不到一个月疯狂的加班中,最近没什么时间写博客更文有点慢,好在做的项目中不全是增删改的业务逻辑,还是有一些比较有意思实用的技术点,所以整理出来分享给大家。和那些搞高端技术的大佬比不了,咱就是个还在一线搬砖的码农。 有没有遇到过这种情况:由于网速等原因,网页响应很慢,提交一次表单后发现服务久久没响应,然后你就疯狂点击提交按钮(12306就经常被这样怒怼),如果做过防重复提交还好,否则那是什么级别的灾难就不好说了。。。 今天主要是用 自定义注解、 AOP、 · Guava 包中Cache来生成一种本地锁,来达到的防重复提交效果,整体的实现比较简单,没有什么太大的难度,代码也是比较少,,由于是基于内存的缓存, 因此这种实现方式并不适用于分布式服务 。旨在给大家介绍一种实现防重复提交的方案,要是有什么说的不对的地方大家温柔一点撕,毕竟人家还是个20出头30郎当岁的孩子。 Guava是什么? guava 包是个啥?做过Java的小伙伴应该多少都有所了解,它是 google “嫌弃” JAVA 自带的类库不好用,自行研发的一套工具包,对JDK工具做了很好的拓展。例如:并发[ Concurrency ]、缓存[ Caches ]、 函数式风格[ Functional idioms ]、 字符串处理[ Strings ]等。 总之一句话

布隆过滤器原理

霸气de小男生 提交于 2020-04-06 12:13:21
开发一个电商项目,因为数据量一直在增加(已达亿级),所以需要重构之前开发好的秒杀功能,为了更好的支持高并发,在验证用户是否重复购买的环节,就考虑用布隆过滤器。 也顺便更加深入的去了解下布隆过滤器的原理,感觉还是蛮有意思的,这一连串的公式不静下心来思考,很容易被绕晕。 一、概述 1、什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的 概率型数据结构 ,特点是 高效地插入和查询 。根据查询结果可以用来告诉你 某样东西一定不存在或者可能存在 这句话是该算法的核心。 相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的,同时布隆过滤器还有一个缺陷就是 数据只能插入不能删除 。 2、数据如何存入布隆过滤器 布隆过滤器是 由一个很长的bit数组和一系列哈希函数组成的 。 数组的每个元素都只占1bit空间,并且每个元素只能为0或1。 布隆过滤器还拥有k个哈希函数,当一个元素加入布隆过滤器时,会使用k个哈希函数对其进行k次计算,得到k个哈希值,并且根据得到的哈希值,在维数组中把对应下标的值置位1。 判断某个数是否在布隆过滤器中,就对该元素进行k次哈希计算,得到的值在位数组中判断每个元素是否都为1,如果每个元素都为1,就说明这个值在布隆过滤器中。 3、布隆过滤器为什么会有误判 当插入的元素越来越多时

响应微博小秘书倡议 连夜加急撸出头像变灰小工具之开发历程

本小妞迷上赌 提交于 2020-04-06 09:14:27
昨天看到了 微博小秘书关于全国性悼念活动倡议 ,我非常支持这个倡议。 因为修改灰色头像会有一定技术门槛,于是思考能否开发一个小工具方便大家使用。 考虑到第二天就是哀悼日,准备夜间快速开发上线。 0X00 废话少说先上东西 有兴趣的老哥可以访问: http://smartding.top:81/ 或者 http://smartding.top:8080/ 因为暂时无法备案,所以只能采用带端口或者纯 IP 的方式访问,有点郁闷。 小工具里面记录了项目历程,有兴趣可以阅读, 0X01 选型 因为时间相当有限,技术选型必须选择较为成熟的脚手架型框架。 基于这样的原则出发,前端框选用 Element.io,Element.io 优势是支持 CDN 引用,你甚至不需要创建一个 Webpack 项目,提供的组件既有颜值也非常稳定可靠,文档也十分齐全。后端框架则采用 Springboot,通过简单引入 Springboot 依赖就可以轻松创建一个 Java web 项目。 0X02 核心算法 技术选型完成之后,开始考虑核心算法也就是如何把彩色图片转为灰度图片。我没有图片处理经验,但经过摸索大致了解了转换方法。转换算法其实就是下面的数学公式: gray(red, green, blue) = (red + green + blue)/3 主要思路是把求得每个像素的RGB 三色平均值

IDEA Gradle配置与使用

痴心易碎 提交于 2020-04-05 22:00:32
1.安装Gradle,并添加环境变量。 https://www.cnblogs.com/NyanKoSenSei/p/11458953.html 2.在IDEA中设置Gradle: 3.选中项目中的.gradle文件,右键选择"Import Gradle Project"。 4.接下来会弹出一个界面,Import Module From Gradle。 注意:Create separate module per source set这个不要勾选,不然一个module会分成多个部分。 5.成功导入依赖后,可以通过IDEA最右边的侧栏进行快捷操作。 点击刷新按钮,可以重新导入所有的依赖。 点击+号,并选中相关的.gradle文件,可以导入新的module。 6.在打开项目时,如果module还缺少某些依赖,可以直接在对应的类里面按alt+enter自动导入。 也可以点击File,打开Project Structure里面,点击Modules,点击dependencies,点击+号,导入jar包或者其他的module,如下所示: 7.在.gradle文件中添加新依赖,dir表示的是文件名,include中为jar包,如下: dependencies { compile fileTree(dir: trd, include: 'guava*.jar') compile fileTree

How to detect circular reference in a Tree?

我的梦境 提交于 2020-03-23 08:18:05
问题 I have a Node class as follows: public class Node{ Object data; List<Node> children; } I need to traverse this tree in post order and I am using Guava TreeTraverser for for the same. TreeTraverser<Node> treeTraverser = new TreeTraverser<Node>() { @Override public Iterable<Node> children(Node node) { return node.children; } }; treeTraverser.postOrderTraversal(node); The catch is that there chances that the given tree could have circular dependencies(means it could be a cyclic graph). What

How to detect circular reference in a Tree?

人走茶凉 提交于 2020-03-23 08:18:02
问题 I have a Node class as follows: public class Node{ Object data; List<Node> children; } I need to traverse this tree in post order and I am using Guava TreeTraverser for for the same. TreeTraverser<Node> treeTraverser = new TreeTraverser<Node>() { @Override public Iterable<Node> children(Node node) { return node.children; } }; treeTraverser.postOrderTraversal(node); The catch is that there chances that the given tree could have circular dependencies(means it could be a cyclic graph). What

Ways to persist Guava Graph

雨燕双飞 提交于 2020-03-21 19:38:27
问题 I'm using the common.graph from Google Guava in Version 21.0. It suits very well to my usecase without one aspect: Persistence. The graph seems to be in-memory only. The graph-classes does not implement Serializable , it was explained in this issue posts. Google describes three models to store the topology. The third option is: a separate data repository (for example, a database) stores the topology But that's all. I didn't found any methods in the package to apply a separate data repository.