Index: src/bp-xprofile/bp-xprofile-cache.php
--- src/bp-xprofile/bp-xprofile-cache.php
+++ src/bp-xprofile/bp-xprofile-cache.php
@@ -13,6 +13,29 @@
 if ( !defined( 'ABSPATH' ) ) exit;
 
 /**
+ * Determine which xprofile fields do not have cached values for a user.
+ *
+ * @since BuddyPress (2.2.0)
+ *
+ * @param int   $user_id   User ID to check
+ * @param array $field_ids XProfile field IDs.
+ * @return array
+ */
+function bp_xprofile_get_non_cached_field_ids( $user_id = 0, $field_ids = array() ) {
+	$uncached_fields = array();
+
+	foreach ( $field_ids as $field_id ) {
+		$field_id  = (int) $field_id;
+		$cache_key = "{$user_id}:{$field_id}";
+		if ( false === wp_cache_get( $cache_key, 'bp_xprofile_data' ) ) {
+			$uncached_fields[] = $field_id;
+		}
+	}
+
+	return $uncached_fields;
+}
+
+/**
  * Slurp up xprofilemeta for a specified set of profile objects.
  *
  * We do not use bp_update_meta_cache() for the xprofile component. This is
@@ -40,7 +63,7 @@
 	$uncached_object_ids = array(
 		'group' => array(),
 		'field' => array(),
-		'data'   => array(),
+		'data'  => array(),
 	);
 
 	$cache_groups = array(
@@ -170,9 +193,9 @@
  * @param BP_XProfile_ProfileData $data_obj
  */
 function xprofile_clear_profiledata_object_cache( $data_obj ) {
-	wp_cache_delete( $data_obj->field_id, 'bp_xprofile_data_' . $data_obj->user_id );
+	wp_cache_delete( "{$data_obj->user_id}:{$data_obj->field_id}", 'bp_xprofile_data' );
 }
-add_action( 'xprofile_data_after_save', 'xprofile_clear_profiledata_object_cache' );
+add_action( 'xprofile_data_after_save',   'xprofile_clear_profiledata_object_cache' );
 add_action( 'xprofile_data_after_delete', 'xprofile_clear_profiledata_object_cache' );
 
 /**
Index: src/bp-xprofile/bp-xprofile-classes.php
--- src/bp-xprofile/bp-xprofile-classes.php
+++ src/bp-xprofile/bp-xprofile-classes.php
@@ -1222,15 +1222,15 @@
 	public function populate( $field_id, $user_id )  {
 		global $wpdb, $bp;
 
-		$cache_group = 'bp_xprofile_data_' . $user_id;
-		$profiledata = wp_cache_get( $field_id, $cache_group );
+		$cache_key   = "{$user_id}:{$field_id}";
+		$profiledata = wp_cache_get( $cache_key, 'bp_xprofile_data' );
 
 		if ( false === $profiledata ) {
-			$sql = $wpdb->prepare( "SELECT * FROM {$bp->profile->table_name_data} WHERE field_id = %d AND user_id = %d", $field_id, $user_id );
+			$sql         = $wpdb->prepare( "SELECT * FROM {$bp->profile->table_name_data} WHERE field_id = %d AND user_id = %d", $field_id, $user_id );
 			$profiledata = $wpdb->get_row( $sql );
 
 			if ( $profiledata ) {
-				wp_cache_set( $field_id, $profiledata, $cache_group );
+				wp_cache_set( $cache_key, $profiledata, 'bp_xprofile_data' );
 			}
 		}
 
@@ -1259,7 +1259,8 @@
 		global $wpdb, $bp;
 
 		// Check cache first
-		$cached = wp_cache_get( $this->field_id, 'bp_xprofile_data_' . $this->user_id );
+		$cache_key = "{$this->user_id}:{$this->field_id}";
+		$cached    = wp_cache_get( $cache_key, 'bp_xprofile_data' );
 
 		if ( $cached && ! empty( $cached->id ) ) {
 			$retval = true;
@@ -1400,10 +1401,8 @@
 
 		$data = array();
 
-		$cache_group = 'bp_xprofile_data_' . $user_id;
+		$uncached_field_ids = bp_xprofile_get_non_cached_field_ids( $user_id, $field_ids, 'bp_xprofile_data' );
 
-		$uncached_field_ids = bp_get_non_cached_ids( $field_ids, $cache_group );
-
 		// Prime the cache
 		if ( ! empty( $uncached_field_ids ) ) {
 			$bp = buddypress();
@@ -1426,9 +1425,11 @@
 			// Set caches
 			foreach ( $uncached_field_ids as $field_id ) {
 
+				$cache_key = "{$user_id}:{$field_id}";
+
 				// If a value was found, cache it
 				if ( isset( $queried_data[ $field_id ] ) ) {
-					wp_cache_set( $field_id, $queried_data[ $field_id ], $cache_group );
+					wp_cache_set( $cache_key, $queried_data[ $field_id ], 'bp_xprofile_data' );
 
 				// If no value was found, cache an empty item
 				// to avoid future cache misses
@@ -1440,14 +1441,15 @@
 					$d->value        = '';
 					$d->last_updated = '';
 
-					wp_cache_set( $field_id, $d, $cache_group );
+					wp_cache_set( $cache_key, $d, 'bp_xprofile_data' );
 				}
 			}
 		}
 
 		// Now that all items are cached, fetch them
 		foreach ( $field_ids as $field_id ) {
-			$data[] = wp_cache_get( $field_id, $cache_group );
+			$cache_key = "{$user_id}:{$field_id}";
+			$data[]    = wp_cache_get( $cache_key, 'bp_xprofile_data' );
 		}
 
 		return $data;
@@ -1460,7 +1462,6 @@
 	 * @return array
 	 */
 	public static function get_all_for_user( $user_id ) {
-		global $wpdb, $bp;
 
 		$groups = bp_xprofile_get_groups( array(
 			'user_id'                => $user_id,
@@ -1514,7 +1515,8 @@
 		} else {
 
 			// Check cache first
-			$fielddata = wp_cache_get( $field_id, 'bp_xprofile_data_' . $user_id );
+			$cache_key = "{$user_id}:{$field_id}";
+			$fielddata = wp_cache_get( $cache_key, 'bp_xprofile_data' );
 			if ( false === $fielddata || empty( $fielddata->id ) ) {
 				$fielddata_id = $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$bp->profile->table_name_data} WHERE field_id = %d AND user_id = %d", $field_id, $user_id ) );
 			} else {
@@ -1551,7 +1553,8 @@
 		// Assemble uncached IDs
 		$uncached_ids = array();
 		foreach ( $user_ids as $user_id ) {
-			if ( false === wp_cache_get( $field_id, 'bp_xprofile_data_' . $user_id ) ) {
+			$cache_key = "{$user_id}:{$field_id}";
+			if ( false === wp_cache_get( $cache_key, 'bp_xprofile_data' ) ) {
 				$uncached_ids[] = $user_id;
 			}
 		}
@@ -1583,14 +1586,16 @@
 					$d->last_updated = '';
 				}
 
-				wp_cache_set( $field_id, $d, 'bp_xprofile_data_' . $d->user_id );
+				$cache_key = "{$d->user_id}:{$field_id}";
+				wp_cache_set( $cache_key, $d, 'bp_xprofile_data' );
 			}
 		}
 
 		// Now that the cache is primed with all data, fetch it
 		$data = array();
 		foreach ( $user_ids as $user_id ) {
-			$data[] = wp_cache_get( $field_id, 'bp_xprofile_data_' . $user_id );
+			$cache_key = "{$user_id}:{$field_id}";
+			$data[]    = wp_cache_get( $cache_key, 'bp_xprofile_data' );
 		}
 
 		// If a single ID was passed, just return the value
Index: src/bp-xprofile/bp-xprofile-loader.php
--- src/bp-xprofile/bp-xprofile-loader.php
+++ src/bp-xprofile/bp-xprofile-loader.php
@@ -353,6 +353,23 @@
 	}
 
 	/**
+	 * Setup cache groups
+	 *
+	 * @since BuddyPress (2.2.0)
+	 */
+	public function setup_cache_groups() {
+
+		// Global groups
+		wp_cache_add_global_groups( array(
+			'bp_xprofile',
+			'bp_xprofile_data',
+			//'xprofile_meta'
+		) );
+
+		parent::setup_cache_groups();
+	}
+
+	/**
 	 * Adds "Settings > Profile" subnav item under the "Settings" adminbar menu.
 	 *
 	 * @since BuddyPress (2.0.0)
Index: tests/phpunit/testcases/members/functions.php
--- tests/phpunit/testcases/members/functions.php
+++ tests/phpunit/testcases/members/functions.php
@@ -183,7 +183,7 @@
 		global $wpdb, $bp;
 		$wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->profile->table_name_data} WHERE user_id = %d AND field_id = 1", $u ) );
 		wp_cache_delete( 'bp_user_fullname_' . $u, 'bp' );
-		wp_cache_delete( 1, 'bp_xprofile_data_' . $u, 'bp' );
+		wp_cache_delete( "{$u}:1", 'bp_xprofile_data', 'bp' );
 
 		$this->assertSame( '', xprofile_get_field_data( 1, $u ) );
 		$this->assertSame( 'Foo Foo', bp_core_get_user_displayname( $u ) );
Index: tests/phpunit/testcases/xprofile/class-bp-xprofile-profiledata.php
--- tests/phpunit/testcases/xprofile/class-bp-xprofile-profiledata.php
+++ tests/phpunit/testcases/xprofile/class-bp-xprofile-profiledata.php
@@ -36,7 +36,7 @@
 
 		$d = new BP_XProfile_ProfileData( $f, $u );
 
-		wp_cache_delete( $f, 'bp_xprofile_data_' . $u );
+		wp_cache_delete( "{$u}:{$f}", 'bp_xprofile_data' );
 
 		$this->assertTrue( $d->exists() );
 	}
@@ -56,7 +56,7 @@
 		// Fake the cache
 		$c = new stdClass;
 		$c->id = 3;
-		wp_cache_set( $f, $c, 'bp_xprofile_data_' . $u );
+		wp_cache_set( "{$u}:{$f}", $c, 'bp_xprofile_data' );
 
 		$this->assertTrue( $d->exists() );
 	}
@@ -73,7 +73,7 @@
 		) );
 
 		// Just to be sure
-		wp_cache_delete( $f, 'bp_xprofile_data_' . $u );
+		wp_cache_delete( "{$u}:{$f}", 'bp_xprofile_data' );
 
 		$this->assertEquals( 0, BP_XProfile_ProfileData::get_fielddataid_byid( $f, $u ) );
 	}
@@ -96,7 +96,7 @@
 		$d->save();
 
 		// Ensure it's deleted from cache
-		wp_cache_delete( $f, 'bp_xprofile_data_' . $u );
+		wp_cache_delete( "{$u}:{$f}", 'bp_xprofile_data' );
 
 		$this->assertEquals( $d->id, BP_XProfile_ProfileData::get_fielddataid_byid( $f, $u ) );
 	}
@@ -115,7 +115,7 @@
 		// Fake the cache
 		$d = new stdClass;
 		$d->id = 5;
-		wp_cache_set( $f, $d, 'bp_xprofile_data_' . $u );
+		wp_cache_set( "{$u}:{$f}", $d, 'bp_xprofile_data' );
 
 		$this->assertSame( 5, BP_XProfile_ProfileData::get_fielddataid_byid( $f, $u ) );
 	}
@@ -138,7 +138,7 @@
 		$d->save();
 
 		// Ensure it's deleted from cache
-		wp_cache_delete( $f, 'bp_xprofile_data_' . $u );
+		wp_cache_delete( "{$u}:{$f}", 'bp_xprofile_data' );
 
 		$this->assertSame( 'foo', BP_XProfile_ProfileData::get_value_byid( $f, $u ) );
 	}
@@ -179,8 +179,8 @@
 		remove_filter( 'xprofile_data_last_updated_before_save', array( $this, 'filter_time' ) );
 
 		// Ensure it's deleted from cache
-		wp_cache_delete( $f, 'bp_xprofile_data_' . $u1 );
-		wp_cache_delete( $f, 'bp_xprofile_data_' . $u2 );
+		wp_cache_delete( "{$u1}:{$f}", 'bp_xprofile_data' );
+		wp_cache_delete( "{$u2}:{$f}", 'bp_xprofile_data' );
 
 		$eu1 = new stdClass;
 		$eu1->user_id = $u1;
@@ -218,7 +218,7 @@
 		$d = new stdClass;
 		$d->value = 'foo';
 		$d->field_id = $f;
-		wp_cache_set( $f, $d, 'bp_xprofile_data_' . $u );
+		wp_cache_set( "{$u}:{$f}", $d, 'bp_xprofile_data' );
 
 		$this->assertSame( 'foo', BP_XProfile_ProfileData::get_value_byid( $f, $u ) );
 	}
@@ -252,8 +252,8 @@
 		$d2->value = 'bar';
 		$d2->last_updated = $time;
 
-		wp_cache_set( $f, $d1, 'bp_xprofile_data_' . $u1 );
-		wp_cache_set( $f, $d2, 'bp_xprofile_data_' . $u2 );
+		wp_cache_set( "{$u1}:{$f}", $d1, 'bp_xprofile_data' );
+		wp_cache_set( "{$u2}:{$f}", $d2, 'bp_xprofile_data' );
 
 		$eu1 = new stdClass;
 		$eu1->id = 10;
@@ -313,8 +313,8 @@
 		$d2->save();
 
 		// Ensure it's deleted from cache
-		wp_cache_delete( $f1, 'bp_xprofile_data_' . $u );
-		wp_cache_delete( $f2, 'bp_xprofile_data_' . $u );
+		wp_cache_delete( "{$u}:{$f1}", 'bp_xprofile_data' );
+		wp_cache_delete( "{$u}:{$f2}", 'bp_xprofile_data' );
 
 		$u_obj = new WP_User( $u );
 
@@ -389,8 +389,8 @@
 		$d2->last_updated = $time;
 		$d2->id = 2;
 
-		wp_cache_set( $f1, $d1, 'bp_xprofile_data_' . $u );
-		wp_cache_set( $f2, $d2, 'bp_xprofile_data_' . $u );
+		wp_cache_set( "{$u}:{$f1}", $d1, 'bp_xprofile_data' );
+		wp_cache_set( "{$u}:{$f2}", $d2, 'bp_xprofile_data' );
 
 		$u_obj = new WP_User( $u );
 
