@Override protected void lockEntry( PersistentEntity persistentEntity, String entityFamily, Serializable id, int timeout) { String redisKey = getRedisKey(entityFamily, id); final TimeUnit milliUnit = TimeUnit.MILLISECONDS; final long waitTime = TimeUnit.SECONDS.toMillis(timeout); final String lockName = lockName(redisKey); int sleepTime = 0; while (true) { if (redisTemplate.setnx(lockName, System.currentTimeMillis()) && redisTemplate.expire(lockName, timeout)) { break; } else { if (redisTemplate.ttl(lockName) > 0) { try { if (sleepTime > waitTime) { throw new CannotAcquireLockException( "Failed to acquire lock on key [" + redisKey + "]. Wait time exceeded timeout."); } else { // wait for previous lock to expire sleepTime += 500; milliUnit.sleep(500); } } catch (InterruptedException e) { throw new CannotAcquireLockException( "Failed to acquire lock on key [" + redisKey + "]: " + e.getMessage(), e); } } else { if (redisTemplate.getset(lockName, System.currentTimeMillis()) != null && redisTemplate.expire(lockName, timeout)) break; } } } }
@Override protected void unlockEntry( PersistentEntity persistentEntity, String entityFamily, Serializable id) { String redisKey = getRedisKey(entityFamily, id); redisTemplate.del(lockName(redisKey)); }
@Override protected void deleteEntries(final String family, final List<Long> keys) { final List<String> actualKeys = new ArrayList<String>(); for (Long key : keys) { actualKeys.add(family + ":" + key); getAllEntityIndex().remove(key); } redisTemplate.del(actualKeys.toArray(new String[actualKeys.size()])); }
@Override protected RedisEntry retrieveEntry( PersistentEntity persistentEntity, final String family, Serializable key) { final String hashKey = getRedisKey(family, key); final List<String> props = persistentEntity.getPersistentPropertyNames(); final String[] values = redisTemplate.hmget(hashKey, props.toArray(new String[props.size()])); if (entityDoesntExistForValues(values)) return null; RedisEntry entry = new RedisEntry(family); for (int i = 0; i < props.size(); i++) { entry.put(props.get(i), values[i]); } return entry; }
@Override protected void deleteEntry(final String family, final Long key) { final String actualKey = family + ":" + key; getAllEntityIndex().remove(key); redisTemplate.del(actualKey); }
protected Long generateIdentifier(final String family) { long id = redisTemplate.incr(family + ".next_id"); getAllEntityIndex().add(id); return id; }
private Long performInsertion(final String family, final Long id, final RedisEntry nativeEntry) { String key = family + ":" + id; redisTemplate.hmset(key, nativeEntry); return id; }