templates/skills/services/memcached/SKILL.md
Use Memcached for simple, high-performance distributed caching with minimal overhead.
npx skillsauth add hivellm/rulebook MemcachedInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
CRITICAL: Use Memcached for simple, high-performance distributed caching with minimal overhead.
// Using memcached (Node.js)
import Memcached from 'memcached'
const memcached = new Memcached(process.env.MEMCACHED_SERVERS || 'localhost:11211', {
maxKeySize: 250,
maxExpiration: 2592000, // 30 days
maxValue: 1048576, // 1MB
poolSize: 10,
reconnect: true,
timeout: 5000,
retries: 3,
retry: 1000,
remove: true,
idle: 5000,
})
// Set
memcached.set('user:1', { name: 'John', email: '[email protected]' }, 3600, (err) => {
// Expires in 1 hour
})
// Get
memcached.get('user:1', (err, data) => {
console.log(data)
})
// Delete
memcached.del('user:1', (err) => {
// Deleted
})
// Replace (only if key exists)
memcached.replace('user:1', newData, 3600, (err) => {
// Replaced
})
// Add (only if key doesn't exist)
memcached.add('user:1', data, 3600, (err) => {
// Added
})
// Multiple gets
memcached.getMulti(['user:1', 'user:2', 'user:3'], (err, data) => {
// Returns object with keys as properties
})
// Increment/Decrement
memcached.incr('counter', 1, (err, value) => {
// Incremented
})
memcached.decr('counter', 1, (err, value) => {
// Decremented
})
// Touch (update expiration)
memcached.touch('user:1', 7200, (err) => {
// Expiration updated to 2 hours
})
// Stats
memcached.stats((err, stats) => {
console.log(stats)
})
function getCached(key: string): Promise<any> {
return new Promise((resolve, reject) => {
memcached.get(key, (err, data) => {
if (err) reject(err)
else resolve(data)
})
})
}
function setCached(key: string, value: any, ttl: number): Promise<void> {
return new Promise((resolve, reject) => {
memcached.set(key, value, ttl, (err) => {
if (err) reject(err)
else resolve()
})
})
}
// Usage
async function getCachedUser(userId: string) {
const cached = await getCached(`user:${userId}`)
if (cached) {
return cached
}
const user = await fetchUserFromDatabase(userId)
await setCached(`user:${userId}`, user, 3600)
return user
}
async function getWithCache(key: string, fetchFn: () => Promise<any>, ttl: number) {
try {
const cached = await getCached(key)
if (cached) {
return cached
}
} catch (err) {
// Cache miss or error, continue to fetch
}
const data = await fetchFn()
try {
await setCached(key, data, ttl)
} catch (err) {
// Cache set failed, but we have the data
}
return data
}
async function checkRateLimit(identifier: string, limit: number, window: number): Promise<boolean> {
const key = `ratelimit:${identifier}`
return new Promise((resolve) => {
memcached.incr(key, 1, (err, value) => {
if (err || value === false) {
// Key doesn't exist, create it
memcached.set(key, 1, window, () => {
resolve(true)
})
} else if (value > limit) {
resolve(false)
} else {
if (value === 1) {
// First increment, set expiration
memcached.touch(key, window, () => {})
}
resolve(true)
}
})
})
}
✅ DO:
❌ DON'T:
MEMCACHED_SERVERS=localhost:11211
MEMCACHED_SERVERS=server1:11211,server2:11211,server3:11211
services:
memcached:
image: memcached:1.6-alpine
ports:
- "11211:11211"
command: ["-m", "64", "-I", "1m"] # 64MB memory, 1MB max item size
healthcheck:
test: ["CMD", "nc", "-z", "localhost", "11211"]
interval: 10s
timeout: 5s
retries: 5
// Use test Memcached instance
const testMemcached = new Memcached('localhost:11212') // Different port
// Clean up after tests
afterEach((done) => {
testMemcached.flush((err) => {
done()
})
})
function checkMemcachedHealth(): Promise<boolean> {
return new Promise((resolve) => {
memcached.stats((err) => {
resolve(!err)
})
})
}
<!-- MEMCACHED:END -->research
Author a rulebook task spec interactively — research, draft, ask the user clarifying questions, confirm, then create the tasks in rulebook ready for /rulebook-driver. Use when the user wants to plan/spec a feature before implementing.
development
Behavioral guidelines to reduce common LLM coding mistakes — overcomplication, sloppy refactors, hidden assumptions, weak goals. Use when writing, reviewing, or refactoring code. Auto-applies; invoke explicitly via /karpathy-guidelines or 'follow karpathy discipline'.
data-ai
Autonomous AI agent loop for iterative task implementation (@hivehub/rulebook ralph)
data-ai
Use SQL Server for enterprise relational data storage with advanced features, high availability, and Windows integration.