-
Notifications
You must be signed in to change notification settings - Fork 145
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[@keyv/redis] Migrate to node-redis from ioredis #1119
Comments
We are also considering using https://github.com/valkey-io/iovalkey to replace ioredis. |
Cool thanks for telling me about it. I already switched to another npm package but I'll be happy to switch back when it's ready. |
Something to consider when looking at this. https://github.com/jaredwray/keyv/tree/ioredis-port-to-iovalkey |
What library did you move too? |
@jftanner @100tomer - Wanted to update you on the plan that we are doing for Redis moving forward. Since
|
https://www.npmjs.com/package/@keyv/valkey has been released 🎉 @mcollina thanks for the work on porting this over! |
Just FYI as we are working on the new version and should have it out in the next 2-3 weeks. |
@jftanner @100tomer @chocolateboy @klippx @leo-fresha - I am pleased to announce the updated Features
Table of Contents
UsageHere is a standard use case where we implement import Keyv from 'keyv';
import KeyvRedis from '@keyv/redis';
const keyv = new Keyv(new KeyvRedis('redis://user:pass@localhost:6379'));
keyv.on('error', handleConnectionError); Here you can pass in the Redis options directly: import Keyv from 'keyv';
import KeyvRedis from '@keyv/redis';
const redisOptions = {
url: 'redis://localhost:6379', // The Redis server URL (use 'rediss' for TLS)
password: 'your_password', // Optional password if Redis has authentication enabled
socket: {
host: 'localhost', // Hostname of the Redis server
port: 6379, // Port number
reconnectStrategy: (retries) => Math.min(retries * 50, 2000), // Custom reconnect logic
tls: false, // Enable TLS if you need to connect over SSL
keepAlive: 30000, // Keep-alive timeout (in milliseconds)
}
};
const keyv = new Keyv(new KeyvRedis(redisOptions)); Or you can create a new Redis instance and pass it in with import Keyv from 'keyv';
import KeyvRedis, { createClient } from '@keyv/redis';
const redis = createClient('redis://user:pass@localhost:6379', { namespace: 'my-namespace'});
const keyvRedis = new KeyvRedis(redis);
const keyv = new Keyv({ store: keyvRedis }); Here is the same example but with the import { createKeyv } from '@keyv/redis';
const keyv = createKeyv('redis://user:pass@localhost:6379', { namespace: 'my-namespace' }); You only have to import the NamspacesYou can set a namespace for your keys. This is useful if you want to manage your keys in a more organized way. Here is an example of how to set a namespace: import Keyv from 'keyv';
import KeyvRedis from '@keyv/redis';
const keyv = new Keyv(new KeyvRedis('redis://user:pass@localhost:6379', { namespace: 'my-namespace' })); This will prefix all keys with keyv.namespace = 'my-namespace'; NOTE: If you plan to do many clears or deletes, it is recommended to read the Performance Considerations section. Performance ConsiderationsWith namespaces being prefix based it is critical to understand some of the performance considerations we have made:
If you want to see even better performance please see the Using Cacheable with Redis section as it has non-blocking and in-memory primary caching that goes along well with this library and Keyv. High Memory Usage on Redis ServerThis is because we are using If you are deleting or clearing a large number of keys you can disable this by setting the const keyv = new Keyv(new KeyvRedis('redis://user:pass@localhost:6379', { useUnlink: false }));
// Or
keyv.useUnlink = false; Using Cacheable with RedisIf you are wanting to see even better performance with Redis, you can use Cacheable which is a multi-layered cache library that has in-memory primary caching and non-blocking secondary caching. Here is an example of how to use it with Redis: import KeyvRedis from '@keyv/redis';
import Cacheable from 'cacheable';
const secondary = new KeyvRedis('redis://user:pass@localhost:6379');
const cache = new Cacheable( { secondary } ); For even higher performance you can set the const cache = new Cacheable( { secondary, nonBlocking: true } ); This will make it so that the secondary does not block the primary cache and will be very fast. 🚀 Clustering and TLS SupportIf you are using a Redis Cluster or need to use TLS, you can pass in the import Keyv from 'keyv';
import KeyvRedis, { createCluster } from '@keyv/redis';
const cluster = createCluster({
rootNodes: [
{
url: 'redis://127.0.0.1:7000',
},
{
url: 'redis://127.0.0.1:7001',
},
{
url: 'redis://127.0.0.1:7002',
},
],
});
const keyv = new Keyv({ store: new KeyvRedis(cluster) }); Here is an example of how to use TLS: import Keyv from 'keyv';
import KeyvRedis from '@keyv/redis';
const tlsOptions = {
socket: {
host: 'localhost',
port: 6379,
tls: true, // Enable TLS connection
rejectUnauthorized: false, // Ignore self-signed certificate errors (for testing)
// Alternatively, provide CA, key, and cert for mutual authentication
ca: fs.readFileSync('/path/to/ca-cert.pem'),
cert: fs.readFileSync('/path/to/client-cert.pem'), // Optional for client auth
key: fs.readFileSync('/path/to/client-key.pem'), // Optional for client auth
}
};
const keyv = new Keyv({ store: new KeyvRedis(tlsOptions) }); API
Migrating from v3 to v4The main change in v4 is the removal of the About Redis Sets and its Support in v4We no longer support redis sets. This is due to the fact that it caused significant performance issues and was not a good fit for the library. |
Is your feature request related to a problem? Please describe.
This was mentioned as part of #868, but not implemented as part of it. So this isn't new, but doesn't currently have an issue to track it.
With the effective deprecation of ioredis, devs are encouraged to switch to the official node-redis module instead. But, currently, that's not compatible with Keyv without a shim.
Describe the solution you'd like
One of two options:
@keyv/node-redis
module@keyv/redis
to use node-redis instead.In the latter case, it would either be a breaking change or would require a shim to still accept an
ioredis
instance passed to the constructor (new KeyvRedis(redis);
).The text was updated successfully, but these errors were encountered: