TL;DR: Raddish is a high-performance, Redis-inspired caching and networking system for Roblox that’s 100-1000x faster than DataStore for frequently accessed data.
What is Raddish?
Raddish brings Redis-like functionality to Roblox, providing blazing-fast in-memory caching, cross-server pub/sub, and powerful networking utilities - all in one lightweight module.
Key Features
Lightning-Fast Cache - 100-1000x faster than DataStore with automatic TTL expiration
Cross-Server Pub/Sub - Real-time event broadcasting via MessagingService
Redis Data Structures - Hashes, Lists, Sets, and Sorted Sets
DataStore Bridge - Automatic syncing with write-through/write-back modes
HTTP Client - Built-in external API support with caching and retry logic
Rate Limiting - Automatic protection for all services
LRU Eviction - Smart memory management (configurable max capacity)
Installation
Via Roblox Creator Store
Click the link above, then insert into ReplicatedStorage in Studio.
Via Wally (Recommended for Developers)
[dependencies]
Raddish = "verifiedhawaii/raddish@1.0.1"
Then run:
wally install
Manual Download
Download from GitHub Releases
Quick Examples
Basic Caching
local Raddish = require(game.ReplicatedStorage.Raddish)
-- Cache player data with 5-minute TTL
Raddish.Set("player:123:coins", 1000, 300)
-- Retrieve from cache
local coins = Raddish.Get("player:123:coins")
print(coins) -- 1000
-- Atomic increment
Raddish.Incr("player:123:coins", 50)
print(Raddish.Get("player:123:coins")) -- 1050
Cross-Server Events (Pub/Sub)
-- Subscribe to global events
Raddish.Subscribe("server:shutdown", function(data)
print("Server shutting down:", data.reason)
-- Gracefully save player data
end)
-- Publish to all servers
Raddish.Publish("server:shutdown", {
reason = "Maintenance",
duration = 30
})
Leaderboards with Sorted Sets
-- Add player scores
Raddish.ZAdd("global:leaderboard", 1500, "Player1")
Raddish.ZAdd("global:leaderboard", 2300, "Player2")
Raddish.ZAdd("global:leaderboard", 1800, "Player3")
-- Get top 10 players
local top10 = Raddish.ZRange("global:leaderboard", 1, 10, true)
for rank, entry in ipairs(top10) do
print(rank, entry.member, entry.score)
end
-- Output:
-- 1 Player2 2300
-- 2 Player3 1800
-- 3 Player1 1500
DataStore Integration
-- Automatically cache DataStore reads
local playerData = Raddish.GetWithCache(
myDataStore,
"player_123",
300 -- Cache for 5 minutes
)
-- Write-through cache (updates both cache and DataStore)
Raddish.SetWithCache(
myDataStore,
"player_123",
playerData,
300
)
HTTP Requests with Caching
-- Fetch external API with automatic caching
local response = Raddish.HttpGet("https://api.example.com/data", {
cache = true,
cacheTTL = 600, -- Cache for 10 minutes
headers = {
["Authorization"] = "Bearer token123"
}
})
if response.Success then
print(response.Body)
else
warn("Request failed:", response.StatusCode)
end
Use Cases
1. Session Data
Store temporary player data that doesn’t need DataStore persistence:
-- Store active session
Raddish.HSet("session:" .. player.UserId, "joinTime", os.time())
Raddish.HSet("session:" .. player.UserId, "lastAction", "Lobby")
Raddish.Expire("session:" .. player.UserId, 3600) -- 1 hour TTL
2. Rate Limiting
Prevent spam and abuse:
local key = "ratelimit:chat:" .. player.UserId
local count = Raddish.Incr(key)
if count == 1 then
Raddish.Expire(key, 60) -- Reset every minute
end
if count > 10 then
return -- Player exceeded 10 messages per minute
end
3. Real-time Leaderboards
Update and query leaderboards instantly:
-- Update score
Raddish.ZAdd("weekly:kills", kills, player.Name)
-- Get player rank
local rank = Raddish.ZRank("weekly:kills", player.Name, true)
print(player.Name .. " is rank #" .. rank)
4. Cross-Server Coordination
Synchronize events across all servers:
-- Subscribe in all servers
Raddish.Subscribe("game:event:started", function(data)
-- Start event in this server
startEvent(data.eventType)
end)
-- Trigger from one server
Raddish.Publish("game:event:started", {
eventType = "Boss Fight"
})
Performance Comparison
| Operation | DataStore | Raddish Cache | Speedup |
|---|---|---|---|
| Get | ~50-200ms | ~0.1-1ms | 100-2000x |
| Set | ~50-200ms | ~0.1-1ms | 100-2000x |
| Increment | ~100-300ms | ~0.1-1ms | 200-3000x |
| Sorted Set Query | N/A | ~1-5ms | ∞ (not possible) |
Note: Cache performance is for frequently accessed data. DataStore is still required for persistence.
API Overview
Cache Operations
Set(key, value, ttl?)- Store with optional TTLGet(key)- Retrieve valueDel(key)- Delete keyExists(key)- Check if key existsExpire(key, ttl)- Set expirationTTL(key)- Get remaining TTLIncr/Decr(key, amount?)- Atomic increment/decrement
Data Structures
- Hashes:
HSet,HGet,HGetAll,HDel - Lists:
LPush,RPush,LPop,RPop,LRange - Sets:
SAdd,SRem,SMembers,SIsMember - Sorted Sets:
ZAdd,ZRem,ZRange,ZRank,ZScore
Pub/Sub
Subscribe(channel, callback)- Listen for eventsPublish(channel, data)- Broadcast eventUnsubscribe(channel, callback?)- Stop listeningGetHistory(channel, limit?)- Get recent messages
Networking
HttpGet/Post/Put/Delete/Patch(url, options?)- HTTP requestsHttpBatch(requests)- Batch multiple requestsSendDiscordWebhook(url, data)- Discord integration
DataStore Bridge
GetWithCache(dataStore, key, ttl?)- Cached readsSetWithCache(dataStore, key, value, ttl?)- Write-throughIncrementWithCache(dataStore, key, delta, ttl?)- Cached increment
Documentation
Full documentation available at: Getting Started | hawaiian.gg Docs
GitHub Repository: GitHub - VerifiedHawaii/Raddish: A roblox version of Redis · GitHub
Contributing
Contributions are welcome! Feel free to:
- Report bugs
- Suggest features
- Submit pull requests
- Improve documentation
License
MIT License - Free to use in commercial and personal projects.
Made with
by @VerifiedHawaii
