- 每次JVM启动以后都是单独虚拟的一块内存空间,所以程序第一次打印 System.out.println( new Object() );的结果是一样,不管运行多少次,如果不干别的事,第二次,第三次答应,也分别可另一一次启动的JVM结果一样。我们说的hash是内存地址,是Java虚拟的内存的地址。
- Java程序执行的过程编译-->加载-->解释-->分配内存-->执行命令,Java文件编译成为class字节码文件,通过classLoader加载到内存,然后有解释器解释成汇编码,汇编码被计算机翻译成为机器码。解释执行是一行一行的读,即时编译预先解释病缓存热点代码,缓存在堆外缓存codeCache中,大约占有20%。
- 一个请求占用多少带宽?一个1Mb的带宽可以支撑多少请求?一个Long是8个byte,用字符形式表示是19个byte(为了避免js上面的丢失精度,一般吧Long单做Spring处理),算上key和结构数,按照30算。假设一个响应有10个响应头,响应体里面20个字段的json 数据。这一个响应就是900byte,约1KB。实际过程中,也有响应体体远小于20字段的,也有表数据这种,远大于1KB的,更具实际情况,大多数一般都在0.5KB-10Kb的之间。按照1KB算,1Mb的带宽实际最大下载速度是128KB/s,也就是说1Mb的带框约可以撑起 128个响应。10Mb可以支撑1280个请求,100Mb可以支撑12800请求/s.如果按照5KB算100Mb的带宽可以支撑2560个请求的并发。请求比响应速度低的多,所以我们一般只考虑响应带宽。也就是100W并发,起码需要万兆光纤才行。
- redis 的 每秒10W次读写的单机速度是有前提的,要带宽足够,假设我们读写的对象平均20个字段,字段名字+字段的值25字节,一个对象也就是0.5K,10W个对象,0.5*100000/1024x8=390.625兆的带宽(带宽计算单位不是 Byte 子字节,所以要乘8)。所以在在ECS之类的云服务器上的redis不可能达到这个效率,另外10W每秒是redis 官方说的,可能有些水分,如果官方说的没有水分,带宽不够400M是理论上都行不通。
- redis 如果处理太多的大值,可能会造成内存负载倾斜,也可能会触发缓存回收,大大的频繁的loadDB,导致系统性能降低,甚至雪崩,所以不要大量的在redis中存大值对象。
- 本地缓存能有效的减少redis全局缓存的压力,本地缓存可以是EHcache,并且redis6 客户端默认就自带了本地缓存,通过事件监听可以很方便的实现本地缓存和redis全局缓存的一致性。
- rdb_bigkeys 这个 GO语言写的工具可以很方便的帮我查找RDB文件中是否有大Key。