Commit Graph

1266 Commits

Author SHA1 Message Date
Thomas Darimont
cf4fa9e4fb DATAREDIS-332 - @Transactional operation should use the same connection.
We only unbind the current redisConnectionFactory from the current thread if the transaction is not active anymore.
Previously we performed the unbinding in RedisTemplate.execute(RedisCallback, boolean, boolean) overtime which lead to the fact that the next redis operation within the same transaction used a different redis connection, which could lead to exhaustion of the connection pool.
We also ensure that we correctly unbind the RedisConnectionFactory resource from the TransactionSynchronizationManager on transaction completion in RedisTransactionSynchronizer.afterCompletion(int).
Added test case supplied from issue.

Original pull request: #134.
2015-04-13 12:58:54 +02:00
Thomas Darimont
c47292d173 DATAREDIS-374 - Adapt JedisConnectionFactory for changes in Jedis 2.7.
We now support both Jedis 2.6.2 (current release) as well as the upcoming 2.7 version. Therefore we call the in 2.7 renamed `getTimeout` / `setTimeout` Methods on `JedisShardInfo` via reflection to read/set `soTimeout`.

Since there’s no change in r.c.j.JedisFactory that would allow to individually configure connection and socket timeout, we use the socketTimeout of `JedisShardInfo`. This will cause `r.c.j.JedisFactory` to use the socket timeout for the connection as well, which is the same behavior as in 2.6.2.

Tested against Jedis 2.7 branch with Redis 3.0.0.RC4.

Original Pull Request: #127
2015-03-19 11:41:57 +01:00
Stephane Nicoll
d0a0a6a78b DATAREDIS-383 - Improve JavaDoc of RedisCacheManager.
Extended description on setCacheNames(..).

Original pull request: #132.
2015-03-18 13:10:10 +01:00
Christoph Strobl
738f41b169 DATAREDIS-379 - Update reference documentation.
- Added new-features section.
- Update command matrix.
- Updated Sentinel config and template section.

Original pull request: #130.
2015-03-16 13:43:35 +01:00
Thomas Darimont
a8e4659f75 DATAREDIS-375 - Avoid repeatedly decorating a cache.
Previously a transactional RedisCacheManager decorated a cache with the TransactionAwareCacheDecorator twice. We now make sure that a particular cache is only decorated once with a TransactionAwareCacheDecorator.

Original Pull Request: #128
2015-03-04 17:28:32 +01:00
Christoph Strobl
c662c46d02 DATAREDIS-372 - Allow easier RedisSentinelConfiguration setup.
We now allow to initialize a RedisSentinelConfiguration based on a given String collection of host:ports.
  sentinelHostAndPorts[0] = 127.0.0.1:23679
  sentinelHostAndPorts[1] = 127.0.0.1:23680

Further on it’s possible to pass in a PropertySource containing master name and sentinel nodes.
  spring.redis.sentinel.master=myMaster
  spring.redis.sentinel.nodes=127.0.0.1:23679,127.0.0.1:23680

Original pull request: #126.
2015-02-16 15:16:09 +01:00
Christoph Strobl
7a6b127355 DATAREDIS-369 - Avoid resource leak in RedisCache.
Introduce dedicated types RedisCache is supposed to work upon. We still stick to the contract defined by previous versions to assure source and binary compatibility.
In a next step RedisCache should be decoupled from o.s.cache.Cache by an additional indirection via RedisCacheCache.

Original Pull Request: #122
2015-02-05 08:32:50 +01:00
Christoph Strobl
b242d4ac6d DATAREDIS-369 - Avoid resource leak in RedisCache.
We now check the presence of a prefix which allows to identify the keys associated with the cache to either keep track of keys or use the prefix to remove them on clear.

This is a small fix intended to be back ported to the Evans (1.4.x) release train. Additional refactoring will be done for the Fowler release.

Original Pull Request: #122
2015-02-05 08:32:36 +01:00
Thomas Darimont
0ea0c4bf67 DATAREDIS-328 - RedisCacheManager should not instantiate caches in setCacheNames().
We now construct the caches for the configured cache-names in afterPropertiesSet(). Previously the caches were created in the setter which lead to unwanted property-set order dependencies.

Original pull request: #123.
2015-02-02 14:54:05 +01:00
Thomas Darimont
89d5ac8840 DATAREDIS-364 - Open-up API in RedisCacheManager for easier extensibility.
We now allow users to build custom CacheManagers based on RedisCacheManager more easily by making a broader API accessible to sub-classes.
In that sense we also allowing RedisCache to be used in custom implementations by making it public.

Original pull request: #120.
2015-01-19 14:04:00 +01:00
Thomas Darimont
e72514143e DATAREDIS-356 - Check NonTransientDataAccessException for NOSCRIPT error.
We now check for a NonTransientDataAccessException instead of just an UncategorizedDataAccessException to conver all relevant exception types.
Corrected typo in method name. Added infrastructure for driver specific DefaultScriptExecutorTests.
Removed usage of RelaxedJunit4ClassRuner and using MinimumRedisRule
instead.
Removed obsolete test context configuration for ScriptExecutorTests.

Original pull request: #115.
2014-11-28 10:10:01 +01:00
Thomas Darimont
ca469958ef DATAREDIS-359 - Fix redis javadoc generation. 2014-11-28 10:10:01 +01:00
Thomas Darimont
7ea72f3682 DATAREDIS-359 - Fix redis javadoc generation. 2014-11-27 23:11:44 +01:00
Christoph Strobl
cb070c1375 DATAREDIS-358 - Precise version resolution within RedisTestProfileValueSource.
We now resolve the precise redis version including patch level for the 2.8 line. This allows us to disable tests when building against older versions that might not have the complete featureset available.
2014-11-27 22:03:24 +01:00
Thomas Darimont
557683da51 DATAREDIS-354 - Made JavaType lookup configurable for Jackson RedisSerializers.
We now allow to customise the JavaType to use for a given Class<> by using the getJavaType method. Added constructor variants to JacksonJsonRedisSerializer and Jackson2JsonRedisSerializer.

Original pull request: #113.
2014-11-27 14:26:12 +01:00
Christoph Strobl
22aa5df73e DATAREDIS-308 - Add support for HyperLogLog.
We added methods for PFADD, PFCOUNT and PFMERGE to RedisConnection and StringRedisConnection. HyperLogLogOperations available via RedisTemplate allow more indrect usage of HLL.

Please note that currently Jedis is the only driver that can be used for HyperLogLog commands.

Original pull request: #116.
2014-11-26 15:59:11 +01:00
Christoph Strobl
57fc58fcff DATAREDIS-288 - Polishing.
Added javadoc and assertions to ensure failing before actually sending data to redis and backed those with tests.

Original pull request: #114.
2014-11-17 13:13:08 +01:00
David Liu
d89773387a DATAREDIS-288 - Improved support for collection parameters in ListOperations.
Added additional leftPushAll and rightPushAll method overloads that accept a Collection parameter.
Previously we only accepted varargs which required users to convert collections to arrays.

Based on David Liu's pull request: #100.

Original pull request: #114.
2014-11-17 13:03:13 +01:00
Thomas Darimont
cf46d6e766 DATAREDIS-106 - Support for open interval for scores for sorted sets.
We now support open zset's interval for JedisConnection, JredisConnection, LettuceConnection, SrpConnection and DefaultStringRedisConnection.

Original pull request: #97.
2014-10-29 11:53:03 +01:00
Christoph Strobl
5ca672d180 DATAREDIS-347 - Fix unintended duplicate script execution.
We now inspect the message of the exception thrown to determine whether the error resulted from a script not being present or an other error. In case the script is not present we simply invoke eval.

Original pull request: #108
2014-10-24 19:24:56 +02:00
David Liu
4711693669 DATAREDIS-334 - Add binary alternative for RedisScriptingCommands.evalSha.
Introduced new evalSha method that accepts a byte[] as scriptSha as well
as a variable number of byte[] as keyValueArgs.

Original pull request: #99.
2014-10-09 16:13:27 +02:00
David Liu
9ecad07587 DATAREDIS-197 - Expose bit-related ops via ValueOperations.
Polishing. Added -S switch to gradlew in makefile for better Stacktrace reporting.

Original pull request: #96.
2014-09-30 10:28:53 +02:00
Christoph Strobl
4c7e405f7b DATAREDIS-344 - Assert RedisCache works with Spring 4.1.
Added `putIfAbsent` to `RedisCache` to satisfy compatibility with newly introduced method.

Original pull request: #102.
2014-09-04 15:02:19 +02:00
Christoph Strobl
f94df9f535 DATAREDIS-340 - Polish performance improvement of zAdd using jedis.
It turned out that the version check throttled performance so we moved things around to avoid iterating multiple times and still perform the check in a non intrusive way.
2014-09-04 14:02:36 +02:00
Konstantin Shchepanovskyi
b26c56b101 DATAREDIS-340 - Improve performance of zAdd elements when using jedis.
Optimize initial size of HashSet and use a Set implementation to check for score duplicates.
Move jedis version check outside loop.

Original PR: #101
CLA: 90520140903040912 (Konstantin Shchepanovskyi)
2014-09-04 14:00:21 +02:00
Oliver Gierke
5df8c3bc80 DATAREDIS-336 - Polished Asciidoctor setup.
Simplified tasks into single asciidoctor task. Wipe out expandPlaceholders to avoid needing the hack to in turn avoid the issue with file expansion.

Removed obsolete baseDir prefix from index.adoc.

Original pull request: #94.
2014-09-04 08:44:47 +02:00
Oliver Gierke
ef7f8221b0 DATAREDIS-336 - Use Spring Data Build CSS and fix resources zip content.
We now depend on the Spring Data Build resources zip to refer to the centrally managed stylesheet. Fixed the Asciidoctor setup to copy the CSS from the shared resources into the target folder. Tweaked docsZip task to trigger docbook generation as well as PDF generation before zipping and corrected the includes directives to create the proper zip file structure.

Original pull request: #94.
2014-09-04 08:44:47 +02:00
Oliver Gierke
4d2fd187ab DATAREDIS-336 - Improvements to reference documentation build.
Fixed Asciidoctor source files to avoid as many warnings as possible. Switched to matching AsciidoctorJ version. Fixed doctype definition by making it an option and not an attribute. Switched from backend to backends (as recommended for Asciidoctor 1.5).

Original pull request: #94.
2014-09-04 08:44:47 +02:00
Christoph Strobl
c6b2ba75af DATAREDIS-336 - Copy styles to output dir.
Upgraded to Asciidoctor 1.5.0. We now cheat on Gradle docbook-reference-plugin by directly copying files to reference work dir to bypass expanding files. Create an empty source folder so that the plugin does not fail.

Original pull request: #94.
2014-09-04 08:44:47 +02:00
Greg Turnquist
fe6b75ee2a DATAREDIS-336 - Fine tune build process and formatting.
Original pull request: #94.
2014-09-04 08:44:47 +02:00
Christoph Strobl
5f638fdda3 DATAREDIS-336 - Move to Asciidoctor for reference documentation.
Add Asciidoctor plugin to Gradle. Reformat and extract some content of files that could not be parsed. Added already converted files.

Original pull request: #94.
2014-09-04 08:44:47 +02:00
Thomas Darimont
5abfa8716e DATAREDIS-337 - Improve handling of overridden methods in MessageListenerAdapter.
Previously overriding message handler methods of the delegate passed to MessageListenerAdapter resulted in the message handler method called multiple times. We now make sure that a message handler method is only found and invoked  once.

Original pull request: #95.
2014-08-13 08:53:49 +02:00
Christoph Strobl
fd361a1868 DATAREDIS-330 - Add support for SENTINEL commands.
add support for commands:
  SENTINEL FAILOVER master
  SENTINEL SLAVES master
  SENTINEL REMOVE name
  SENTINEL MONITOR name ip port quorum

Original pull request: #92.
2014-08-11 09:12:12 +02:00
Christoph Strobl
55ff415a71 DATAREDIS-324 - Add Redis Sentinel support.
We’ve added RedisSentinelConfiguration holding required information for connecting to redis sentinels. This can be used to set up ConnectionFeactory for HA environments.

**Using Jedis**
Providing RedisSentinelConfiguration will force the JedisConnectionFactory to use JedisSentinelPool for managing resources.

**Using Lettuce/JRedis/SRP**
There’s currently no support for sentinel in those clients.

**CI Build**
We’ve added makefile to build and set up redis instances for testing sentinel support on travis-ci. There’s already a section for redis cluster.
The cluster section is for whatever reason currently not working as the cluster nodes won’t start.
This will be fixed when we add redis-cluster support.

_side note:_ there’s an alternative fork of lettuce at mp911de/lettuce that already has sentinel support.
2014-08-05 09:00:15 +02:00
Jungtaek Lim
c36a58da7f DATAREDIS-333 - Use binary version of Jedis.evalsha()
* JedisConnection.eval() uses binary version of Jedis.eval()
* but JedisConnection.evalsha() uses string version of Jedis.evalsha()
* this commit changes JedisConnection.evalsha() to use binary version of Jedis.evalsha()

---

Original Pull Request: #91
CLA: 88220140729064528 (Jungtaek Lim)
2014-07-31 07:14:47 +02:00
Thomas Darimont
b7d8eacdcf DATAREDIS-327 - Improve exception handling for all supported clients.
We now consistently return null in implementations of RedisConnectionFactory#translateExceptionIfPossible(RuntimeException ex)
in cases where we cannot translate the given exception into a more meaningful one complying with the spec of PersistenceExceptionTranslator. Introduced the ExceptionTranslationStrategy abstraction which allows to customise the translation of exceptions through the implementations PassThroughExceptionTranslationStrategy which returns null iif the Exception could not be translated and FallbackExceptionTranslationStrategy which returns a RedisSystemException wrapping the original Exception if it couldn't be translated properly.

This fix also solves the issues DATAREDIS-295, DATAREDIS-325, DATAREDIS-326.

Original pull request: #90.
2014-07-23 14:09:19 +02:00
Thomas Darimont
ef3f6e9034 DATAREDIS-310 - Eagerly serialise key and value in RedisCache.
We now serialise the key and value before trying to acquire the lock to make sure that the given key and value are written in state they were at method invocation time.

Original pull request: #85.
2014-06-30 09:40:15 +02:00
Thomas Darimont
5f48ea8ed4 DATAREDIS-317 - Report inappropriate RedisTemplate more eagerly in RedisAtomic wrappers.
We now validate the given RedisTemplate in the constructor of RedisAtomicLong/RedisAtomicInteger/RedisAtomicDouble to report an inappropriate RedisTemplate more eagerly.

Original pull request: #83.
2014-06-30 08:13:26 +02:00
Christoph Strobl
42ff3ee1e1 DATAREDIS-314 - Add SCAN commands to Collection types.
Add scan to RedisMap / RedisSet / RedisZSet.
Lua scritps have to be assembled in binary way in order to avoid script errors when executing.
Add missing rules/profiles to run properly in a 2.6.x redis environment.

Original pull request: #82.
2014-06-17 10:18:28 +02:00
Christoph Strobl
7b3a358752 DATAREDIS-313 - Overhaul SCAN, HSCAN, SSCAN, ZSCAN operations.
Unify naming and return types.
Update supported commands documentation.
Remove key from BoundHashOperations and use getKey() instead.
Prevent error when trying to read values when there are no values present.
2014-06-12 08:20:31 +02:00
Christoph Strobl
d8b53a4c96 DATAREDIS-313 - Overhaul SCAN, HSCAN, SSCAN, ZSCAN operations.
Unify naming and return types. Update supported commands documentation. Remove key from BoundHashOperations and use getKey() instead.

Original pull request: #81.
2014-06-10 16:10:28 +02:00
Christoph Strobl
c939c8a9ff DATAREDIS-306 - Add support for ZSCAN.
ZSCAN is directly supported by jedis and can be emulated for lettuce via eval.

SRP and JRedis will throw UnsupportedOperationException.

Original pull request: #80.
2014-06-06 01:15:26 +02:00
Christoph Strobl
ba88249188 DATAREDIS-305 - Add support for HSCAN.
HSCAN is directly supported by jedis and can be emulated for lettuce via eval.

SRP and JRedis will throw UnsupportedOperationException.

We have modified the ScanCursor implementation to take Collection instead of List.

Currently naming for scan commands is not consistent for scan, sscan and hscan. There’s a clean up task for those commands when done with all scan related commands.

Original pull request: #78.
2014-06-03 11:50:55 +02:00
Thomas Darimont
1831ae9db7 DATAREDIS-296 - Upgrade jedis to recent version.
Upgrading to latest jedis version 2.5.1. Added new conversion for Long to byte[] in JedisConverters to be able to convert long cursorIds to byte[].

Original pull request: #77.
2014-06-02 08:27:43 +02:00
Thomas Darimont
29e70b8cd8 DATAREDIS-309 - Refactor test profiles to support more than 2 versions.
We’ve added a customized SpringJUnit4Runner and TestRule that allow us to use a more relaxed strategy when dealing with @IfProfileValue. Basically we have added ‘+’ as sort of wildcard indicating tests should be executed for version X and all its successor.

This allows us to run test valid starting 2.6 for 2.8 as well, while those only valid for 2.8 are not executed against eg. redis 2.6.17.

Fixed compile error in ScanCursor with Java 6.

Orignal pull request: #76.
2014-05-28 18:24:37 +02:00
Christoph Strobl
34d1759b4e DATAREDIS-304 - Add support for SSCAN command.
SSCAN command is natively supported by jedis and can be emulated for lettuce.
JRedis and SRP will throw UnsupportedOperationException.

sScan is available on RedisConneciton and RedisSetOperations returning basically a Cursor that allows iteration over the defined values for a given key.

Currently the jedis driver does not directly expose the binary version of sscan which leads to invalid results when using a non String compatible converter along with the RedisTemplate. We’ll change this as soon as a newer version of jedis is available.

Along the way loading behavior of ScanCursor has been fixed, preventing it from indicating next values available when there effectively are no more.

Orignal pull request: #76.
2014-05-28 14:34:18 +02:00
Christoph Strobl
d427928386 DATAREDIS-290 - Add support for SCAN command.
SCAN is currently only supported by jedis but can be emulated for
lettuce via eval.
Srp and JRedis will respond with UnsupportedOperationException.

We provide a Cursor implementation allowing to scroll through the
responses provided by the underlying connection. The cursor will fetch
additional results from redis server whenever its starting point has not
been reached and there are no more already loaded items available.

Only values returned by the last call to redis server are kept in memory
which allows scrolling through the entire collection without potentially
running into memory issues.

Original pull request: #71.
2014-05-23 14:07:11 +02:00
Christoph Strobl
b01fa9fd71 DATAREDIS-302 - Undo breaking change in DecoratingStringHashMapper.
The introduced generic types prevent the DecoratingStringHashMapper from being useful as it can now only be created for mappers of the generic type which was not the original intention.

This breaks the retwis-j sample as well as it seems other implementations see: b0c0d23.

Original pull request: #73.
2014-05-20 11:32:24 +02:00
Andy Wilkinson
bdea1051de DATAREDIS-299 - Assert compatibility with Spring IO.
Upgrade to JUnit 4.11

Upgrade to JUnit 4.11 and remove use of a matcher in an internal
package in favour of the Hamcrest equivalent. To avoid a clash between
JUnit 4.11's Hamcrest dependency and the version of Hamcrest that's
bundled in mockito-all, use of mockito-all has been replaced with
mockito-core

Add the Spring IO plugin

Configure the Spring IO plugin such that it's only applied when the
build is run with -PplatformVersion=<version>. This platformVersion
property is used to determine the version of the Platform that will
be used when running the springIoCheck task. The plugin can be used
by running a build as follows:

./gradlew clean springIoCheck -PplatformVersion=1.0.0.BUILD-SNAPSHOT -PJDK7_HOME=… -PJDK8_HOME=…

This will test the project on JDK7 and JDK 8 using the dependencies
defined in the latest snapshot of Spring IO Platform 1.0.0.

Address Java 6 compilation problem

The JUnit and Hamcrest upgrades caused a compilation error on Java 6
due to a bug in the compiler’s handling of generics. This commit adds
more type information to help to guide the compiler around the problem.

Additionally, deprecation warnings caused by the JUnit and Hamcrest
upgrades have also been addressed.

Original pull request: #72.
2014-05-19 09:59:06 +02:00
Christoph Strobl
c38c5f3c09 DATAREDIS-300 - Fix inconsistency with connection open() and close().
Redis connections have been left open when calling RedisTemplate.execute as the connection might have been bound to a thread, released but never been unbound. We now only bind and unbind connections in case of enabled transaction support, while just getting and releasing it for all other purposes.

Original pull request: #69.
2014-05-16 14:22:06 +02:00