@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;
 }