Set custom cache expiration time for a block
There is a real live example of custom cache for drupal 7 in forums:

Asis in Core forum module:

    /**
     * Implements hook_block_view().
     *
     * Generates a block containing the currently active forum topics and the most
     * recently added forum topics.
     */

function forum_block_view($delta = '') {
  $query = db_select('forum_index', 'f')
    -&gt;fields('f')
    -&gt;addTag('node_access');
  switch ($delta) {
    case 'active':
      $title = t('Active forum topics');
      $query
        -&gt;orderBy('f.last_comment_timestamp', 'DESC')
        -&gt;range(0, variable_get('forum_block_num_active', '5'));
      break;

    case 'new':
      $title = t('New forum topics');
      $query
        -&gt;orderBy('f.created', 'DESC')
        -&gt;range(0, variable_get('forum_block_num_new', '5'));
      break;
  }

  $block['subject'] = $title;
  // Cache based on the altered query. Enables us to cache with node access enabled.
  $block['content'] = drupal_render_cache_by_query($query, 'forum_block_view');
  $block['content']['#access'] = user_access('access content');
  return $block;
}


Here drupal_render_cache_by_query does caching based on query result.


  Prepares an element for caching based on a query.
  
  This smart caching strategy saves Drupal from querying and rendering to HTML >when the underlying query is unchanged.
  
  Expensive queries should use the query builder to create the query and then >call this function. Executing the query and formatting results should happen in >a #pre_render callback.


As in quote query executing and rendering happens in hook_block_pre_render() as in forum.

Another Example:

$block['content'] = array(
  '#items' =&gt; custom_module_get_items(),
  '#cache' =&gt; array(
   'cid' =&gt; 'custom_module',
   'bin' =&gt; 'cache',
    'expire' =&gt; time() + (5 * 60),
  ),
);


The above code is similar to what you did with cache_get, cache_set methods in much similar terms with less code, as drupal_render() function handles this for you setting up cache using drupal_render_cache_set(). 

You can read more from here: ADVANCED CACHING WITH RENDERABLE CONTENT

As for cache policy when you are caching stuff with custom code in hook_block_info DRUPAL_CACHE_CUSTOM and DRUPAL_NO_CACHE has no difference. However, using DRUPAL_CACHE_CUSTOM for custom caching is better standard.

Check out Block Caching for drupal 7.