Memcached - 获取数据
Memcached - 数据检索
Section titled “Memcached - 数据检索”get 命令是使用键从 Memcached 缓存中检索单个项的主要方式。如果键存在,服务器返回存储的数据。如果键不存在(‘缓存未命中’),服务器不返回任何内容,客户端库通常将其表示为 null 值。
Memcached get 命令的基本语法很简单:
get key在此示例中,我们使用 w3 作为键,并将字符串 memcached 存储在其中,过期时间为 900 秒。
# 首先,设置一个键以便我们可以检索它set w3 0 900 9memcachedSTORED
# 现在,获取与该键关联的数据get w3VALUE w3 0 9memcachedEND使用 Java 客户端获取数据
Section titled “使用 Java 客户端获取数据”使用 spymemcached Java 客户端,get 方法从缓存中检索对象。应用程序逻辑的关键部分是始终检查结果是否为 null,这表示缓存未命中。这允许应用程序随后从主数据源(如数据库)获取数据并填充缓存。
Java 示例
Section titled “Java 示例”import net.spy.memcached.MemcachedClient;import java.net.InetSocketAddress;import java.util.concurrent.Future;
public class GetDataExample { public static void main(String[] args) { MemcachedClient mcc = null; try { mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211)); System.out.println("Connection to server successful.");
// 首先,存储一个值以便我们可以检索它 Future<Boolean> setFuture = mcc.set("language", 900, "Java"); setFuture.get(); // 等待设置操作完成
// --- 缓存命中示例 --- System.out.println("\nAttempting to get key 'language'..."); Object value = mcc.get("language");
// 检查是否缓存命中或未命中 if (value != null) { System.out.println("Cache Hit! Key: 'language', Value: '" + value + "'"); } else { System.out.println("Cache Miss! Key 'language' not found."); }
// --- 缓存未命中示例 --- System.out.println("\nAttempting to get a non-existent key..."); Object missingValue = mcc.get("non_existent_key"); if (missingValue != null) { System.out.println("Cache Hit! Key: 'non_existent_key', Value: '" + missingValue + "'"); } else { System.out.println("Cache Miss! Key 'non_existent_key' not found."); }
} catch (Exception e) { System.err.println("An error occurred: " + e.getMessage()); } finally { if (mcc != null) { mcc.shutdown(); } } }}Connection to server successful.
Attempting to get key 'language'...Cache Hit! Key: 'language', Value: 'Java'
Attempting to get a non-existent key...Cache Miss! Key 'non_existent_key' not found.实际用例:缓存旁路模式
Section titled “实际用例:缓存旁路模式”缓存最常见的用途是减少数据库负载并提高应用程序响应时间。‘缓存旁路’(Cache-Aside)模式是实现此目的的标准策略。
function getUserProfile(userId) { const cacheKey = `user:${userId}:profile`;
// 1. 首先检查缓存 let profile = cache.get(cacheKey);
if (profile !== null) { // 2. 缓存命中:在缓存中找到数据。立即返回。 console.log("Cache Hit!"); return profile; } else { // 3. 缓存未命中:缓存中没有数据。 console.log("Cache Miss. Fetching from database...");
// 4. 查询主数据源(例如,数据库)。 profile = database.query("SELECT * FROM profiles WHERE user_id = ?", userId);
// 5. 将结果存储在缓存中以供后续请求使用。 if (profile) { cache.set(cacheKey, profile, 3600); // 缓存 1 小时 }
return profile; }}