Start typing to search packages!
raddish
By @verifiedhawaii
Roblox
Mirrored╔═══════════════════════════════════════════════════════════════════════════╗
║ ║
║ ██████╗ █████╗ ██████╗ ██████╗ ██╗███████╗██╗ ██╗ ║
║ ██╔══██╗██╔══██╗██╔══██╗██╔══██╗██║██╔════╝██║ ██║ ║
║ ██████╔╝███████║██║ ██║██║ ██║██║███████╗███████║ ║
║ ██╔══██╗██╔══██║██║ ██║██║ ██║██║╚════██║██╔══██║ ║
║ ██║ ██║██║ ██║██████╔╝██████╔╝██║███████║██║ ██║ ║
║ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═════╝ ╚═╝╚══════╝╚═╝ ╚═╝ ║
║ ║
║ Redis-like In-Memory Cache & Networking for Roblox ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════╝
⚡ Lightning-fast in-memory caching • 🔄 Cross-server events • 🌐 External APIs
Features • Installation • Quick Start • Documentation • Contributing
🎯 What is Raddish?
Raddish is a Redis-like caching and networking system built specifically for Roblox. It solves the biggest pain points of game development:
- DataStore is slow (100-300ms per call) → Raddish caches everything in memory (<1ms)
- No cross-server communication → Raddish provides Pub/Sub events
- External APIs are hard → Raddish handles caching, retries, and rate limiting
- Complex data structures → Raddish provides Hashes, Lists, Sets, and Sorted Sets
Why Raddish?
| Traditional Approach | With Raddish | Improvement |
|---|---|---|
| 100-300ms per DataStore call | <1ms from cache | 100-300x faster |
| No cross-server events | Real-time Pub/Sub | New capability! |
| Manual API handling | Auto-caching & retry | 50-500x faster |
| Basic key-value only | Redis data structures | More powerful |
✨ Features
🚀 Core Features
|
📊 Data Structures
|
🌐 Networking
|
🎮 Game-Ready
|
📦 Installation
Manual Installation
- Download the latest release from Releases
- Extract the
Raddishfolder - Place it in
ReplicatedStorageorServerScriptServicein Roblox Studio
Verify Installation
local Raddish = require(game.ReplicatedStorage.Raddish)
print("Raddish loaded successfully!")
🚀 Quick Start
Basic Usage
local Raddish = require(game.ReplicatedStorage.Raddish)
-- Store data with auto-expiration
Raddish.Set("player:123:health", 100, 60) -- Expires in 60 seconds
-- Get data (instant!)
local health = Raddish.Get("player:123:health")
print(health) -- 100
-- Increment counter
Raddish.Incr("visits") -- 1
Raddish.Incr("visits") -- 2
-- Check if key exists
if Raddish.Exists("player:123:health") then
print("Player is alive!")
end
Player Data Management
local Raddish = require(game.ReplicatedStorage.Raddish)
game.Players.PlayerAdded:Connect(function(player)
-- Load player data (cached after first load)
local coins = Raddish.GetWithCache(player, "Coins", 0, 300)
local level = Raddish.GetWithCache(player, "Level", 1, 300)
player:SetAttribute("Coins", coins)
player:SetAttribute("Level", level)
print(player.Name, "has", coins, "coins and is level", level)
end)
function giveCoins(player, amount)
local newCoins = Raddish.IncrementWithCache(player, "Coins", amount, 0, 300)
player:SetAttribute("Coins", newCoins)
return newCoins
end
game.Players.PlayerRemoving:Connect(function(player)
-- Auto-save player data
Raddish.FlushPlayer(player)
end)
Global Leaderboard
local Raddish = require(game.ReplicatedStorage.Raddish)
-- Add players to leaderboard
Raddish.ZAdd("leaderboard:global", 9999, "VerifiedHawaii")
Raddish.ZAdd("leaderboard:global", 5000, "Player2")
Raddish.ZAdd("leaderboard:global", 7500, "Player3")
-- Get top 10 players
local top10 = Raddish.ZRange("leaderboard:global", 1, 10, true)
for i, entry in ipairs(top10) do
print(i, entry.member, entry.score)
end
-- Get player's rank
local rank = Raddish.ZRank("leaderboard:global", "VerifiedHawaii")
print("Rank:", rank + 1)
-- Update score
Raddish.ZIncrBy("leaderboard:global", 1000, "Player2")
Cross-Server Events
local Raddish = require(game.ReplicatedStorage.Raddish)
-- Subscribe to events (all servers)
Raddish.Subscribe("global:announcement", function(data)
print("Announcement:", data.message)
-- Show to all players on this server
for _, player in ipairs(game.Players:GetPlayers()) do
game.ReplicatedStorage.ShowAnnouncement:FireClient(player, data.message)
end
end)
-- Publish event (from any server, reaches all servers)
Raddish.Publish("global:announcement", {
message = "Server maintenance in 10 minutes!",
timestamp = os.time()
})
External API Integration
local Raddish = require(game.ReplicatedStorage.Raddish)
-- Fetch data from your backend with caching
local response = Raddish.HttpGet("https://api.yourgame.com/player/123", {
cache = true,
cacheTTL = 300, -- Cache for 5 minutes
headers = {
["Authorization"] = "Bearer your-api-key"
}
})
if response.Success then
print("Player level:", response.Body.level)
else
warn("API error:", response.StatusMessage)
end
Discord Webhooks
local Raddish = require(game.ReplicatedStorage.Raddish)
local WEBHOOK_URL = "https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN"
-- Rich embed
Raddish.SendDiscordWebhook(WEBHOOK_URL, {
title = "Player Achievement",
description = "VerifiedHawaii reached level 100!",
color = 0x00FF00, -- Green
fields = {
{name = "Player", value = "VerifiedHawaii", inline = true},
{name = "Level", value = "100", inline = true},
{name = "Time Played", value = "50 hours", inline = true}
},
footer = {text = "Achievement System"},
username = "Achievement Bot"
})
Player Profile with Hashes
local Raddish = require(game.ReplicatedStorage.Raddish)
-- Store player profile data
Raddish.HSet("player:123", "name", "VerifiedHawaii")
Raddish.HSet("player:123", "level", 50)
Raddish.HSet("player:123", "gold", 1000)
Raddish.HSet("player:123", "vip", true)
-- Get specific field
local name = Raddish.HGet("player:123", "name")
print(name) -- "VerifiedHawaii"
-- Get all fields
local profile = Raddish.HGetAll("player:123")
print(profile)
-- {name = "VerifiedHawaii", level = 50, gold = 1000, vip = true}
-- Check if field exists
if Raddish.HExists("player:123", "vip") then
print("Player is VIP!")
end
📚 Documentation
Full Documentation
👉 docs.hawaiian.gg/raddish/getting-started
Quick Links
API Overview
Cache Operations
Raddish.Set(key, value, ttl) -- Store with optional TTL
Raddish.Get(key) -- Retrieve value
Raddish.Delete(key) -- Delete key
Raddish.Exists(key) -- Check if exists
Raddish.Expire(key, ttl) -- Set expiration
Raddish.TTL(key) -- Get remaining TTL
Raddish.Keys(pattern) -- Find keys (wildcards)
Raddish.Incr(key) -- Increment by 1
Raddish.Decr(key) -- Decrement by 1
Raddish.FlushAll() -- Clear all cache
Raddish.GetStats() -- Get cache statistics
Hashes
Raddish.HSet(hash, field, value) -- Set field
Raddish.HGet(hash, field) -- Get field
Raddish.HGetAll(hash) -- Get all fields
Raddish.HDel(hash, field) -- Delete field
Raddish.HExists(hash, field) -- Check if exists
Raddish.HKeys(hash) -- Get all field names
Raddish.HVals(hash) -- Get all values
Raddish.HLen(hash) -- Get field count
Lists
Raddish.LPush(key, value) -- Push to left (start)
Raddish.RPush(key, value) -- Push to right (end)
Raddish.LPop(key) -- Pop from left
Raddish.RPop(key) -- Pop from right
Raddish.LRange(key, start, stop) -- Get range
Raddish.LLen(key) -- Get length
Raddish.LIndex(key, index) -- Get by index
Sets
Raddish.SAdd(key, member) -- Add member
Raddish.SRem(key, member) -- Remove member
Raddish.SIsMember(key, member) -- Check membership (O(1))
Raddish.SMembers(key) -- Get all members
Raddish.SCard(key) -- Get size
Sorted Sets
Raddish.ZAdd(key, score, member) -- Add with score
Raddish.ZRem(key, member) -- Remove member
Raddish.ZRange(key, start, stop) -- Get range (sorted)
Raddish.ZRangeByScore(key, min, max) -- Get by score range
Raddish.ZScore(key, member) -- Get score
Raddish.ZRank(key, member) -- Get rank (0-indexed)
Raddish.ZIncrBy(key, delta, member) -- Increment score
Raddish.ZCard(key) -- Get size
Pub/Sub
Raddish.Publish(channel, data) -- Broadcast to all servers
Raddish.Subscribe(channel, callback) -- Listen for events
Raddish.GetHistory(channel, limit) -- Get event history
Raddish.GetSubscriberCount(channel) -- Get subscriber count
Raddish.UnsubscribeAll(channel) -- Remove all subscribers
Networking
Raddish.HttpGet(url, options) -- GET request
Raddish.HttpPost(url, data, options) -- POST request
Raddish.HttpPut(url, data, options) -- PUT request
Raddish.HttpDelete(url, options) -- DELETE request
Raddish.HttpPatch(url, data, options) -- PATCH request
Raddish.HttpBatch(requests) -- Batch multiple requests
Raddish.SendWebhook(url, data) -- Generic webhook
Raddish.SendDiscordWebhook(url, opts) -- Discord webhook
Raddish.APIRequest(base, endpoint) -- REST API helper
Raddish.InvalidateHttpCache(url) -- Clear cached response
Raddish.ClearHttpCache() -- Clear all HTTP cache
Raddish.GetNetworkStats() -- Get request stats
DataStore Bridge
Raddish.GetWithCache(player, key, default, ttl)
Raddish.SetWithCache(player, key, value, ttl)
Raddish.IncrementWithCache(player, key, delta, default, ttl)
Raddish.InvalidateCache(player, key)
Raddish.Flush() -- Save all pending writes
Raddish.FlushPlayer(player) -- Save player data
⚙️ Configuration
You can configure Raddish by editing these values in the module files:
CacheManager.lua
local MAX_CACHE_SIZE = 10000 -- Maximum cached items
local DEFAULT_TTL = 300 -- Default expiration (5 minutes)
NetworkingModule.lua
local MAX_RETRIES = 3 -- HTTP retry attempts
local RETRY_DELAY = 2 -- Retry delay (seconds)
local RATE_LIMIT_WINDOW = 60 -- Rate limit window (seconds)
local MAX_REQUESTS_PER_WINDOW = 100 -- Max requests per window
DataStoreBridge.lua
local USE_WRITE_THROUGH = true -- Write to DataStore immediately
local WRITE_BACK_INTERVAL = 30 -- Batch write interval (seconds)
📊 Performance
| Operation | Traditional | With Raddish | Improvement |
|---|---|---|---|
| Get player data | 100-300ms | <1ms | 100-300x faster |
| Update leaderboard | 100-300ms | <1ms | 100-300x faster |
| Check if online | Loop through players | <1ms | 1000x+ faster |
| Cross-server event | Not possible | 100-500ms | ∞ (NEW!) |
| External API (cached) | 50-500ms | <1ms | 50-500x faster |
🤝 Contributing
Contributions are welcome! Here's how you can help:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Development Setup
# Clone the repository
git clone https://github.com/VerifiedHawaii/Raddish.git
# Create a branch for your feature
cd Raddish
git checkout -b feature/my-feature
# Make your changes and test in Roblox Studio
# Commit and push
git add .
git commit -m "Add my feature"
git push origin feature/my-feature
Guidelines
- Follow the existing code style
- Add comments for complex logic
- Update documentation for new features
- Test thoroughly in Roblox Studio
- Keep commits focused and descriptive
🐛 Bug Reports
Found a bug? Please open an issue with:
- Clear title and description
- Steps to reproduce
- Expected vs actual behavior
- Roblox Studio version
- Any error messages
💡 Feature Requests
Have an idea? Open a discussion and let's talk about it!
📝 License
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2025 VerifiedHawaii
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
🙏 Acknowledgments
- Inspired by Redis - The amazing in-memory data store
- Built for the Roblox game development community
- Thanks to all contributors
📞 Support
- Documentation: docs.hawaiian.gg/raddish/getting-started
- Discord: Join our server
- Email: support@hawaiian.gg
- Issues: GitHub Issues
- Discussions: GitHub Discussions
⭐ Star History
If you find Raddish useful, please consider giving it a star! It helps others discover the project.
Built with ❤️ by VerifiedHawaii
Package Details
Install command (Click to copy)
Version
1.0.1
License
MIT
Safe for commercial use
Automated license review — not legal advice.
