# perl
my $memclient = Cache::Memcached->new({ servers => [ '10.0.0.10:11211', '10.0.0.11:11211' ]});
# pseudocode
memcli = new Memcache
memcli:add_server('10.0.0.10:11211')
某些客户端的实现可能允许重复添加同一个Server,但最好每个Server是有一个实例,而且也要注意他们的顺序最好不要经常变化,防止key的重新映射;在初始化MemcacheClient的时候要注意实例化的次数,不要太过频繁的实例化,最好通过连接池来管理。
封装一个SQL作为key
Memcache在减轻数据库负载方面发挥着重要的作用,我们最常使用的场景也是用它来减少数据库查询次数,下面这个例子就是通过Cache缓存查询数据库结果的场景,把sql+userId作为一个key,相同用户第二次查询时就可以从缓存中直接提取:
# Don't load little bobby tables
sql = "SELECT * FROM user WHERE user_id = ?"
key = 'SQL:' . user_id . ':' . md5sum(sql)
# We check if the value is 'defined', since '0' or 'FALSE' # can be
# legitimate values!
if (defined result = memcli:get(key)) {
return result
} else {
handler = run_sql(sql, user_id)
# Often what you get back when executing SQL is a special handler
# object. You can't directly cache this. Stick to strings, arrays,
# and hashes/dictionaries/tables
rows_array = handler:turn_into_an_array
# Cache it for five minutes
memcli:set(key, rows_array, 5 * 60)
return rows_array
}
注意:在通过set方法缓存数据时,我们可以指定数据过期时间,上面例子中设置的是5分钟,这样的话,五分钟内用户看到的都是同样的信息,即5分钟内的数据变化用户是感觉不到的,在开发时一定要注意根据实际情况对过期时间进行合理设置。
封装多个查询SQL作为Key
有些处理过程是复杂的,可能会用到多个sql,如果我们能把这些复杂的处理最后封装成一个key,这是最理想的结果。比如下面这个例子,我们把sql1+sql2+userId作为一个key,这样,我们两次查询的结果便封装成了一个CacheItem:
sql1 = "SELECT * FROM user WHERE user_id = ?"
sql2 = "SELECT * FROM user_preferences WHERE user_id = ?"
key = 'SQL:' . user_id . ':' . md5sum(sql1 . sql2)
if (defined result = memcli:get(key)) {
return result
} else {
# Remember to add error handling, kids ;)
handler = run_sql(sql1, user_id)
t[info] = handler:turn_into_an_array
handler = run_sql(sql2, user_id)
t[pref] = handler:turn_into_an_array
# Client will magically take this hash/table/dict/etc
# and serialize it for us.
memcli:set(key, t, 5 * 60)
return t
} 缓存Object类型的数据