All Products
Search
Document Center

Tair (Redis® OSS-Compatible):Performance white paper of persistent memory-optimized instances

Last Updated:Mar 28, 2026

Tair (Enterprise Edition) persistent memory-optimized instances use persistent memory (PMEM) to deliver large-capacity in-memory databases compatible with open source Redis. The following sections cover the test environment, tool, workloads, and results for benchmarking these instances.

Overview

Persistent memory-optimized instances use PMEM to provide large-capacity in-memory databases without relying on disks for data persistence. Every write operation is persisted directly to PMEM, maintaining the reliability of each operation. These instances cost 30% less than Redis Open-Source Edition instances while delivering almost the same throughput and latency.

For a product overview, see Persistent memory-optimized instances.

Performance at a glance

The table below shows representative QPS (queries per second) for the tair.scm.standard.32m.128d instance type across common workloads (128-byte string values).

WorkloadOperationQPSAverage latency
Data loading100% write134,478473 µs
Workload C100% read170,699362 µs
Workload A50% read / 50% update141,120~451 µs read, ~450 µs update

Detailed results by data type and value size are in the Test results for data loading sections below.

Test environment

ItemDescription
Region and zoneZhangjiakou Zone A
Instance architectureStandard master-replica architecture. See Standard architecture.
Stress testing hostElastic Compute Service (ECS) instance of the ecs.g6e.8xlarge type. See Overview of instance families.
Instance typetair.scm.standard.32m.128d

Test tool

YCSB (Yahoo! Cloud Serving Benchmark) is an open source Java benchmarking framework that supports multiple database types. See YCSB on GitHub for installation instructions.

By default, YCSB tests only hashes. To benchmark strings, replace the RedisClient.java file in YCSB/redis/src/main/java/site/ycsb/db/ with the custom RedisClient.java after downloading YCSB.

Complex commands for sets and sorted sets are not included in these tests because their performance characteristics depend heavily on the specific use case. Design a custom workload for sets and sorted sets based on your application requirements.

Workloads

All tests use 8 GB of data with a Zipfian key distribution, which models real-world access patterns where a small fraction of keys receives the majority of requests. Three workloads are tested:

WorkloadOperations
Data loading100% write (INSERT)
Workload C100% read
Workload A50% read / 50% update

For workload definitions, see Core Workloads.

Test commands

# Load data
workload=a
./bin/ycsb load redis -s -P workloads/workload${workload} \
  -p "redis.host=${server_ip}" \
  -p "redis.port=${port}" \
  -p "redis.password=${password}" \
  -p "recordcount=${recordcount}" \
  -p "operationcount=${operationcount}" \
  -p "redis.timeout=30000" \
  -p "redis.command_group=${command_group}" \
  -p "fieldcount=${fieldcount}" \
  -p "fieldlength=${fieldlength}" \
  -threads ${threads} \
  -p "redis.password=***:*****"

# Run Workload C (100% read)
workload=c
./bin/ycsb run redis -s -P workloads/workload${workload} \
  -p "redis.host=${server_ip}" \
  -p "redis.port=${port}" \
  -p "redis.password=${password}" \
  -p "recordcount=${recordcount}" \
  -p "operationcount=${operationcount}" \
  -p "redis.timeout=30000" \
  -p "redis.command_group=${command_group}" \
  -p "fieldcount=${fieldcount}" \
  -p "fieldlength=${fieldlength}" \
  -threads ${threads} \
  -p "redis.password=***:*****"

# Run Workload A (50% read / 50% update)
workload=a
./bin/ycsb run redis -s -P workloads/workload${workload} \
  -p "redis.host=${server_ip}" \
  -p "redis.port=${port}" \
  -p "redis.password=${password}" \
  -p "recordcount=${recordcount}" \
  -p "operationcount=${operationcount}" \
  -p "redis.timeout=30000" \
  -p "redis.command_group=${command_group}" \
  -p "fieldcount=${fieldcount}" \
  -p "fieldlength=${fieldlength}" \
  -threads ${threads} \
  -p "redis.password=***:*****"

Parameters

ParameterDescription
server_ipIP address of the instance
portService port of the instance
passwordAuthentication credential. Format depends on the account type: the default account uses the password only (for example, AUTH Password21); a custom account uses username:password format (for example, AUTH testaccount:Rp829dlwa). To reset a forgotten password, see Change or reset the password.
recordcountThe amount of prepared data
operationcountThe amount of data involved in the operation
command_groupData type to test. Run tests in this order: String, Hash, List, Set, Zset
fieldcountNumber of fields or elements per key. Set to 1 for strings; set to 10 for all other data types
fieldlengthValue size in bytes
threadsNumber of YCSB client threads. Tune based on the instance type

Test metrics

MetricDescription
QPSNumber of read and write operations processed per second
INSERT average latencyMean latency of write operations (µs)
INSERT 99th percentile latencyThe slowest latency that still falls within the fastest 99% of write operations (µs). For example, a value of 500 µs means 99% of writes complete within 500 µs.
READ average latencyMean latency of read operations (µs)
READ 99th percentile latencyThe slowest latency within the fastest 99% of read operations (µs)
UPDATE average latencyMean latency of update operations (µs)
UPDATE 99th percentile latencyThe slowest latency within the fastest 99% of update operations (µs)

Test results for data loading

Data loading measures 100% write (INSERT) performance.

Strings

Value length (bytes)QPSINSERT average latency (µs)INSERT 99th percentile latency (µs)
128134,478473687
256126,139504828
1,02499,7756381,051
2,04877,1308261,157
4,09660,6461,0501,534

Hashes (10 fields per key)

Value length (bytes)QPSINSERT average latency (µs)INSERT 99th percentile latency (µs)
12847,3531,3481,885
25646,7161,3662,181
1,02427,7592,2972,873
2,04816,6053,8334,923

Lists (10 elements per key)

Value length (bytes)QPSINSERT average latency (µs)INSERT 99th percentile latency (µs)
12864,9509791,310
25647,1571,3481,752
1,02426,7192,3863,457
2,04816,7143,8114,751
4,09610,1296,2797,891

Sets (10 members per key)

Value length (bytes)QPSINSERT average latency (µs)INSERT 99th percentile latency (µs)
12863,6701,0011,514
25644,7071,4272,129
1,02425,3752,5133,239
2,04814,3184,4515,619
4,0968,3787,6089,095

Sorted sets (10 elements per key)

Value length (bytes)QPSINSERT average latency (µs)INSERT 99th percentile latency (µs)
12840,2921,5852,469
25634,1681,8692,569
1,02421,3472,9893,905
2,04812,8684,9566,255
4,0967,8648,1019,599

Test results for Workload C

Workload C measures 100% read performance.

Strings

Value length (bytes)QPSREAD average latency (µs)READ 99th percentile latency (µs)
128170,699362546
256163,829380565
1,024161,491386569
2,048130,189487729
4,096115,433548808

Hashes (10 fields per key)

Value length (bytes)QPSREAD average latency (µs)READ 99th percentile latency (µs)
12896,111662874
25686,892733915
1,02461,6081,0301,293
2,04837,3341,6962,331
4,09625,9432,4293,319

Lists (10 elements per key)

Value length (bytes)QPSREAD average latency (µs)READ 99th percentile latency (µs)
128105,296604889
25697,047655890
1,02466,3849551,192
2,04835,7961,7692,461
4,09626,3142,3923,271

Sets (10 members per key)

Value length (bytes)QPSREAD average latency (µs)READ 99th percentile latency (µs)
12897,825651896
25680,954787970
1,02459,9241,0601,313
2,04833,3561,9002,637
4,09623,6052,6773,723

Sorted sets (10 elements per key)

Value length (bytes)QPSREAD average latency (µs)READ 99th percentile latency (µs)
12858,3801,0931,341
25656,2871,1331,390
1,02447,4681,3381,688
2,04830,0732,0962,783
4,09621,8502,8803,765

Test results for Workload A

Workload A measures mixed-read/write performance: 50% reads and 50% updates.

Strings

Value length (bytes)QPSREAD average latency (µs)READ 99th percentile latency (µs)UPDATE average latency (µs)UPDATE 99th percentile latency (µs)
128141,120451616450618
256137,551463617461618
1,024124,165516724508725
2,04892,652695881678871
4,09678,9948191,0427911,024

Hashes (10 fields per key)

Value length (bytes)QPSREAD average latency (µs)READ 99th percentile latency (µs)UPDATE average latency (µs)UPDATE 99th percentile latency (µs)
12899,495646831633820
25688,235731985712966
1,02472,0138921,1598632,049
2,04845,7901,3791,8981,3542,821
4,09632,9121,8912,9311,9157,887

Lists (10 elements per key)

Value length (bytes)QPSREAD average latency (µs)READ 99th percentile latency (µs)UPDATE average latency (µs)UPDATE 99th percentile latency (µs)
12871,6965917751,1851,383
25666,2946388001,2811,456
1,02453,4027911,0061,5811,865
2,04836,5191,2211,5812,2322,831
4,09628,3901,6182,1132,8033,777

Sets (10 members per key)

Value length (bytes)QPSREAD average latency (µs)READ 99th percentile latency (µs)UPDATE average latency (µs)UPDATE 99th percentile latency (µs)
12866,3466407921,2821,445
25660,0107079931,4151,957
1,02445,3599331,1281,8582,073
2,04829,0271,5292,0212,8204,507
4,09621,4402,1442,7733,7265,095

Sorted sets (10 elements per key)

Value length (bytes)QPSREAD average latency (µs)READ 99th percentile latency (µs)UPDATE average latency (µs)UPDATE 99th percentile latency (µs)
12849,6958611,0501,7071,912
25648,0368911,0841,7631,970
1,02439,7951,0811,3862,1072,563
2,04828,4151,5971,9812,8553,589
4,09621,3172,2472,8213,6654,787

What's next