class RedisOperation implements DisposableBean {
    private static final Logger LOG = LoggerFactory.getLogger(RedisOperation.class);

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private HashOperations<String, String, String> hashOperations;

    @Autowired
    private RedisMessageListenerContainer configMessageListenerContainer;

    public String getConfig(String group, String serviceId) {
        return hashOperations.get(group, serviceId);
    }

    public boolean removeConfig(String group, String serviceId) {
        publishConfig(group, serviceId, StringUtils.EMPTY);

        return hashOperations.delete(group, serviceId) == 1;
    }

    public boolean publishConfig(String group, String serviceId, String config) {<FILL_FUNCTION_BODY>}

    public MessageListenerAdapter subscribeConfig(String group, String serviceId, Object delegate, String listenerMethod) {
        MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(delegate, listenerMethod);
        messageListenerAdapter.afterPropertiesSet();

        configMessageListenerContainer.addMessageListener(messageListenerAdapter, new PatternTopic(group + "-" + serviceId));

        return messageListenerAdapter;
    }

    public void unsubscribeConfig(String group, String serviceId, MessageListenerAdapter messageListenerAdapter) {
        configMessageListenerContainer.removeMessageListener(messageListenerAdapter, new PatternTopic(group + "-" + serviceId));
    }

    public void subscribeConfig(String config, RedisSubscribeCallback redisSubscribeCallback) {
        redisSubscribeCallback.callback(config);
    }

    @Override
    public void destroy() throws Exception {
        configMessageListenerContainer.destroy();

        LOG.info("Shutting down Redis message listener...");
    }
}

        hashOperations.put(group, serviceId, config);
        stringRedisTemplate.convertAndSend(group + "-" + serviceId, config);

        return true;
    
<no_super_class>