实例介绍
Bucket4j是一个基于Java的限流库,它使用Token-Bucket算法实现。Bucket4j具有非常高的精确度,所有的计算都在整数算术中执行,这可以避免由舍入而引起的计算错误。Bucket4j还提供了丰富的配置管理功能,可以在运行时更改桶的配置。除了基本功能外,Bucket4j还支持在JVM集群中实现限流,并支持异步API。Bucket4j支持多种后端,例如JCache API、Hazelcast和Redis等。
【实例截图】
【核心代码】
文件清单
└── bucket4j-d24d02012dc3267f724381b581d255b96c0b3317
├── asciidoc
│ ├── pom.xml
│ └── src
│ └── main
│ └── docs
│ └── asciidoc
│ ├── about.adoc
│ ├── basic
│ │ ├── basic-functionality-index.adoc
│ │ ├── builder-api.adoc
│ │ ├── concepts.adoc
│ │ ├── configuration-replacement.adoc
│ │ ├── limitations.adoc
│ │ ├── listener.adoc
│ │ ├── production-generic-checklist.adoc
│ │ ├── quick-start.adoc
│ │ └── verbose-api.adoc
│ ├── distributed
│ │ ├── concepts.adoc
│ │ ├── distributed-checklist.adoc
│ │ ├── distributed-index.adoc
│ │ ├── jcache
│ │ │ ├── coherence.adoc
│ │ │ ├── hazelcast.adoc
│ │ │ ├── ignite.adoc
│ │ │ ├── infinispan.adoc
│ │ │ └── jcache-usage.adoc
│ │ ├── jdbc
│ │ │ └── jdbc-integrations.adoc
│ │ └── redis
│ │ └── redis.adoc
│ ├── distributed-advanced
│ │ ├── advanced-index.adoc
│ │ ├── asynchronous.adoc
│ │ ├── implement-custom-database.adoc
│ │ └── implicit-configuration-replacement.adoc
│ ├── docinfo.html
│ ├── images
│ │ ├── Maxim_Bartkov.jpg
│ │ ├── photo.jpg
│ │ └── white-logo.png
│ ├── index.adoc
│ ├── previos-releases.adoc
│ ├── release-notes.adoc
│ └── toc.adoc
├── backward-compatibility-tests
│ ├── common
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── bucket4j
│ │ │ └── backward_compatibility
│ │ │ └── StartPostgreSQLContainer.java
│ │ └── test
│ │ └── resources
│ │ └── logback-test.xml
│ ├── current
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ │ └── java
│ │ │ └── com
│ │ │ └── bucket4j
│ │ │ └── backward_compatibility
│ │ │ ├── HazelcastScenarios.java
│ │ │ └── PostgreSQLScenarios.java
│ │ └── test
│ │ └── resources
│ │ └── logback-test.xml
│ ├── pom.xml
│ └── previous
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── com
│ │ └── bucket4j
│ │ └── backward_compatibility
│ │ ├── HazelcastScenarios.java
│ │ └── PostgreSQLScenarios.java
│ └── test
│ └── resources
│ └── logback-test.xml
├── bucket4j-benchmarks
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── io
│ └── github
│ └── bucket4j
│ └── benchmark
│ ├── BaseLineWithoutSynchronization.java
│ ├── ConsumeMostlySuccess.java
│ ├── MemoryBenchmark.java
│ ├── state
│ │ ├── GuavaLimiterState.java
│ │ ├── LocalLockFreeState.java
│ │ ├── LocalSynchronizedState.java
│ │ ├── LocalUnsafeState_ieee754.java
│ │ ├── LocalUnsafeState.java
│ │ └── Resilience4jState.java
│ └── TryConsumeMostlySuccess.java
├── bucket4j-caffeine
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── caffeine
│ │ └── CaffeineProxyManager.java
│ └── test
│ ├── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── caffeine
│ │ └── CaffeineTest.java
│ └── resources
│ └── logback-test.xml
├── bucket4j-coherence
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── grid
│ │ └── coherence
│ │ ├── CoherenceProcessor.java
│ │ ├── CoherenceProxyManager.java
│ │ └── pof
│ │ └── CoherenceEntryProcessorPofSerializer.java
│ └── test
│ ├── java
│ │ ├── CoherencePofSerializerTest.java
│ │ ├── CoherenceWithJdkSerializationTest.java
│ │ └── CoherenceWithPofSerializationTest.java
│ └── resources
│ ├── bucket4j-pof-config-example.xml
│ ├── logback-test.xml
│ ├── test-coherence-config.xml
│ └── test-coherence-jdk_serialization-config.xml
├── bucket4j-core
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ ├── AbstractBucket.java
│ │ ├── BandwidthBuilder.java
│ │ ├── Bandwidth.java
│ │ ├── BlockingBucket.java
│ │ ├── BlockingStrategy.java
│ │ ├── BucketConfiguration.java
│ │ ├── BucketExceptions.java
│ │ ├── Bucket.java
│ │ ├── BucketListener.java
│ │ ├── BucketState64BitsInteger.java
│ │ ├── BucketState.java
│ │ ├── ConfigurationBuilder.java
│ │ ├── ConsumptionProbe.java
│ │ ├── distributed
│ │ │ ├── AsyncBucketProxyAdapter.java
│ │ │ ├── AsyncBucketProxy.java
│ │ │ ├── AsyncOptimizationController.java
│ │ │ ├── AsyncVerboseBucket.java
│ │ │ ├── BucketProxy.java
│ │ │ ├── ExpirationAfterWriteStrategy.java
│ │ │ ├── jdbc
│ │ │ │ ├── BucketTableSettings.java
│ │ │ │ ├── PrimaryKeyMapper.java
│ │ │ │ ├── SQLProxyConfigurationBuilder.java
│ │ │ │ └── SQLProxyConfiguration.java
│ │ │ ├── OptimizationController.java
│ │ │ ├── proxy
│ │ │ │ ├── AbstractProxyManager.java
│ │ │ │ ├── AsyncCommandExecutor.java
│ │ │ │ ├── AsyncProxyManager.java
│ │ │ │ ├── BucketNotFoundException.java
│ │ │ │ ├── ClientSideConfig.java
│ │ │ │ ├── CommandExecutor.java
│ │ │ │ ├── DefaultAsyncBucketProxy.java
│ │ │ │ ├── DefaultBucketProxy.java
│ │ │ │ ├── ExecutionStrategy.java
│ │ │ │ ├── generic
│ │ │ │ │ ├── compare_and_swap
│ │ │ │ │ │ ├── AbstractCompareAndSwapBasedProxyManager.java
│ │ │ │ │ │ ├── AsyncCompareAndSwapOperation.java
│ │ │ │ │ │ └── CompareAndSwapOperation.java
│ │ │ │ │ ├── pessimistic_locking
│ │ │ │ │ │ ├── AbstractLockBasedProxyManager.java
│ │ │ │ │ │ └── LockBasedTransaction.java
│ │ │ │ │ └── select_for_update
│ │ │ │ │ ├── AbstractSelectForUpdateBasedProxyManager.java
│ │ │ │ │ ├── LockAndGetResult.java
│ │ │ │ │ └── SelectForUpdateBasedTransaction.java
│ │ │ │ ├── ImplicitConfigurationReplacement.java
│ │ │ │ ├── optimization
│ │ │ │ │ ├── batch
│ │ │ │ │ │ ├── AsyncBatchingExecutor.java
│ │ │ │ │ │ ├── BatchingExecutor.java
│ │ │ │ │ │ └── BatchingOptimization.java
│ │ │ │ │ ├── DefaultOptimizationListener.java
│ │ │ │ │ ├── delay
│ │ │ │ │ │ ├── DelayedCommandExecutor.java
│ │ │ │ │ │ └── DelayOptimization.java
│ │ │ │ │ ├── DelayParameters.java
│ │ │ │ │ ├── manual
│ │ │ │ │ │ ├── ManuallySyncingCommandExecutor.java
│ │ │ │ │ │ └── ManuallySyncingOptimization.java
│ │ │ │ │ ├── NopeOptimizationListener.java
│ │ │ │ │ ├── Optimization.java
│ │ │ │ │ ├── OptimizationListener.java
│ │ │ │ │ ├── Optimizations.java
│ │ │ │ │ ├── PredictionParameters.java
│ │ │ │ │ ├── predictive
│ │ │ │ │ │ ├── PredictiveCommandExecutor.java
│ │ │ │ │ │ ├── PredictiveOptimization.java
│ │ │ │ │ │ └── Sampling.java
│ │ │ │ │ └── skiponzero
│ │ │ │ │ ├── SkipSyncOnZeroCommandExecutor.java
│ │ │ │ │ └── SkipSyncOnZeroOptimization.java
│ │ │ │ ├── ProxyManager.java
│ │ │ │ ├── RecoveryStrategy.java
│ │ │ │ ├── RemoteAsyncBucketBuilder.java
│ │ │ │ └── RemoteBucketBuilder.java
│ │ │ ├── remote
│ │ │ │ ├── AbstractBinaryTransaction.java
│ │ │ │ ├── BucketNotFoundError.java
│ │ │ │ ├── CommandError.java
│ │ │ │ ├── CommandResult.java
│ │ │ │ ├── commands
│ │ │ │ │ ├── AddTokensCommand.java
│ │ │ │ │ ├── CheckConfigurationVersionAndExecuteCommand.java
│ │ │ │ │ ├── ConsumeAsMuchAsPossibleCommand.java
│ │ │ │ │ ├── ConsumeIgnoringRateLimitsCommand.java
│ │ │ │ │ ├── CreateInitialStateAndExecuteCommand.java
│ │ │ │ │ ├── CreateInitialStateWithVersionOrReplaceConfigurationAndExecuteCommand.java
│ │ │ │ │ ├── CreateSnapshotCommand.java
│ │ │ │ │ ├── EstimateAbilityToConsumeCommand.java
│ │ │ │ │ ├── ForceAddTokensCommand.java
│ │ │ │ │ ├── GetAvailableTokensCommand.java
│ │ │ │ │ ├── GetConfigurationCommand.java
│ │ │ │ │ ├── MultiCommand.java
│ │ │ │ │ ├── ReplaceConfigurationCommand.java
│ │ │ │ │ ├── ReserveAndCalculateTimeToSleepCommand.java
│ │ │ │ │ ├── ResetCommand.java
│ │ │ │ │ ├── SyncCommand.java
│ │ │ │ │ ├── TryConsumeAndReturnRemainingTokensCommand.java
│ │ │ │ │ ├── TryConsumeCommand.java
│ │ │ │ │ └── VerboseCommand.java
│ │ │ │ ├── ConfigurationNeedToBeReplacedError.java
│ │ │ │ ├── MultiResult.java
│ │ │ │ ├── MutableBucketEntry.java
│ │ │ │ ├── RemoteBucketState.java
│ │ │ │ ├── RemoteCommand.java
│ │ │ │ ├── RemoteStat.java
│ │ │ │ ├── RemoteVerboseResult.java
│ │ │ │ ├── Request.java
│ │ │ │ ├── UnsupportedNamedTypeError.java
│ │ │ │ ├── UnsupportedTypeError.java
│ │ │ │ ├── UsageOfObsoleteApiError.java
│ │ │ │ └── UsageOfUnsupportedApiError.java
│ │ │ ├── serialization
│ │ │ │ ├── DataOutputSerializationAdapter.java
│ │ │ │ ├── DeserializationAdapter.java
│ │ │ │ ├── InternalSerializationHelper.java
│ │ │ │ ├── Mapper.java
│ │ │ │ ├── PrimitiveSerializationHandles.java
│ │ │ │ ├── Scope.java
│ │ │ │ ├── SerializationAdapter.java
│ │ │ │ ├── SerializationHandle.java
│ │ │ │ └── SerializationHandles.java
│ │ │ └── versioning
│ │ │ ├── BackwardCompatibilityException.java
│ │ │ ├── UnsupportedNamedTypeException.java
│ │ │ ├── UnsupportedTypeException.java
│ │ │ ├── UsageOfObsoleteApiException.java
│ │ │ ├── UsageOfUnsupportedApiException.java
│ │ │ ├── Version.java
│ │ │ └── Versions.java
│ │ ├── EstimationProbe.java
│ │ ├── Experimental.java
│ │ ├── LimitChecker.java
│ │ ├── local
│ │ │ ├── LocalBucketBuilder.java
│ │ │ ├── LocalBucket.java
│ │ │ ├── LocalBucketSerializationHelper.java
│ │ │ ├── LockFreeBucket.java
│ │ │ ├── SynchronizationStrategy.java
│ │ │ ├── SynchronizedBucket.java
│ │ │ └── ThreadUnsafeBucket.java
│ │ ├── MathType.java
│ │ ├── Nothing.java
│ │ ├── Refill.java
│ │ ├── SchedulingBucket.java
│ │ ├── SimpleBucketListener.java
│ │ ├── TimeMeter.java
│ │ ├── TokensInheritanceStrategy.java
│ │ ├── UninterruptibleBlockingStrategy.java
│ │ ├── util
│ │ │ ├── ComparableByContent.java
│ │ │ └── concurrent
│ │ │ └── batch
│ │ │ ├── AsyncBatchHelper.java
│ │ │ └── BatchHelper.java
│ │ ├── VerboseBucket.java
│ │ └── VerboseResult.java
│ └── test
│ └── java
│ └── io
│ └── github
│ └── bucket4j
│ ├── api_specifications
│ │ ├── blocking
│ │ │ ├── BlockingConsumeSpecification.groovy
│ │ │ └── BlockingTryConsumeSpecification.groovy
│ │ ├── regular
│ │ │ ├── AddTokensSpecification.groovy
│ │ │ ├── ConsumeAsMuchAsPossibleSpecification.groovy
│ │ │ ├── ConsumeIgnoringLimitsSpecification.groovy
│ │ │ ├── EstimateAbilityToConsumeSpecification.groovy
│ │ │ ├── ForceAddTokensSpecification.groovy
│ │ │ ├── GetAvailableTokensSpecification.groovy
│ │ │ ├── ResetTokensSpecification.groovy
│ │ │ ├── TryConsumeAndReturnRemainingSpecification.groovy
│ │ │ └── TryConsumeSpecification.groovy
│ │ └── scheduler
│ │ └── BlockingTryConsumeWithSchedulerSpecification.groovy
│ ├── BandwidthBuilderTest.groovy
│ ├── BlockingStrategyTest.java
│ ├── BucketListenerSpecification.groovy
│ ├── ConfigurationReplacementSpecification.groovy
│ ├── ConsumptionProbeTest.java
│ ├── core_algorithms
│ │ ├── BucketRoundingRulesSpecification.groovy
│ │ ├── FixedIntervalRefillSpecification.groovy
│ │ ├── HandlingArithmeticOverflowSpecification.groovy
│ │ ├── integer
│ │ │ ├── BucketStateSpecification.groovy
│ │ │ └── HandlingArithmeticOverflowSpecification.groovy
│ │ └── IntervallyAlignedRefillSpecification.groovy
│ ├── DetectionOfIllegalApiUsageSpecification.groovy
│ ├── distributed
│ │ ├── proxy
│ │ │ └── optimization
│ │ │ ├── batch
│ │ │ │ ├── BatchingCommandExecutorSpecification.groovy
│ │ │ │ └── mock
│ │ │ │ ├── CombinedMockCommand.java
│ │ │ │ ├── CombinedResult.java
│ │ │ │ ├── MockBatchExecutor.java
│ │ │ │ ├── MockCommand.java
│ │ │ │ ├── MockState.java
│ │ │ │ └── SingleMockCommand.java
│ │ │ ├── delay
│ │ │ │ ├── DelayedAsyncCommandExecutorSpecification.groovy
│ │ │ │ └── DelayedCommandExecutorSpecification.groovy
│ │ │ ├── OptimizationAsyncCornerCasesSpecification.groovy
│ │ │ ├── OptimizationCornerCasesSpecification.groovy
│ │ │ ├── predictive
│ │ │ │ ├── PredictiveAsyncCommandExecutorSpecification.groovy
│ │ │ │ └── PredictiveCommandExecutorSpecification.groovy
│ │ │ └── skipsynconzero
│ │ │ ├── SkipSyncOnZeroAsyncCommandExecutorSpecification.groovy
│ │ │ └── SkipSyncOnZeroCommandExecutorSpecification.groovy
│ │ ├── RemoteCornerCases.groovy
│ │ └── serialization
│ │ ├── AbstractSerializationTest.java
│ │ ├── HashMapOutputSerializationTest.java
│ │ ├── JdkDataOutputSerializationTest.java
│ │ └── JsonOutputSerializationTest.java
│ ├── ImplicitConfigurationReplacementSpecification.groovy
│ ├── local
│ │ ├── LocalBucketsSerializationTest.java
│ │ ├── LocalTest.java
│ │ └── LockFreeBucketLayout.java
│ ├── mock
│ │ ├── BlockingStrategyMock.java
│ │ ├── BucketType.java
│ │ ├── CompareAndSwapBasedProxyManagerMock.java
│ │ ├── LockBasedProxyManagerMock.java
│ │ ├── ProxyManagerMock.java
│ │ ├── SchedulerMock.java
│ │ ├── SelectForUpdateBasedProxyManagerMock.java
│ │ └── TimeMeterMock.java
│ ├── SchedulersSpecification.groovy
│ ├── tck
│ │ ├── AbstractDistributedBucketTest.java
│ │ └── ProxyManagerSpec.java
│ ├── ToStringSpecification.groovy
│ ├── util
│ │ ├── AsyncConsumerThread.java
│ │ ├── AsyncConsumptionScenario.java
│ │ ├── concurrent
│ │ │ ├── AsyncBatchHelperSpecification.groovy
│ │ │ └── BatchHelperSpecification.groovy
│ │ ├── ConsumerThread.java
│ │ ├── ConsumptionScenario.java
│ │ ├── Formatter.java
│ │ ├── PackageAccessor.java
│ │ └── PipeGenerator.java
│ └── VerboseApiTest.groovy
├── bucket4j-examples
│ ├── pom.xml
│ └── src
│ └── test
│ ├── java
│ │ └── example
│ │ └── distributed
│ │ └── optimizers
│ │ ├── batching
│ │ │ └── HazelcastWithBatchingPerformanceExample.java
│ │ ├── manual_syncing
│ │ │ └── HazelcastWithManualSyningPerformanceExample.java
│ │ └── skipsynconzero
│ │ ├── HazelcastSkipSyncOnZeroExample.java
│ │ └── RedisSkipSyncOnZeroExample.java
│ └── resources
│ └── logback-test.xml
├── bucket4j-hazelcast-all
│ ├── bucket4j-hazelcast
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ │ └── java
│ │ │ └── io
│ │ │ └── github
│ │ │ └── bucket4j
│ │ │ └── grid
│ │ │ └── hazelcast
│ │ │ ├── HazelcastCompareAndSwapBasedProxyManager.java
│ │ │ ├── HazelcastEntryProcessor.java
│ │ │ ├── HazelcastLockBasedProxyManager.java
│ │ │ ├── HazelcastOffloadableEntryProcessor.java
│ │ │ ├── HazelcastProxyManager.java
│ │ │ ├── serialization
│ │ │ │ ├── HazelcastEntryProcessorSerializer.java
│ │ │ │ ├── HazelcastOffloadableEntryProcessorSerializer.java
│ │ │ │ └── SimpleBackupProcessorSerializer.java
│ │ │ └── SimpleBackupProcessor.java
│ │ └── test
│ │ ├── java
│ │ │ └── io
│ │ │ └── github
│ │ │ └── bucket4j
│ │ │ └── hazelcast
│ │ │ ├── HazelcastSerializerTest.java
│ │ │ ├── HazelcastTest.java
│ │ │ └── HazelcastWithCustomSerializersTest.java
│ │ └── resources
│ │ └── logback-test.xml
│ ├── bucket4j-hazelcast-3
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ │ └── java
│ │ │ └── io
│ │ │ └── github
│ │ │ └── bucket4j
│ │ │ └── grid
│ │ │ └── hazelcast
│ │ │ ├── HazelcastCompareAndSwapProxyManager.java
│ │ │ ├── HazelcastEntryProcessor.java
│ │ │ ├── HazelcastLockBasedProxyManager.java
│ │ │ ├── HazelcastProxyManager.java
│ │ │ ├── serialization
│ │ │ │ ├── HazelcastEntryProcessorSerializer.java
│ │ │ │ └── SimpleBackupProcessorSerializer.java
│ │ │ └── SimpleBackupProcessor.java
│ │ └── test
│ │ ├── java
│ │ │ └── io
│ │ │ └── github
│ │ │ └── bucket4j
│ │ │ └── hazelcast
│ │ │ ├── HazelcastSerializerTest.java
│ │ │ ├── HazelcastTest.java
│ │ │ └── HazelcastWithCustomSerializersTest.java
│ │ └── resources
│ │ └── logback-test.xml
│ └── pom.xml
├── bucket4j-ignite
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── grid
│ │ └── ignite
│ │ ├── thick
│ │ │ └── IgniteProxyManager.java
│ │ └── thin
│ │ ├── cas
│ │ │ └── IgniteThinClientCasBasedProxyManager.java
│ │ ├── compute
│ │ │ ├── Bucket4jComputeJob.java
│ │ │ ├── Bucket4jComputeTask.java
│ │ │ ├── Bucket4jComputeTaskParams.java
│ │ │ ├── IgniteEntryProcessor.java
│ │ │ └── IgniteThinClientProxyManager.java
│ │ └── ThinClientUtils.java
│ └── test
│ ├── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── grid
│ │ └── ignite
│ │ ├── IgniteTest.java
│ │ └── IgniteThinClientTest.java
│ └── resources
│ └── logback-test.xml
├── bucket4j-infinispan-all
│ ├── bucket4j-infinispan
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ │ └── java
│ │ │ └── io
│ │ │ └── github
│ │ │ └── bucket4j
│ │ │ └── grid
│ │ │ └── infinispan
│ │ │ ├── InfinispanProcessor.java
│ │ │ ├── InfinispanProxyManager.java
│ │ │ └── serialization
│ │ │ ├── Bucket4jProtobufContextInitializer.java
│ │ │ └── InfinispanProcessorMarshaller.java
│ │ └── test
│ │ ├── java
│ │ │ └── io
│ │ │ └── github
│ │ │ └── bucket4j
│ │ │ └── grid
│ │ │ └── infinispan
│ │ │ └── InfinispanTest.java
│ │ └── resources
│ │ └── logback-test.xml
│ └── pom.xml
├── bucket4j-jcache
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── grid
│ │ └── jcache
│ │ ├── CompatibilityTest.java
│ │ └── JCacheProxyManager.java
│ └── test
│ ├── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── grid
│ │ └── jcache
│ │ ├── ecache
│ │ │ └── EhcacheCompatibilityInvestigation.java
│ │ ├── hazelcast
│ │ │ └── HazelcastJCacheTest.java
│ │ ├── ignite
│ │ │ └── IgniteJCacheTest.java
│ │ └── infinispan
│ │ ├── InfinispanCompatibilityInvestigationTest.java
│ │ └── InfinispanJCacheTest.java
│ └── resources
│ ├── infinispan-jcache-cluster.xml
│ └── logback-test.xml
├── bucket4j-mariadb
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── mariadb
│ │ └── MariaDBSelectForUpdateBasedProxyManager.java
│ └── test
│ ├── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── mariadb
│ │ └── MariaDBSelectForUpdateLockBasedTransactionTest.java
│ └── resources
│ └── logback-test.xml
├── bucket4j-mssql
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── mssql
│ │ └── MSSQLSelectForUpdateBasedProxyManager.java
│ └── test
│ ├── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── mssql
│ │ └── MSSQLSelectForUpdateBasedProxyManagerTest.java
│ └── resources
│ └── logback-test.xml
├── bucket4j-mysql
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── mysql
│ │ └── MySQLSelectForUpdateBasedProxyManager.java
│ └── test
│ ├── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── mysql
│ │ └── MySQLSelectForUpdateLockBasedTransactionTest.java
│ └── resources
│ └── logback-test.xml
├── bucket4j-oracle
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── oracle
│ │ └── OracleSelectForUpdateBasedProxyManager.java
│ └── test
│ ├── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── oracle
│ │ └── OracleSelectForUpdateLockBasedTransactionTest.java
│ └── resources
│ └── logback-test.xml
├── bucket4j-parent
│ └── pom.xml
├── bucket4j-postgresql
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── postgresql
│ │ ├── PostgreSQLadvisoryLockBasedProxyManager.java
│ │ └── PostgreSQLSelectForUpdateBasedProxyManager.java
│ └── test
│ ├── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── postgresql
│ │ └── PostgreSQLTest.java
│ └── resources
│ └── logback-test.xml
├── bucket4j-redis
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── redis
│ │ ├── AbstractRedisProxyManagerBuilder.java
│ │ ├── consts
│ │ │ └── LuaScripts.java
│ │ ├── jedis
│ │ │ └── cas
│ │ │ └── JedisBasedProxyManager.java
│ │ ├── lettuce
│ │ │ └── cas
│ │ │ └── LettuceBasedProxyManager.java
│ │ └── redisson
│ │ └── cas
│ │ └── RedissonBasedProxyManager.java
│ └── test
│ ├── java
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── redis
│ │ ├── RedisClusterTest.java
│ │ └── RedisStandaloneTest.java
│ ├── lua
│ │ ├── bucket4j-redis.lua
│ │ └── increment-counter.lua
│ └── resources
│ └── logback-test.xml
├── experimental
│ ├── bucket4j-lua
│ │ ├── pom.xml
│ │ └── src
│ │ ├── main
│ │ │ └── lua
│ │ │ └── bucket4j.lua
│ │ └── test
│ │ ├── java
│ │ │ ├── io
│ │ │ │ └── github
│ │ │ │ └── bucket4j
│ │ │ │ └── lua
│ │ │ │ └── Bucket4jScript.java
│ │ │ └── luna_example
│ │ │ └── LunaExample.java
│ │ └── resources
│ │ └── logback-test.xml
│ └── pom.xml
├── LICENSE.txt
├── lincheck-tests
│ ├── pom.xml
│ └── src
│ └── test
│ ├── kotlin
│ │ └── io
│ │ └── github
│ │ └── bucket4j
│ │ └── distributed
│ │ └── proxy
│ │ └── optimization
│ │ └── batch
│ │ └── mock
│ │ ├── BatchingAsyncExecutorLincheckTest.kt
│ │ └── BatchingExecutorLincheckTest.kt
│ └── resources
│ └── logback-test.xml
├── mvnw
├── mvnw.cmd
├── pom.xml
└── README.md
363 directories, 392 files
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论