Getting corrupted strings when using ElastiCache Redis 7.1.0 since library version 5
I'm using Amazon ElastiCache running Redis 7.1.0 (I do realize this is unsupported version, but thought that this is worth reporting anyway).
When I'm running the following script:
import redis from 'redis' async function main() { const client = redis.createClient({ url: 'redis://my-elasticache-cluster:6379' }) await client.connect() console.log('Connected to Redis') const value = Array.from({ length: 1000 }, (_) => 'ä').join('') await client.set('test-key', value, { EX: 5 }) const result = await client.get('test-key') console.log('Value got from Redis:', result) console.log('Has replacement character', result && result.includes('�')) await client.disconnect() } main().catch((err) => { console.error('Unhandled error:', err) process.exit(1) })
I sometimes get the following output (about 50% of the time), scroll right to see the error:
Connected to Redis
Value got from Redis: äääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääää��ääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääääää
Has replacement character true
If I install pnpm i redis@^4, this never happens. I could not replicate this with local redis (but did not test the same version, since I could not find 7.1 images easily).
Speculation - somewhere there is a mechanism where data is coming in as a separate byte chunks, and these incomplete byte chunks are being read as UTF-8 strings, even though they might be broken mid-codepoint and the conversion should wait until the bytes are retrieved in full?