# Changelog – cachly SDK (rust)

**Language:** Rust  
**Package:** `cachly` on **crates.io**

> Full cross-SDK release notes: [../CHANGELOG.md](../CHANGELOG.md)

---

## [0.2.0] – 2026-04-07

### Added

- **`mset(items: Vec<MSetItem>)`** – bulk set with per-key TTL via Redis pipeline
- **`mget(keys: &[&str]) -> Vec<Option<Value>>`** – bulk get in one round-trip
- **`lock(key: &str, options: LockOptions) -> Option<LockHandle>`** – distributed lock (SET NX PX + Lua release)
  - Returns `None` when retries exhausted
  - `LockHandle::release()` for early, token-fenced unlock (async)
  - Auto-expires after TTL to prevent deadlocks
- **`stream_set(key: &str, chunks: impl Stream<Item = String>, options: StreamSetOptions)`** – cache token stream via RPUSH
- **`stream_get(key: &str) -> impl Stream<Item = String>`** – replay cached stream; errors on miss

### Fixed

- `Known limitations` section updated – bulk ops now implemented

---

## [0.1.0-beta.1] – 2026-04-07

Initial beta release.

### Added

- `set(key, value, ttl)` – store a value with optional TTL
- `get(key)` – retrieve a value by key
- `delete(key)` – remove a key
- `clear(namespace)` – flush namespace or entire cache
- **Semantic cache:** `client.semantic().set(...)`, `.get(...)`, `.clear()`
- Namespace support via `with_namespace(ns)`
- API-key-based authentication
- TLS by default, EU data residency (German servers)
- Async support via `tokio`

### Known limitations

- ~~Bulk operations (`mset` / `mget`) not yet implemented~~ ✅ resolved in v0.2.0
- Pub/Sub not yet supported

---

## [Unreleased]

See [../CHANGELOG.md](../CHANGELOG.md) for upcoming features.

