附近的人实现(Redis 3.2 以上版本和es 性能比较)

 

 

1.

100条数据

2.

1000条数据

3.

10000条数据

4.100000

 

1.当 redis 也有100条数据

ES 开始获取距离50000米以内人
ES 获取数据总量:39
ES 获取数据耗时:168
Redis 开始获取距离Tom老师50000米以内人
Redis 获取数据总量:40
Redis 获取数据耗时:79

 

第二次测试:

ES 开始获取距离50000米以内人
ES 获取数据总量:39
ES 获取数据耗时:198
Redis 开始获取距离Tom老师50000米以内人
Redis 获取数据总量:40
Redis 获取数据耗时:60

数据量少的时候也有两三倍的差异

 

2. redis 也有1000条数据

ES 开始获取距离我500000000米以内人
ES 获取数据总量:960
ES 获取数据耗时:642
Redis 开始获取距离我500000000米以内人
Redis 获取数据总量:1000
Redis 获取数据耗时:164

第二次测试

ES 开始获取距离我500000000米以内人
ES 获取数据总量:960
ES 获取数据耗时:417
Redis 开始获取距离我500000000米以内人
Redis 获取数据总量:1000
Redis 获取数据耗时:110

 

3. redis 也有10000条数据

 

ES 开始获取距离我999999999米以内人
ES 获取数据总量:9040
ES 获取数据耗时:1559
Redis 开始获取距离我999999999米以内人
Redis 获取数据总量:10040
Redis 获取数据耗时:316

第二次测试

 

ES 开始获取距离我999999999米以内人
ES 获取数据总量:9040
ES 获取数据耗时:1204
Redis 开始获取距离我999999999米以内人
Redis 获取数据总量:10040
Redis 获取数据耗时:343

差距变成了四五倍

 

4. redis 也有100000条数据(基于es默认只能拿出10000条数据,100000就不做演示了)

结论:

es是java写的,redis 是c(想想也应该redis快)

java代码需要运行在虚拟机上

c 和 c++ 可以编译成平台本身的native机器码

直接在硬件运行的,通过指针可以直接操作硬件

描述:

c语言是计算机的高级语言。

高级语言主要是相对于汇编语言而言的,基本脱离了机器的硬件系统,用人们更易理解的方式编写程序。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言,能以简易的方式编译、处理低级存储器。

C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。

 

redis 快,为什么?

①(纯内存)Redis将所有数据放在内存中,非数据同步正常工作中,是不需要从磁盘读取数据的,0次IO。内存响应时间大约为100纳秒,这是Redis速度快的重要基础。

②单线程(存取数据是单线程),没有多线程上下文切换,并且也没有锁造成阻塞

(单线程仅指Redis负责存取这块的线程只有一个,而非Redis中只有一个进程)

③多路I/O复用机制

I/O多路复用实际上是指多个连接的管理可以在同一进程。多路是指网络连接,复用只是同一个线程。在网络服务中,I/O多路复用起的作用是一次性把多个连接的事件通知业务代码处理,处理的方式由业务代码来决定。在I/O多路复用模型中,最重要的函数调用就是I/O 多路复用函数,该方法能同时监控多个文件描述符(fd)的读写情况,当其中的某些fd可读/写时,该方法就会返回可读/写的fd个数

 

 

 

测试代码:

@Test
public void compare(){
   int size = 100,radius = 50000;

   System.out.println("ES 开始获取距离我" + radius + "米以内人");
   Long esStartTime = System.currentTimeMillis();

   SearchResult result = nearbyService.search(myPointConfig.getLat(),myPointConfig.getLon(), radius, size, null);
   Long esEndTime = System.currentTimeMillis();
   Long esTime = esEndTime - esStartTime;
   System.out.println("ES 获取数据总量:" +result.getTotal());
   System.out.println("ES 获取数据耗时:" +esTime);


   //获取某坐标附近 radius 千米之内的人 单位千米
   System.out.println("Redis 开始获取距离我" + radius + "米以内人");
   Long redisStartTime = System.currentTimeMillis();
   GeoCoordinate  coordinate = new GeoCoordinate(myPointConfig.getLon(), myPointConfig.getLat());
   List responses1 = jedisGeoUtil.geoRadius("nearby",coordinate,50);
   Long redisEndTime = System.currentTimeMillis();
   Long redisTime = redisEndTime - redisStartTime;
   System.out.println("Redis 获取数据总量:" +responses1.size());
   System.out.println("Redis 获取数据耗时:" +redisTime);




}

你可能感兴趣的:(附近的人实现(Redis 3.2 以上版本和es 性能比较))