code: @Override
      @SuppressWarnings("unchecked")
      public void storeJob(JobDetail jobDetail, boolean replaceExisting, Jedis jedis) throws ObjectAlreadyExistsException {
          final String jobHashKey = redisSchema.jobHashKey(jobDetail.getKey());
          final String jobDataMapHashKey = redisSchema.jobDataMapHashKey(jobDetail.getKey());
          final String jobGroupSetKey = redisSchema.jobGroupSetKey(jobDetail.getKey());
  
          if(!replaceExisting && jedis.exists(jobHashKey)){
              throw new ObjectAlreadyExistsException(jobDetail);
          }
  
          Pipeline pipe = jedis.pipelined();
          pipe.hmset(jobHashKey, (Map<String, String>) mapper.convertValue(jobDetail, new TypeReference<HashMap<String, String>>() {}));
          if(jobDetail.getJobDataMap() != null && !jobDetail.getJobDataMap().isEmpty()){
              pipe.hmset(jobDataMapHashKey, getStringDataMap(jobDetail.getJobDataMap()));
          }
  
          pipe.sadd(redisSchema.jobsSet(), jobHashKey);
          pipe.sadd(redisSchema.jobGroupsSet(), jobGroupSetKey);
          pipe.sadd(jobGroupSetKey, jobHashKey);
          pipe.sync();
      }
docs: Store a job in Redis
  @param jobDetail the {@link org.quartz.JobDetail} object to be stored
  @param replaceExisting if true, any existing job with the same group and name as the given job will be overwritten
  @param jedis a thread-safe Redis connection
  @throws org.quartz.ObjectAlreadyExistsException