# redis_performance_test **Repository Path**: Deep_feel/redis_performance_test ## Basic Information - **Project Name**: redis_performance_test - **Description**: 测试redis单机下的性能情况 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2019-06-19 - **Last Updated**: 2023-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # redis_performance_test ## 测试redis单机下的性能情况 1. 使用jedis/Lua去插入/查询list,哪个比较快? 2. Redis键名长度是否会影响性能? ## 环境 docker + redis CPUs:2 内存:2G Redis版本:3.2.3 网路带宽:127.0.0.1 ## 测试结果 #### 使用jedis/Lua去插入/查询list,哪个比较快? > (数据量:set操作是循环单条往redis push;get操作是直接全部lrange出来) 数据结构 | 操作 | jedis/Lua | 数据量 | 线程 | key长度 | value长度 | QPS | 总耗时 ---|--|--|--|--|--|--|--|-- List | set | jedis | 1 | 1 | 19 | 40 | 500/s | | List | set | Lua | 1 | 1 | 19 | 40 | 1000/s | | List | get | jedis | 1 | 1 | 19 | 40 | | 8ms List | get | Lua | 1 | 1 | 19 | 40 | | 1ms List | set | jedis | 10000 | 1 | 19 | 40 | 1846/s | | List | set | Lua | 10000 | 1 | 19 | 40 | 769230/s | | List | get | jedis | 10000 | 1 | 19 | 40 | | 43ms List | get | Lua | 10000 | 1 | 19 | 40 | | 1ms List | set | jedis | 50000 | 1 | 19 | 40 | 2092/s | | List | set | Lua | 50000 | 1 | 19 | 40 | 806451/s | | List | get | jedis | 50000 | 1 | 19 | 40 | | 134ms List | get | Lua | 50000 | 1 | 19 | 40 | | 1ms 可以看出单线程下Lua比jedis拥有更强的性能。再来看看多线程: > (以下set操作每个线程执行1万次push,get操作是每个线程lrange 10000条数据出来) 数据结构 | 操作 | jedis/Lua | 数据量 | 线程 | key长度 | value长度 | QPS | 总耗时 ---|--|--|--|--|--|--|--|-- List | set | jedis | 5W | 5 | 19 | 40 | 3145/s | 15897ms | List | set | Lua | 5W | 5 | 19 | 40 | 526315/s | 95ms | List | get | jedis | 5W | 5 | 19 | 40 | | 32ms | List | get | Lua | 5W | 5 | 19 | 40 | | 22ms | List | set | jedis | 10W | 10 | 19 | 40 | 3523/s | 28377ms | List | set | Lua | 10W | 10 | 19 | 40 | 462962/s | 216ms | List | get | jedis | 10W | 5 | 19 | 40 | | 60ms | List | get | Lua | 10W | 5 | 19 | 40 | | 51ms | 多线程情况下依然可以看到Set操作Lua比jedis快太多,Get操作相对好一些。 这是因为jedis Set操作的for循环调用```jedis.lrange```产生了多次网络调用,而Lua Set操作的for循环在Lua脚本,Lua脚本发送到redis服务器只产生了一次网络调用。 总结:如果一段代码里需要执行多次redis操作的,优先考虑使用Lua,编写Lua脚本应尽量保证简短,减少网络开销和内存开销。如果脚本内容很长,而且需要频繁执行,那么可以使用```SCRIPT LOAD``` 和 ```EVALSHA``` 指令。 ```SCRIPT LOAD``` 指令用于将客户端提供的 Lua 脚本传递到服务器而不执行,但是会得到脚本的唯一 ID,这个唯一 ID 是用来唯一标识服务器缓存的这段 Lua 脚本,它是由 Redis 使用 sha1 算法揉捏脚本内容而得到的一个很长的字符串。有了这个唯一 ID,后面客户端就可以通过 ```EVALSHA``` 指令反复执行这个脚本了。
指令使用Demo ```Java String script = "local redisKes = KEYS[1];" + "local start = ARGV[1];" + "local endd = ARGV[2];" + "local rows = redis.call('lrange',redisKes,start,endd);" + "return rows"; String luaId = jedis.scriptLoad(script); List keyList = new ArrayList(); keyList.add("test_jedis_lua_list"); // 第一个请求 List argList1 = new ArrayList(); argList1.add("0"); argList1.add("9999"); Object result1 = jedis.evalsha(luaId, keyList, argList1); List list1 = (List) result1; System.out.println(list1.size()); // 第二个请求 List argList2 = new ArrayList(); argList2.add("0"); argList2.add("19999"); Object result2 = jedis.evalsha(luaId, keyList, argList2); List list2 = (List) result2; System.out.println(list2.size()); ```
#### Redis键名长度是否会影响性能? > (使用Jedis操作,数据量:get/set操作都是循环单条插入取出) 数据结构 | 操作 | 数据量 | 线程数 | key长度 | value长度 | QPS ---|--|--|--|--|--|-- String | set | 50000 | 1 | 10 | 5 | 2161/s String | get | 50000 | 1 | 10 | 5 | 2129/s String | set | 50000 | 1 | 20 | 5 | 2116/s String | get | 50000 | 1 | 20 | 5 | 2180/s String | set | 50000 | 1 | 80 | 5 | 2191/s String | get | 50000 | 1 | 80 | 5 | 1951/s String | set | 50000 | 1 | 160 | 5 | 2101/s String | get | 50000 | 1 | 160 | 5 | 2087/s String | set | 50000 | 1 | 320 | 5 | 2088/s String | get | 50000 | 1 | 320 | 5 | 2116/s String | set | 50000 | 1 | 640 | 5 | 2131/s String | get | 50000 | 1 | 640 | 5 | 2119/s String | set | 50000 | 1 | 1280 | 5 | 2085/s String | get | 50000 | 1 | 1280 | 5 | 2101/s String | set | 50000 | 1 | 2560 | 5 | 1945/s String | get | 50000 | 1 | 2560 | 5 | 1917/s String | set | 50000 | 1 | 5120 | 5 | 1362/s String | get | 50000 | 1 | 5120 | 5 | 1456/s String | set | 50000 | 1 | 10240 | 5 | 907/s String | get | 50000 | 1 | 10240 | 5 | 949/s 可以看出,key的长度到达2560的时候才有性能下降的趋势,到达了10000级别的长度的时候性能就直接折半。 所以说,正常使用redis key是对性能基本没影响或者说影响不大,编程中主要考虑使用的key名是否容易识别, 例如```USER_SHOPPING_CART_userId``` / ```user:shoppingCart:userId```