原创 MongoTemplate 操作 mongodb

1. 增加依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boo

原创 模擬mybatis動態生成Mapper實例的實現

動態代理常用的有兩種實現方式,一是java自帶的方式,一種是cglib提供的 mybatis使用cglib的動態代理生成mapper實例 這裏模擬一下兩種實現 常用的mybatis操作數據庫的方式如下: 定義一下接口,裏面的每個方式對應 *

原创 stream之flatMap實踐

1.權限分配案例 需求: 公司的管理系統定義了若干個角色 公司的每個部門領導對每個角色分配自己部門的若干權限   現在需要綜合每個角色的所有權限 @Data @AllArgsConstructor @NoArgsCon

原创 DoubleCache

DoubleCache 指的是本地+redis兩份緩存模式 本地緩存過期之後從redis讀取新數據 redis緩存過期時,從業務裏讀取新數據. 設計原理: 利用 loadingCache的過期刷新來實現異步線程自動刷新,而不阻塞當前數據返回

原创 redis的hmset樂觀鎖的實現

1.lua腳本(集成實現了樂觀鎖,hmset ,expire等) local key=KEYS[1]; local oldVerion=tonumber(ARGV[1]); local seconds=ARGV[2]; local

原创 根據配置RedisProperties自動獲取RedisConnectionFactory

#單點配置 spring.redis.host=192.168.1.1 spring.redis.port=6379 #哨兵配置 #spring.redis.sentinel.master=common #spring.re

原创 redis限流器的設計

1.定義註解 import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.R

原创 使用HystrixCommand封裝http請求

1.引入依賴   要排除hystrix-core裏的archaius-core,否則報錯 <dependency> <groupId>com.netflix.hystrix</groupId>

原创 自定義的最簡單的可回調的線程任務CallbackableFeatureTask(模仿google的ListenableFutureTask)

1.使該Task繼承Callable,Runable import java.util.concurrent.Callable; import java.util.function.Consumer; public class C

原创 通用的規則匹配算法(原創)(java+.net)

1.java裏可以使用Spring的 Spel或者Google的Aviator 如果使用 Aviator 則添加以下依賴 <dependency> <groupId>com.googlecode.avia

原创 redis緩存切面實現(支持緩存key的spel表達式)

1.定義註解 package com.g2.order.server.annotation; import java.lang.annotation.ElementType; import java.lang.annotation

原创 使用join和CountDownLatch來等待線程結束

1.join方法的實現 join只能在start()之後調用, 調用線程會等待子線程結束後再運行 public class ThreadJoinTest { public static void main(String[]

原创 使用Unsafe來實現自定義鎖

1.使用Unsafe類 import sun.misc.Unsafe; class UnsafePackage { private static Unsafe unsafe; static {

原创 rabbitMQ實現推遲隊列

一. 使用原生Api 1.RabbitMQ 相關 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-clie

原创 簡單分佈式鎖的實現

1. 定義接口 public interface RedisLock { String OK_CODE = "OK"; String OK_MULTI_CODE = "+OK"; /** *