Recently worked on analysis to use Redis as a cache for REST services. Performed the basic configuration of Redis and ran the benchmark test on it and results were amazing. I have used the redis-benchmark to perform benchmarking. https://redis.io/topics/benchmarks
First test where I used 568 bytes data size for Get/Set
redis-benchmark -q -n 100000 -c 50 -P 12 -r 16 -d 568 PING_INLINE: 337837.84 requests per second PING_BULK: 331125.84 requests per second SET: 284090.91 requests per second GET: 318471.31 requests per second INCR: 444444.47 requests per second LPUSH: 349650.34 requests per second RPUSH: 352112.66 requests per second LPOP: 392156.88 requests per second RPOP: 390624.97 requests per second SADD: 425531.91 requests per second SPOP: 401606.44 requests per second LPUSH (needed to benchmark LRANGE): 346020.75 requests per second LRANGE_100 (first 100 elements): 354609.94 requests per second LRANGE_300 (first 300 elements): 337837.84 requests per second LRANGE_500 (first 450 elements): 343642.59 requests per second LRANGE_600 (first 600 elements): 317460.31 requests per second MSET (10 keys): 62227.75 requests per second
Second test where I used 1000 bytes data size for Get/Set, still there no huge decline in the throughput.
redis-benchmark -q -n 100000 -c 50 -P 12 -r 16 -d 1000 PING_INLINE: 369003.69 requests per second PING_BULK: 416666.69 requests per second SET: 277777.78 requests per second GET: 367647.03 requests per second INCR: 423728.81 requests per second LPUSH: 277777.78 requests per second RPUSH: 277777.78 requests per second LPOP: 462962.94 requests per second RPOP: 432900.41 requests per second SADD: 373134.31 requests per second SPOP: 403225.81 requests per second LPUSH (needed to benchmark LRANGE): 251889.16 requests per second LRANGE_100 (first 100 elements): 318471.31 requests per second LRANGE_300 (first 300 elements): 317460.31 requests per second LRANGE_500 (first 450 elements): 335570.47 requests per second LRANGE_600 (first 600 elements): 325732.88 requests per second MSET (10 keys): 41666.66 requests per second
My Redis setup is, 1 Master and 4 Slaves and I have configured the Sentinel to monitor the instances and on failure select the Master.
- Custom IP address bind configuration, used the private IP address instead on Public one.
- Changed the default to port to the custom one.
- One need to select the Timeout setting carefully, this setting tell the Redis server when to disconnect the client if it’s ideal for N seconds. If you are considering this setup to use with Spring Cache then align this setting with your Jedis connection pool setting.
- Loglevl for PROD instance needs to be kept at lower side, as you may face server issues if your logs occupy more disk space than what is necessary.
- Limit the maximum database your server want to handle.
- Snapshotting section is the critical one, here if you have more number of slaves then need to select the snapshot frequency accordingly. Redis dose asynchronous sync with the slaves, but you need to consider a good balance between CPU and Memory usage and the time for eventually consistent state. One can have multiple condition to trigger the snapshot, e.g.
- save 900 1 (after 900 seconds if there is one record changed)
- save 300 10 (after 300 seconds if there is 10 records changed)
- save 60 10000 (after 60 seconds if there are 1000 records changed)
- Configure the Slave Master using “slaveof” and “masterauth” settings
- slave-priority is another key configuration you need to consider if you are planning to use sentinel. If master is down then based on this configuration sentinel process identifies the next master. Lower priority one will be considered as next master. NOTE : Do not set it to 0, value indicates that this redis instance will not be promoted to Master, it will be always considered as Slave.
- If you have separate IPs, Private and Public then based on challenges I faced, always use the private IP for binding to Redis server, and configure the announce-ip configuration to announce IP of Redis server which will have Public IP address.
- Always set the maxclient configuration.
- Another tow very important configuration once should consider while configuring PROD server. We found this very useful when we performed load test on the Redis server to see how Redis performs with huge data sets. “maxmemory” this tells what is the max memory allocation for the Redis, maxmemory-policy configuration tells the Redis what to do when maxmemory threshold is reached, Redis has provided different strategies you can choose from.
NEXT : Detailed configuration of Redis Master, Slave and Sentinel