Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys - #395

Merged
MichaConrad merged 4 commits into
devfrom
fix-for-393
Nov 10, 2025
Merged

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys#395
MichaConrad merged 4 commits into
devfrom
fix-for-393

Conversation

@MichaConrad

@MichaConradMichaConrad commented Nov 6, 2025

Copy link
Copy Markdown
Collaborator

Full rewrite of how regions are handled in Redis.
Because of the hashing of keys in cluster scenarios, the region key and all keys of the region must generate the same hash, otherwise the feature wouldn't really work because the LUA script updates the region on Put and Add.

To achieve this, the implementation now makes use of hash keys, the region will be enclosed by { and }.
That means, the full keys is now {<region>}:<key> instead of <region>:<key>.

That also solves an issue where I had to encode the key and region string in case the values contain the : separator.
This logic got removed.

The new implementation also validates key and region to now contain hash keys, at least if regions are used.
You could still only define a key with hash keys as long as you leave the region null.

Also:

  • Rewriting the LUA scripts to use 2 keys, one for the full key and one optional region key which gets used to update the region.

This is technically a bigger breaking change, and, although I'm usually not creating a major version for such a small change, I think it is necessary. Especially because the new region logic is not compatible with the old and reading old values could result in errors.

… optional region key which gets used to update the region.
fixes#393

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors Redis Lua script parameter handling by moving the region parameter from a value parameter (ARGV[7]) to a key parameter (KEYS[2]). This change affects the _scriptAdd and _scriptPut scripts, along with updates to the Eval method signature to accept a regionKey parameter, and updates to all call sites to pass the region as a key.

  • Lua scripts now use KEYS[2] instead of ARGV[7] for region tracking
  • Eval method signature updated to accept RedisKey regionKey parameter
  • All Eval call sites updated to pass region as a key parameter
Comments suppressed due to low confidence (2)

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:871

  • The region parameter at index 6 (line 870) should be removed from the parameters array. The region is now passed as KEYS[2] through the Eval method's regionKey parameter (lines 876, 880), making this ARGV[7] entry redundant and potentially causing incorrect behavior if the scripts reference ARGV indices beyond 6.
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)
var parameters = new RedisValue[]
{
value,
item.ValueType.AssemblyQualifiedName,
(int)item.ExpirationMode,
(long)item.ExpirationTimeout.TotalMilliseconds,
item.CreatedUtc.Ticks,
item.UsesExpirationDefaults,
string.IsNullOrWhiteSpace(item.Region) ? string.Empty : item.Region
};

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:861

  • The comment is incomplete and should be updated to document all parameters. It should be: '// ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks), [6]: usesDefaultExpiration'
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@MichaConradMichaConrad changed the title Rewriting the LUA scripts to use 2 keysRewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keysNov 9, 2025
@MichaConradMichaConrad linked an issue Nov 10, 2025 that may be closed by this pull request
@MichaConradMichaConrad removed a link to an issue Nov 10, 2025
@MichaConrad
MichaConrad merged commit 24507f8 into devNov 10, 2025
2 checks passed
@MichaConrad
MichaConrad deleted the fix-for-393 branch February 18, 2026 00:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@MichaConrad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys - #395

Merged
MichaConrad merged 4 commits into
devfrom
fix-for-393
Nov 10, 2025
Merged

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys#395
MichaConrad merged 4 commits into
devfrom
fix-for-393

Conversation

@MichaConrad

@MichaConradMichaConrad commented Nov 6, 2025

Copy link
Copy Markdown
Collaborator

Full rewrite of how regions are handled in Redis.
Because of the hashing of keys in cluster scenarios, the region key and all keys of the region must generate the same hash, otherwise the feature wouldn't really work because the LUA script updates the region on Put and Add.

To achieve this, the implementation now makes use of hash keys, the region will be enclosed by { and }.
That means, the full keys is now {<region>}:<key> instead of <region>:<key>.

That also solves an issue where I had to encode the key and region string in case the values contain the : separator.
This logic got removed.

The new implementation also validates key and region to now contain hash keys, at least if regions are used.
You could still only define a key with hash keys as long as you leave the region null.

Also:

  • Rewriting the LUA scripts to use 2 keys, one for the full key and one optional region key which gets used to update the region.

This is technically a bigger breaking change, and, although I'm usually not creating a major version for such a small change, I think it is necessary. Especially because the new region logic is not compatible with the old and reading old values could result in errors.

… optional region key which gets used to update the region.
fixes#393

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors Redis Lua script parameter handling by moving the region parameter from a value parameter (ARGV[7]) to a key parameter (KEYS[2]). This change affects the _scriptAdd and _scriptPut scripts, along with updates to the Eval method signature to accept a regionKey parameter, and updates to all call sites to pass the region as a key.

  • Lua scripts now use KEYS[2] instead of ARGV[7] for region tracking
  • Eval method signature updated to accept RedisKey regionKey parameter
  • All Eval call sites updated to pass region as a key parameter
Comments suppressed due to low confidence (2)

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:871

  • The region parameter at index 6 (line 870) should be removed from the parameters array. The region is now passed as KEYS[2] through the Eval method's regionKey parameter (lines 876, 880), making this ARGV[7] entry redundant and potentially causing incorrect behavior if the scripts reference ARGV indices beyond 6.
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)
var parameters = new RedisValue[]
{
value,
item.ValueType.AssemblyQualifiedName,
(int)item.ExpirationMode,
(long)item.ExpirationTimeout.TotalMilliseconds,
item.CreatedUtc.Ticks,
item.UsesExpirationDefaults,
string.IsNullOrWhiteSpace(item.Region) ? string.Empty : item.Region
};

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:861

  • The comment is incomplete and should be updated to document all parameters. It should be: '// ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks), [6]: usesDefaultExpiration'
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@MichaConradMichaConrad changed the title Rewriting the LUA scripts to use 2 keysRewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keysNov 9, 2025
@MichaConradMichaConrad linked an issue Nov 10, 2025 that may be closed by this pull request
@MichaConradMichaConrad removed a link to an issue Nov 10, 2025
@MichaConrad
MichaConrad merged commit 24507f8 into devNov 10, 2025
2 checks passed
@MichaConrad
MichaConrad deleted the fix-for-393 branch February 18, 2026 00:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@MichaConrad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys - #395

Merged
MichaConrad merged 4 commits into
devfrom
fix-for-393
Nov 10, 2025
Merged

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys#395
MichaConrad merged 4 commits into
devfrom
fix-for-393

Conversation

@MichaConrad

@MichaConradMichaConrad commented Nov 6, 2025

Copy link
Copy Markdown
Collaborator

Full rewrite of how regions are handled in Redis.
Because of the hashing of keys in cluster scenarios, the region key and all keys of the region must generate the same hash, otherwise the feature wouldn't really work because the LUA script updates the region on Put and Add.

To achieve this, the implementation now makes use of hash keys, the region will be enclosed by { and }.
That means, the full keys is now {<region>}:<key> instead of <region>:<key>.

That also solves an issue where I had to encode the key and region string in case the values contain the : separator.
This logic got removed.

The new implementation also validates key and region to now contain hash keys, at least if regions are used.
You could still only define a key with hash keys as long as you leave the region null.

Also:

  • Rewriting the LUA scripts to use 2 keys, one for the full key and one optional region key which gets used to update the region.

This is technically a bigger breaking change, and, although I'm usually not creating a major version for such a small change, I think it is necessary. Especially because the new region logic is not compatible with the old and reading old values could result in errors.

… optional region key which gets used to update the region.
fixes#393

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors Redis Lua script parameter handling by moving the region parameter from a value parameter (ARGV[7]) to a key parameter (KEYS[2]). This change affects the _scriptAdd and _scriptPut scripts, along with updates to the Eval method signature to accept a regionKey parameter, and updates to all call sites to pass the region as a key.

  • Lua scripts now use KEYS[2] instead of ARGV[7] for region tracking
  • Eval method signature updated to accept RedisKey regionKey parameter
  • All Eval call sites updated to pass region as a key parameter
Comments suppressed due to low confidence (2)

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:871

  • The region parameter at index 6 (line 870) should be removed from the parameters array. The region is now passed as KEYS[2] through the Eval method's regionKey parameter (lines 876, 880), making this ARGV[7] entry redundant and potentially causing incorrect behavior if the scripts reference ARGV indices beyond 6.
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)
var parameters = new RedisValue[]
{
value,
item.ValueType.AssemblyQualifiedName,
(int)item.ExpirationMode,
(long)item.ExpirationTimeout.TotalMilliseconds,
item.CreatedUtc.Ticks,
item.UsesExpirationDefaults,
string.IsNullOrWhiteSpace(item.Region) ? string.Empty : item.Region
};

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:861

  • The comment is incomplete and should be updated to document all parameters. It should be: '// ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks), [6]: usesDefaultExpiration'
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@MichaConradMichaConrad changed the title Rewriting the LUA scripts to use 2 keysRewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keysNov 9, 2025
@MichaConradMichaConrad linked an issue Nov 10, 2025 that may be closed by this pull request
@MichaConradMichaConrad removed a link to an issue Nov 10, 2025
@MichaConrad
MichaConrad merged commit 24507f8 into devNov 10, 2025
2 checks passed
@MichaConrad
MichaConrad deleted the fix-for-393 branch February 18, 2026 00:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@MichaConrad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys - #395

Merged
MichaConrad merged 4 commits into
devfrom
fix-for-393
Nov 10, 2025
Merged

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys#395
MichaConrad merged 4 commits into
devfrom
fix-for-393

Conversation

@MichaConrad

@MichaConradMichaConrad commented Nov 6, 2025

Copy link
Copy Markdown
Collaborator

Full rewrite of how regions are handled in Redis.
Because of the hashing of keys in cluster scenarios, the region key and all keys of the region must generate the same hash, otherwise the feature wouldn't really work because the LUA script updates the region on Put and Add.

To achieve this, the implementation now makes use of hash keys, the region will be enclosed by { and }.
That means, the full keys is now {<region>}:<key> instead of <region>:<key>.

That also solves an issue where I had to encode the key and region string in case the values contain the : separator.
This logic got removed.

The new implementation also validates key and region to now contain hash keys, at least if regions are used.
You could still only define a key with hash keys as long as you leave the region null.

Also:

  • Rewriting the LUA scripts to use 2 keys, one for the full key and one optional region key which gets used to update the region.

This is technically a bigger breaking change, and, although I'm usually not creating a major version for such a small change, I think it is necessary. Especially because the new region logic is not compatible with the old and reading old values could result in errors.

… optional region key which gets used to update the region.
fixes#393

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors Redis Lua script parameter handling by moving the region parameter from a value parameter (ARGV[7]) to a key parameter (KEYS[2]). This change affects the _scriptAdd and _scriptPut scripts, along with updates to the Eval method signature to accept a regionKey parameter, and updates to all call sites to pass the region as a key.

  • Lua scripts now use KEYS[2] instead of ARGV[7] for region tracking
  • Eval method signature updated to accept RedisKey regionKey parameter
  • All Eval call sites updated to pass region as a key parameter
Comments suppressed due to low confidence (2)

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:871

  • The region parameter at index 6 (line 870) should be removed from the parameters array. The region is now passed as KEYS[2] through the Eval method's regionKey parameter (lines 876, 880), making this ARGV[7] entry redundant and potentially causing incorrect behavior if the scripts reference ARGV indices beyond 6.
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)
var parameters = new RedisValue[]
{
value,
item.ValueType.AssemblyQualifiedName,
(int)item.ExpirationMode,
(long)item.ExpirationTimeout.TotalMilliseconds,
item.CreatedUtc.Ticks,
item.UsesExpirationDefaults,
string.IsNullOrWhiteSpace(item.Region) ? string.Empty : item.Region
};

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:861

  • The comment is incomplete and should be updated to document all parameters. It should be: '// ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks), [6]: usesDefaultExpiration'
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@MichaConradMichaConrad changed the title Rewriting the LUA scripts to use 2 keysRewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keysNov 9, 2025
@MichaConradMichaConrad linked an issue Nov 10, 2025 that may be closed by this pull request
@MichaConradMichaConrad removed a link to an issue Nov 10, 2025
@MichaConrad
MichaConrad merged commit 24507f8 into devNov 10, 2025
2 checks passed
@MichaConrad
MichaConrad deleted the fix-for-393 branch February 18, 2026 00:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@MichaConrad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys - #395

Merged
MichaConrad merged 4 commits into
devfrom
fix-for-393
Nov 10, 2025
Merged

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys#395
MichaConrad merged 4 commits into
devfrom
fix-for-393

Conversation

@MichaConrad

@MichaConradMichaConrad commented Nov 6, 2025

Copy link
Copy Markdown
Collaborator

Full rewrite of how regions are handled in Redis.
Because of the hashing of keys in cluster scenarios, the region key and all keys of the region must generate the same hash, otherwise the feature wouldn't really work because the LUA script updates the region on Put and Add.

To achieve this, the implementation now makes use of hash keys, the region will be enclosed by { and }.
That means, the full keys is now {<region>}:<key> instead of <region>:<key>.

That also solves an issue where I had to encode the key and region string in case the values contain the : separator.
This logic got removed.

The new implementation also validates key and region to now contain hash keys, at least if regions are used.
You could still only define a key with hash keys as long as you leave the region null.

Also:

  • Rewriting the LUA scripts to use 2 keys, one for the full key and one optional region key which gets used to update the region.

This is technically a bigger breaking change, and, although I'm usually not creating a major version for such a small change, I think it is necessary. Especially because the new region logic is not compatible with the old and reading old values could result in errors.

… optional region key which gets used to update the region.
fixes#393

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors Redis Lua script parameter handling by moving the region parameter from a value parameter (ARGV[7]) to a key parameter (KEYS[2]). This change affects the _scriptAdd and _scriptPut scripts, along with updates to the Eval method signature to accept a regionKey parameter, and updates to all call sites to pass the region as a key.

  • Lua scripts now use KEYS[2] instead of ARGV[7] for region tracking
  • Eval method signature updated to accept RedisKey regionKey parameter
  • All Eval call sites updated to pass region as a key parameter
Comments suppressed due to low confidence (2)

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:871

  • The region parameter at index 6 (line 870) should be removed from the parameters array. The region is now passed as KEYS[2] through the Eval method's regionKey parameter (lines 876, 880), making this ARGV[7] entry redundant and potentially causing incorrect behavior if the scripts reference ARGV indices beyond 6.
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)
var parameters = new RedisValue[]
{
value,
item.ValueType.AssemblyQualifiedName,
(int)item.ExpirationMode,
(long)item.ExpirationTimeout.TotalMilliseconds,
item.CreatedUtc.Ticks,
item.UsesExpirationDefaults,
string.IsNullOrWhiteSpace(item.Region) ? string.Empty : item.Region
};

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:861

  • The comment is incomplete and should be updated to document all parameters. It should be: '// ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks), [6]: usesDefaultExpiration'
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@MichaConradMichaConrad changed the title Rewriting the LUA scripts to use 2 keysRewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keysNov 9, 2025
@MichaConradMichaConrad linked an issue Nov 10, 2025 that may be closed by this pull request
@MichaConradMichaConrad removed a link to an issue Nov 10, 2025
@MichaConrad
MichaConrad merged commit 24507f8 into devNov 10, 2025
2 checks passed
@MichaConrad
MichaConrad deleted the fix-for-393 branch February 18, 2026 00:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@MichaConrad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys - #395

Merged
MichaConrad merged 4 commits into
devfrom
fix-for-393
Nov 10, 2025
Merged

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys#395
MichaConrad merged 4 commits into
devfrom
fix-for-393

Conversation

@MichaConrad

@MichaConradMichaConrad commented Nov 6, 2025

Copy link
Copy Markdown
Collaborator

Full rewrite of how regions are handled in Redis.
Because of the hashing of keys in cluster scenarios, the region key and all keys of the region must generate the same hash, otherwise the feature wouldn't really work because the LUA script updates the region on Put and Add.

To achieve this, the implementation now makes use of hash keys, the region will be enclosed by { and }.
That means, the full keys is now {<region>}:<key> instead of <region>:<key>.

That also solves an issue where I had to encode the key and region string in case the values contain the : separator.
This logic got removed.

The new implementation also validates key and region to now contain hash keys, at least if regions are used.
You could still only define a key with hash keys as long as you leave the region null.

Also:

  • Rewriting the LUA scripts to use 2 keys, one for the full key and one optional region key which gets used to update the region.

This is technically a bigger breaking change, and, although I'm usually not creating a major version for such a small change, I think it is necessary. Especially because the new region logic is not compatible with the old and reading old values could result in errors.

… optional region key which gets used to update the region.
fixes#393

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors Redis Lua script parameter handling by moving the region parameter from a value parameter (ARGV[7]) to a key parameter (KEYS[2]). This change affects the _scriptAdd and _scriptPut scripts, along with updates to the Eval method signature to accept a regionKey parameter, and updates to all call sites to pass the region as a key.

  • Lua scripts now use KEYS[2] instead of ARGV[7] for region tracking
  • Eval method signature updated to accept RedisKey regionKey parameter
  • All Eval call sites updated to pass region as a key parameter
Comments suppressed due to low confidence (2)

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:871

  • The region parameter at index 6 (line 870) should be removed from the parameters array. The region is now passed as KEYS[2] through the Eval method's regionKey parameter (lines 876, 880), making this ARGV[7] entry redundant and potentially causing incorrect behavior if the scripts reference ARGV indices beyond 6.
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)
var parameters = new RedisValue[]
{
value,
item.ValueType.AssemblyQualifiedName,
(int)item.ExpirationMode,
(long)item.ExpirationTimeout.TotalMilliseconds,
item.CreatedUtc.Ticks,
item.UsesExpirationDefaults,
string.IsNullOrWhiteSpace(item.Region) ? string.Empty : item.Region
};

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:861

  • The comment is incomplete and should be updated to document all parameters. It should be: '// ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks), [6]: usesDefaultExpiration'
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@MichaConradMichaConrad changed the title Rewriting the LUA scripts to use 2 keysRewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keysNov 9, 2025
@MichaConradMichaConrad linked an issue Nov 10, 2025 that may be closed by this pull request
@MichaConradMichaConrad removed a link to an issue Nov 10, 2025
@MichaConrad
MichaConrad merged commit 24507f8 into devNov 10, 2025
2 checks passed
@MichaConrad
MichaConrad deleted the fix-for-393 branch February 18, 2026 00:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@MichaConrad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys - #395

Merged
MichaConrad merged 4 commits into
devfrom
fix-for-393
Nov 10, 2025
Merged

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys#395
MichaConrad merged 4 commits into
devfrom
fix-for-393

Conversation

@MichaConrad

@MichaConradMichaConrad commented Nov 6, 2025

Copy link
Copy Markdown
Collaborator

Full rewrite of how regions are handled in Redis.
Because of the hashing of keys in cluster scenarios, the region key and all keys of the region must generate the same hash, otherwise the feature wouldn't really work because the LUA script updates the region on Put and Add.

To achieve this, the implementation now makes use of hash keys, the region will be enclosed by { and }.
That means, the full keys is now {<region>}:<key> instead of <region>:<key>.

That also solves an issue where I had to encode the key and region string in case the values contain the : separator.
This logic got removed.

The new implementation also validates key and region to now contain hash keys, at least if regions are used.
You could still only define a key with hash keys as long as you leave the region null.

Also:

  • Rewriting the LUA scripts to use 2 keys, one for the full key and one optional region key which gets used to update the region.

This is technically a bigger breaking change, and, although I'm usually not creating a major version for such a small change, I think it is necessary. Especially because the new region logic is not compatible with the old and reading old values could result in errors.

… optional region key which gets used to update the region.
fixes#393

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors Redis Lua script parameter handling by moving the region parameter from a value parameter (ARGV[7]) to a key parameter (KEYS[2]). This change affects the _scriptAdd and _scriptPut scripts, along with updates to the Eval method signature to accept a regionKey parameter, and updates to all call sites to pass the region as a key.

  • Lua scripts now use KEYS[2] instead of ARGV[7] for region tracking
  • Eval method signature updated to accept RedisKey regionKey parameter
  • All Eval call sites updated to pass region as a key parameter
Comments suppressed due to low confidence (2)

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:871

  • The region parameter at index 6 (line 870) should be removed from the parameters array. The region is now passed as KEYS[2] through the Eval method's regionKey parameter (lines 876, 880), making this ARGV[7] entry redundant and potentially causing incorrect behavior if the scripts reference ARGV indices beyond 6.
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)
var parameters = new RedisValue[]
{
value,
item.ValueType.AssemblyQualifiedName,
(int)item.ExpirationMode,
(long)item.ExpirationTimeout.TotalMilliseconds,
item.CreatedUtc.Ticks,
item.UsesExpirationDefaults,
string.IsNullOrWhiteSpace(item.Region) ? string.Empty : item.Region
};

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:861

  • The comment is incomplete and should be updated to document all parameters. It should be: '// ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks), [6]: usesDefaultExpiration'
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@MichaConradMichaConrad changed the title Rewriting the LUA scripts to use 2 keysRewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keysNov 9, 2025
@MichaConradMichaConrad linked an issue Nov 10, 2025 that may be closed by this pull request
@MichaConradMichaConrad removed a link to an issue Nov 10, 2025
@MichaConrad
MichaConrad merged commit 24507f8 into devNov 10, 2025
2 checks passed
@MichaConrad
MichaConrad deleted the fix-for-393 branch February 18, 2026 00:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@MichaConrad
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys - #395

Merged
MichaConrad merged 4 commits into
devfrom
fix-for-393
Nov 10, 2025
Merged

Rewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keys#395
MichaConrad merged 4 commits into
devfrom
fix-for-393

Conversation

@MichaConrad

@MichaConradMichaConrad commented Nov 6, 2025

Copy link
Copy Markdown
Collaborator

Full rewrite of how regions are handled in Redis.
Because of the hashing of keys in cluster scenarios, the region key and all keys of the region must generate the same hash, otherwise the feature wouldn't really work because the LUA script updates the region on Put and Add.

To achieve this, the implementation now makes use of hash keys, the region will be enclosed by { and }.
That means, the full keys is now {<region>}:<key> instead of <region>:<key>.

That also solves an issue where I had to encode the key and region string in case the values contain the : separator.
This logic got removed.

The new implementation also validates key and region to now contain hash keys, at least if regions are used.
You could still only define a key with hash keys as long as you leave the region null.

Also:

  • Rewriting the LUA scripts to use 2 keys, one for the full key and one optional region key which gets used to update the region.

This is technically a bigger breaking change, and, although I'm usually not creating a major version for such a small change, I think it is necessary. Especially because the new region logic is not compatible with the old and reading old values could result in errors.

… optional region key which gets used to update the region.
fixes#393

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors Redis Lua script parameter handling by moving the region parameter from a value parameter (ARGV[7]) to a key parameter (KEYS[2]). This change affects the _scriptAdd and _scriptPut scripts, along with updates to the Eval method signature to accept a regionKey parameter, and updates to all call sites to pass the region as a key.

  • Lua scripts now use KEYS[2] instead of ARGV[7] for region tracking
  • Eval method signature updated to accept RedisKey regionKey parameter
  • All Eval call sites updated to pass region as a key parameter
Comments suppressed due to low confidence (2)

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:871

  • The region parameter at index 6 (line 870) should be removed from the parameters array. The region is now passed as KEYS[2] through the Eval method's regionKey parameter (lines 876, 880), making this ARGV[7] entry redundant and potentially causing incorrect behavior if the scripts reference ARGV indices beyond 6.
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)
var parameters = new RedisValue[]
{
value,
item.ValueType.AssemblyQualifiedName,
(int)item.ExpirationMode,
(long)item.ExpirationTimeout.TotalMilliseconds,
item.CreatedUtc.Ticks,
item.UsesExpirationDefaults,
string.IsNullOrWhiteSpace(item.Region) ? string.Empty : item.Region
};

src/CacheManager.StackExchange.Redis/RedisCacheHandle.cs:861

  • The comment is incomplete and should be updated to document all parameters. It should be: '// ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks), [6]: usesDefaultExpiration'
 // ARGV [1]: value, [2]: type, [3]: expirationMode, [4]: expirationTimeout(millis), [5]: created(ticks)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@MichaConradMichaConrad changed the title Rewriting the LUA scripts to use 2 keysRewriting Region handling in Redis to use hashkeys and fix LUA scripts to use 2 keysNov 9, 2025
@MichaConradMichaConrad linked an issue Nov 10, 2025 that may be closed by this pull request
@MichaConradMichaConrad removed a link to an issue Nov 10, 2025
@MichaConrad
MichaConrad merged commit 24507f8 into devNov 10, 2025
2 checks passed
@MichaConrad
MichaConrad deleted the fix-for-393 branch February 18, 2026 00:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@MichaConrad