上一篇中介绍了ShardedJedis的基本使用方法以及演示了一个简单的例子,在这一篇中我们来介绍了ShardedJedis的原理。

1.ShardedJedis内部实现

首先我们来看一下ShardedJedis的一个继承关系

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnwAAAEOCAIAAACcjV1WAAAgAElEQVR4nO3d61cT574H8PM/naJYMYZcSELu95AJiKQoF4UAKlcVFAgXdWsL5AJo7e4RhmC1rbbHJ6tr7bXXOj3d+6y1l5dja2v3rtXjanfLtmtvgdfnxYQQJhcDTGYmk2/W50UY5nky8zy/PN88QOu/VRysBAAAAB78m+BXAAAAUCIQugAAADxB6AIAAPAEoQsAAMAThC4AAABPELoAAAA8QegCAADwBKELAADAE4QuAAAATxC6AAAAPEHoAgAA8AShCwAAwBOELgAAAE8QugAAADxB6AIAAPAEoQsAAMAThC4AAABPELoAAAA8QegCAADwBKELAADAE4QuAAAATxC6AAAAPEHoAgAA8AShCwAAwBOELgAAAE8QugAAADxB6AIAAPAEoQsAAMAThC4AAABPELoAAAA8QegCAADwBKELAADAE4QuAAAATxC6AAAAPEHoAgAA8AShCwAAwBOELgAAAE8QugAAADxB6AIAAPAEoQsAAMAThC4AAABPELoAAAA8QegCAADwBKELAADAE4QuAAAAT8Qbuj14FOyB2cEjzwdKZQcPwRdPEDNRh25TgxU4x8migNkpBSgVoQYNJEzUoXuk3gKc42olFfxGoNBQKkINGkiYqEO38ZAZOMfVSir4jUChoVSEGjSQMFGH7jt1JuAcVyup4DcChYZSEWrQQMJEHbr+WiNwjquVVPAbgUJDqQg1aCBhog7dBp8BOMfVSir4jUChoVSEGjSQMFGH7mFKn83RVufg7YHR/xm/8PjyhceXR/88dvajgaOtzhxNgMHVSorZkTweSqW5pX6UJqPku+AfXgb/8HL03rfDi/eaW+oFv3dhBw0kTNShW+/VZ3Rqum380cXrL2/cfnX3k98+/+S3z2+/unv95Y3xR5dOTbdlawUMrlZSzI7kFbpUTl8JjX7x4v0Hv338/dqdv63f+dv6x9+vvf/gt9EvXpy+EhL89gUcNJAwUYfuoZrqdCenjl148u7NlU9uv7rLcnPlkwtP3j05dSxjQx7UebqukshZj64wnddfXiZXB9idb/dFuVpJCz07da3BZbJ0ubUgg7mNYR+IkOVgwKMTyfVwdTv5nFzQUhm4HBr740+3nq598td1lltP18b++NPA5VBed+TpusrFvGxrZHKcjNCF3EQdunUeHUtjsz348EJs5fZHrz7NKLZyO/jwwjvN9vS2te763y0TMteV/q2dqXV3XSUkHo/H43Gm21p3V4RMn3FruXoJ1vWP0eRqP7vz7b4oVysph7NzZi4xjPF4nCwH293aOo+utiUYI4u/a+F+MGv7I8lXyetkeqjdrX3j9aTXgwglb0fYUjnafOjcF89vPl27/df1jG4+XTv3xfOmlvocg8y8F2rdXREu6mRbI5PjZIQu5Cbq0PW5tSx9yz1zL64v/+M2o+PySa3F4G2t67t6Jnlw7sX1/o+609tSLaPLMXqJTA/Y1enf3TzNVXdpmcz3a3Kc43Nrqf5wPB6PnpDpNW/rNW/bT4WWL9RRrs4ImT7tekPbnaFcdUE6w4Vt90W5Wkk5nJ2uMFkacVZXvW3UVfRHCZnrZI7rNW8XZCT7w4QeastvxFJPznE9GeuhEBfP570XrlSGPvw88pdXN5+u33y6fuPhr++cGpLJFQzm4M2n65G/vBq88Z9bLt7VOU8IM8i6KufE0sxpl4ZydUbI4qWW3b7pdlwVhRg0kDBRhy7l0rAMfnV+YWWZ/sdHSZ5W3/nbY6lHFlaWB/88nN72+CQdC7pPRUj0pCz9u0leZ+3YEpnvq8p5Tsc8IZGOfTaT3OusqnFUmfUy5niETJ125mq7Y15nbZDOcGHbfVGuVlIOZ6crRJYnaymXxmFR1I8uktkO5rjbrirISPaFCT14PL8RSz052/VkqwcR2ta9F65Uznz2hH6yGvtuLfbdWn1Hf9/MDeZ5KvrJ6pnPvt1y8c2jS0vnjhhllEuz9U23cKl5t2+6HVdFIQYNJEzUoet1VrGcfzR+YyWWytPqG7o1yjp4/tE4q2GNw3chRgepcldPiNBDxxxqr7OqpmlkmYRPpzwfsAfmkz8hjI0cc6hrHClHkif3hsnSuUaDLO1VAmEylTgnU0Ovs+rYJM3uLeXM5UlfoqumkeWNg/O9zGm+UZrM926evHE884smu2LhaiXlcHY6Q4S52hqHL0iTxH1tzE6NIzBP6IuT4XyG6GIsMUT3li5Nx8jmyb1hZkITz+nBYzkGP+VgPB5nTk6tFtYkZquHbGWQuKPexPXP96prerfc3RtPyHL7WQYq0+1kLEXeSuU0eb747RpDoam+8fU/k1+mGoi/YA1mhCTKY+ubbiF512Q2kE95pL+7U0cm/6oo0KCBhIk6dGscapZzj8Y+XKFTuVupwVsjrIPnH42zGnp6Q2Tp3GHNPo89ECGLk42KGofac3SEJlMDdmXqc43SPkqTcGCvVlXusQfmCFkKurSqcq2q3NA1TUhowK709IYIPdhiVbJfxR4Ik6kBuzJrw6MjMTLTpS7Xqcu1qnKmyRyhx+r269TlOrVzMkbmepUeO3VxdqRRL9Opy7WBKUJmBuxKj50apQkhM13qcq2qXN+50eeWF2V3lT6GXK2kHM5OZyhlLVs617p1Rjz2QJgQEj2uU+/TUoMxsnjxaF5DpOuYJrFhpre+KIl07NssBvpsa5YRY+Yu2lXBzF1XmCROTl5P+iRmr4fMZcDc0dL5emW5NjAVj8dJ9LhOXa6lBmOJG3njCRlvP+NAZb0d1l3wWSp9957/x5M1xgG54veP/5n8MtXAveeshrqO6Xg8zgxjyptuJ+WRdWS2UxUFGjSQMFGHrseuZhn478Frv3x4/dcbSe4W6syt86lHrv3y4cBXZ1kN+6OEHrFbDQc9dnV3hCwF3R672n1khCZT/VZl6nO3lRqlyVyP0mNXu3tCZOmcX1fBdGLSucdoMtejdPckFlnWq7itgTDTSbaG1kCYEELoC0cSbd09ofjWx/IExXyrMbi4sRHZvLBoV8Y+Ey+aratUXK2kHM5OR4jQw1aNcq9GWe7oDhES6rcqU2YkECYLE4dlHrvaaqwJ0gvJ0cs2RC6rym1TWQzHo2TxwhGl2xqIkulugyw55oQ+25JlxJi5a9Amxtl8YiZx8pbrYU9i5nrIVQbJO2oLk4Xx+gPM8whZYC449wlZbj/DQGW9nbS74LNUeu88ef/x6gffrH3wzVpNS1f/3C3mear3H6/2fvqE1dBpUerU+w6PLsbjcRINbLzpNu96NO/yyDoy26mKAg0aSJioQ9dtU7GcoDuu/Dhz9ZffM1p+115lrjZ4LZ1z3cmDV36cORHrTG3lsgaiKT8XSr4JXcll1KZKPndZqRFmZbSpXD0hQp9ttig2+qFG6IULR5QuayBMFiYbFazLc23kX7aGbptKr9mvUzsnlhLrHXNmraJMo9zLYC4mRkhszGPUVuhqh9IvbKNPMtejZL0oq6t0XK2kXM2O26YKhMjyBOW2qSx6mVbZMseMzOaMBMIkMXqbU5B9iGa7N+eldnghNuFtmaBJqNllTQxdywRNQk3J+WUPPmvuNhI6tVrYk5itHnLWz8YdZXj+5hMy336mgcpyO+l3wWep9Fy/c/FPK9e+Xr329erMV/9X03oy+YdUzMFrX69e/NNK7wefpbd1WZVmvaxK0RwlyfrfSXlknejtVEWBBg0kTNSh67IqWWr9xjP3z0d+vjb7y/WMIj9fO3P/fK3fmNrK2R0iZCogL1NX7lFX7lHKm0KERE/KnY3DNFmYbFS4rMrmCZqQqT6LwmnxjiyS2W6Fy6p0WtpDhMQmvJv90GebLQqXVVk/skjIItOW+VZswuu0tIcSnWRu6GwcnuxWWA0HdUpHkCaz3YkzZ7srmTP7oqE+i8LZHSL0YIN2v9Vw8Oj4YuqFkWg7c2bT5gVveVFWV+ljyNVKytXsuKzKwMzmWCnbpggJ9VkUzsZhevO+EtPktHhHFhcmG3MNETN3DEPd0NLSdHRpcaxuX2IuLN7JGKGHrcn5ZQ9+4qAieTJZTMxd4nrSJjFnPWQqgy13lOH5m0/IfPuZBir77aTfBW+lcshPnbz7LPrw9fz/rmYUffj65N1nh/zUljdy43Bso/7tprZwhrHaRnlkHZntVEWBBg0kTNSh67Qo0rVcahh8PBr6aS7y96ssoZ/nBh+PtlxqYDXpjhASakk90hkiJNzqtChqhxeYve9SZJom7/WaK50WBXV+IR6Pk6XzTeZKnbolsvmHMNNdVfuYHmxGubJtanPrHGpxWhQOc1too5NsDXujGwdnmpgjOt/g0saZkcA+p0XhMHtHFgnrwpiD0fA0q88tL5rWVTquVlKuZsdpUQRmUn6nS6aYe3E0Dm/ceFuILEw2Vm6MzMJkY2WOIZrtrkz2bDPKO0KE0INHDLLk4JNIq069L9vgOy0K5teo8XicEDo4Ok0WzzaZK5PXk3ESM9ZDtjLYekcZnudxQsbbzzBQ2W4n413wWSrt41dO3XsZevA6+miVJfTg9al7L9vHr6S3qh9ZSA5yuK0sbXy2Vx7ZRib/qijQoIGEiTp0HebKjJouHu6/PzT57Mr0z7Mzf5+b+fvc9M+zk8+u9N8farp0OP18jXKv1SBLPWIxyKoUex3mSnP1AXXlHrW8zKirUMnfYr5r0O5XycvUlXsc5kq7Sa5T71PJy1Tysmr1PrtJvtmJXqZR7lXJy6oq95iqDzAHk51ka6iSl6m3NrGb5FpVOdOPeeOgUVuhlpepK8tMKRemkr9l1FWoM/T5Vo6uWLhaSbmaHeb6VfK3VPIyjXKvzXgw9TjrSerzbEPE6pz5hXFK87IqxZ7kq2QcMZsxcVBduSdj5+mTmK0espdBhjt64y1v6/aTz7PfToa74LNU2sbf7bzzQ/DLlZn7/wo/fB1++Hrm/r+CX6503vmhfexKxiYG7X515R6mVJJv6h2XR7aR2VZVFGLQQMJEHbp2kzybmkPadrrt1Jf9A4+G+h8Mnfqv/vaF4zWHtDmaAIOrlbQoZsfqP0+TqROafYIPezHioVSoOteJq3c6bn0T+OzHzrvPOm89PjH/KVXnEvzehR00kDBRh67VeBA4x9VKKviNvFF3hMTj8dDxfxf8SopU6ZSK2AYNJEzUoWsxHATOcbWSCn4jb6SQvaU8WGbUHRD8SopU6ZSK2AYNJEzUoWvWy4BzXK2kgt8IFBpKRahBAwkTdeiaqg8A57haSQW/ESg0lIpQgwYSJurQNeoqgHNcraSC3wgUGkpFqEEDCRN16Bq0+4FzXK2kgt8IFBpKRahBAwkTdegy/zQpcIurlVTwG4FCQ6kINWggYaIOXS8eBXhw9u+14SH1B0plBw+ELuQm6tDFo0APzA4eeT5QKjt4CL54gpiJN3SLiEylkKkUgl8GFJRcpxT8GiB/B/Uewa8BIB1ClwOmZq2pWSv4ZUDhyFQK37gJH62KhUxtcF75QaY2CH4lACwI3d2SqRR1l8x1l8xYkSXM1Kytf8+Cj1bForpt1jO/Xt02K/iVALAgdHeLWY6xIksY87mq/j0LPloVBZna4Ar96plfd4V+xWYXxAahuyvJ5RgrsoQlP1fho1VRYLa5DGx2QWwQuruSuhxjRZak1M9V+GglfsltLgObXRAbhO7OsZZjrMiSxPpchY9WIpe6zcVmF0QIobtz6csxVmSJSf9chY9WYsba5mKzCyKE0N2hjMsxVmSJyfi5Ch+tRCt9m4vNLogNQneHsi3HWJElI9vnKny0EqeM21xsdkFsELo7kWM5xoosGTk+V+GjlQhl2+ZiswuigtDdidzLMVZkCcj9uQofrcQmxzYXm10QFYTuThje0TD/68ckJmiTDO9oBL9I2A2lWZV7ik3NWqVZJfh1AkNh9Ve3zaZidrepFFa/4NcJgNDlRv17FsGvAQoKU1xcPPPrgl8DQDqELjewIksepri4IHRBnBC63MCKLHmY4uKC0AVxQuhyAyuy5OGP44oLQhfECaHLDYQugKggdEGcELrcQOhKHna6xQWhC+KE0OUGQlfyMMXFBaEL4oTQ5QZWZMnDFBcXhC6IE0KXG1iRJQ9TXFwQuiBOCF1uYEWWPExxcUHogjghdLmBFVnyMMXFBaEL4oTQ5QZWZMnDXy8XF4QuiBNClxsI3VKQ/q9LMUlcuOOC33Lh5PgXgbgi+D0CpEPockPa6yMIQtp7a4QilCaELjcQugDbgtCF0oTQ5QZCFziHnS6A9CB0uYHQBc5Ju6gQulCaELrckPb6CIKQdlEhdKE0IXS5Ie31EQQh7aJC6EJpQuhyQ9rrIwhC2kWF0IXShNDlhrTXRxCEtIsKoQulCaHLDWmvjyAI/PUygPQgdLmB0AXYFoQulCaELjcQusA57HQBpAehyw2ELnBO2kWF0IXShNDlhrTXRxCEtIsKoQulCaHLDWmvjyAIaRcVQhdKE0KXG9JeH0EQ0i4qhC6UJoQuN6S9PoIgpF1UCF0oTQhdbkh7fQRB4K+XAaQHocsNhC7AtiB0oTQhdLmB0AXOYacLID0IXW4gdIFz0i4qhC6UJoQuN6S9PoIgpF1UCF0oTQhdbkh7fQRBSLuoELpQmhC63JD2+giCkHZRIXShNCF0uSHt9REEIe2iQuhCaULockPaf2gKgpB2UVW3zQp+DQD8K/rQ9VK+Hjx6enp6eryUT/DpkLwGv1/oecZj2w+bw4V5L97H7qdPVKQQujVuS1ODtcTVuC0IXR40+P0ep0Hw6Yb82WwGTkIX81680ycqUghdj8t8pN5S4jwuM0KXBw1+v9uhF3y6IX9WKzehi3kv3ukTFYmEbuOhUofQ5UeD3++yVws+3ZA/rkIX81680ycqUghdt9P0Tl2pcztNCF0eNPj9Tnu14NMN+bNa9JyELua9eKdPVCQSuv5aY4lD6PKjwe932nSCTzfkz8JV6GLei3b6REUKoetyGBt8hhLnchgRujxo8PsdVq3g0w354yp0Me/FO32iIpHQPUzpszna6hy8PTD6P+MXHl++8Pjy6J/Hzn40cLTVmaNJMULo8qPB77dbtdlmobmlfpQmo+S74B9eBv/wcvTet8OL95pb6gUvj1JmMVdzEro55r1EFpninT5RkULoOu3Geq8+o1PTbeOPLl5/eeP2q7uf/Pb5J799fvvV3esvb4w/unRqui1bq2LktCN0+dDg99st2oxTcPpKaPSLF+8/+O3j79fu/G39zt/WP/5+7f0Hv41+8eL0lZDgFVKyzFyFbpZ5L51FpninT1SkEbqGQzXV6U5OHbvw5N2bK5/cfnWX5ebKJxeevHty6ljGhunqPF1XSeSsR5fn+dtS56m/vEyuDrA739aLOu0GhC4PGvx+m1mTPv4Dl0Njf/zp1tO1T/66znLr6drYH38auBzKtx5ag8tk6XJrQYotrcA4eKG6gQhZDgbyK9RtnZyt7baGiKvQzTjvHC4ynN+4aG2rBhC6ouOlfA6boc6jY2lstgcfXoit3P7o1acZxVZuBx9eeKfZnt621t11lZB4PB6Px8lcF3MkQqbPuLXpJ+9erbt+jCZX+9mdb+tFHTaELh+YxZc1+EebD5374vnNp2u3/7qe0c2na+e+eN7UUs9qeGYuUWbxeJwsB9vd2jqPrrYlGCOLv2vhuNhSq5optlp3V4SLF6rtjxB6qD2/QmWdXNsfSd54/m23NUQmk46r0GX1vKtFpjA3nr52idC2CoaT6RMVKYSu3ab3ubUsfcs9cy+uL//jNqPj8kmtxeBtreu7eiZ5cO7F9f6PulkNqf5wPB6PnpDpNW/rNW/bT4WWL9RRrs4ImT7t0qS/0O5RrrogTeb72Z1v60XtNj1ClwcNfr/FVMUa/KEPP4/85dXNp+s3n67fePjrO6eGZHIFgzl48+l65C+vBm/8J6thV5gsjTirq9426ir6o4TMdTLH9Zq3ua6xznlCmKrWVTknlmZOuzSUqzNCFi+17Laqqf4woYfa8itU1sk7bpv/EHEVuunzvuNFpkA3nnHt4raQOLGte0foio6X8tmtesqlYRn86vzCyjL9j4+SPK2+87fHUo8srCwP/nk4tZXX2TFPSKRjn80k9zqrahxVZr2MOR4hU6edVekvtHteZ22QJvN97M639aJ2K0KXDw1+v8WkZg3+mc+e0E9WY9+txb5bq+/o75u5wTxPRT9ZPfPZt6yGXSGyPFlLuTQOi6J+dJHMdjDH3XYVxzXWPLq0dO6IUUa5NFureuFS826r2tsXJvTg8fwKlXXyjtvmP0RGI1ehy573nS0yBbrxbGuXCG3r3jmZPlGRQujarNVeZxXL+UfjN1ZiqTytvqFbo6yD5x+Np7aq6Q2TpXONBhmrtxpHIEymTjvUzPP55A9wSJg56HVWHZukWQdTz1ye9CW6ahpZ3jg438uc5hulyXzv5skbxzO/aLKrVDZrNUKXBw1+v9moZg3+afJ88ds1hkJTfePrfya/TDUQf8Fq2BkizGzWOHxBmiTmvWlkmYRPO9Q1jsA8oS9OhvMpoYuxRAndW7o0HSObJ/eGSWyk1R6IkET/W6t6Idk/mQ3k0z+JjRxLXFvKz8bpwWM5aj7LyYnL237b5BBlfN+xGI1aTkI3fd53tsgU6MazrV3ZlqxEdfUm5nq+V13Tu6XS3nhCllLJUrRZaoCf6RMVSYSupbrGoWY592jswxU6lbuVGrw1wjp4/tF4aitPb4jQgy1WJas3jz0QJlMDdqXHHpgjZCno0qrKtapyQ9c0IaEBu9JzdCRGZrrU5Tp1uVZVzjSZI/RY3X6dulyndk7GyFyv0mOnLs6ONOplOnW5NjBFyMyAXemxU6M0IWSmS12uVZXrOzf63PKi7K5YV2izIHT50OD3mwwq1uD33Xv+H0/WGAfkit8//mfyy1QD956zGnaGUpahpXOtdmWNQ+05OkJvzHuYEBI9rlPv01KDMbJ48WheJaTrmCaxYaa3viiJdOyrcah1HdPxeJwprZSq3kn/zLsg2lXBvAu6woTQZ1uzFGq2k1PecdtuuzlEae+7dFyFbvq872yRKdCN51i7Mi9ZzOwvna9XlmsDU/F4nESP69TlWmowlpj0N56QsVQyFlXW2+Fn+kRFCqFrtVR77GqWgf8evPbLh9d/vZHkbqHO3DqfeuTaLx8OfHU2tZW7J1G4rN7c1kCYTPVble6eEFk659dVMMdNOvcYTeZ6lG5rIEwIIfSFI8pkV/Gtj+UJivlWY3Bx48PdVL9V6bZSozSJdmXsM/Gi2bpKsiJ0ecEsvqzB773z5P3Hqx98s/bBN2s1LV39c7eY56nef7za++kTVsOOEKGHrRrlXo2y3NEdIiTUb1W6j4zQicIIhMnCxGGZx662GmuC9EKyurKVkMuqcttUFsPxKFm8cETptgaiZLrbIPPY1U6LUqfed3h0MR6Pk2hgo6o3+x/Nu3/mXdCgTVSs+cQMoc+2ZCnUbCenvOO23XbrEG1536UzGDgLXU4WmQLdeNa1K9eSlZz9tjBZGK8/wDyPkAWmeHKfkKVUMhRt1tvha/pERRKha9a5bSqWE3THlR9nrv7ye0bL79qrzNUGr6Vzrjt58MqPMydinamtXNZAmCxMNipYvbk28s/VEyL02WaLYuM4NcJUlU2l1+zXqZ0TS4kaYs6sVZRplHsZbpvKdWQkRkhszGPUVuhqh5j3j8tKjTBvg80+yVyPkvWirK5YrGYdQpcHDX6/Ua9kDX7P9TsX/7Ry7evVa1+vznz1fzWtJ5N/SMUcvPb16sU/rfR+8BmrYSBElicot01l0cu0ypY5pnI2FlamGpnqSlZajhKa7d6s29rhhdiEt2WCJqFmlzVZWkqzXlalaI6SZIHtpH/2u2AjPzLXfJaTmS9bJmgSakoez7NtcojS33fpbw2uQjd93ne2yBToxrOuXVmWrK2zn+H5m0/IXCqZiip7DfAzfaIihdC1mHUuq5Kl1m88c/985Odrs79czyjy87Uz98/X+o2shvUji4QsTjYqmC+d3aHYhNdpaQ+RqT6LwmlpDxESm/Amv8sUk7NxeLJbYTUc1CkdQZrMdifOnO2uZM7si4b6LApnd4jQgw3a/VbDwaPjiyTRp3dkkZBoO3Nm0wRNNl9r80VZXbEu24LQ5QWz+LIG/5CfOnn3WfTh6/n/Xc0o+vD1ybvPDvkpVsPAzGYtKdumCAn1WRTOxmF6c94XmFJ0WrwjiwuTjblKaLZ7syoMdUNLS9PRpcWxun0uq9LZOBzbKDC7qY1ZnXfc/0ZBJhpOxghZPNucpVCznZz8kh62pvSZV9vNIUp736UvBXq9hqvQ5WqRKdCNZ1+7Mi1ZW2Y/w/M3n5C5VDIVVfbb4Wf6REUSoWvSOi2KdC2XGgYfj4Z+mov8/SpL6Oe5wcejLZca0lvZjHJl29Tmb9pCLU6LwmFuC5H3es2VTotCp26JbP5VwnRX1T6mYW904+BME3NE5xtc2jgzEtjntCgcZu/IYuLIUmSaJu/1miuZg9HwNKvPLS+a1hWLxaRF6PKgwe83VGcotvbxK6fuvQw9eB19tMoSevD61L2X7eNX0lsFZlJ+p0ummLl2NA5vFEZbiCxMNlZuVM7CZGNljhKa7a5MLeOOECH04BGDjDlSP7KQfK1wW9lGge2wf+aXfPF4nBA6ODpNFs82ZS/UjCcz7xcSadWp92V7v2RrmxyijO87Fq5CN+O872CRKdyNZ1y7si1ZW2c/w/M8TshYKhmKKkfB8DN9oiKF0DWbtA5zZUZNFw/33x+afHZl+ufZmb/Pzfx9bvrn2clnV/rvDzVdOpytlUUv0yj3quRlVZV7TNUHmIMq+VvME7tJrlPvU8nLVPKyavU+u0m+cUKZemsTu0muVZUz/Zg3Dhq1FWp5mbqyzKSrSPapkr9l1FWoM/T5Vo6uUpkRurxo8Pv1OkXGsmkbf7fzzg/BL1dm7v8r/Ceup2QAAA4SSURBVPB1+OHrmfv/Cn650nnnh/axKxmbqORvqeRvqeRlGuVem/Fg6nHWk9Tn2UqI1TnzC+PklwbtfnXlHua1rAbZLvu3GRMFqa7ck3paxkLNdrJKXlal2JO88W223eyE9b5j0eurOAndbPO+g0WmcDeece3KvmRlmP03lt+2SiX5PEcN8DB9oiKJ0DVq7CZ5NjWHtO1026kv+wceDfU/GDr1X/3tC8drDmlzNClGZqMGocuDBr9fr6vMNgtUnevE1Tsdt74JfPZj591nnbcen5j/lKpz8V8PVv95mkyd0OwTvDIFV13NVehmnfcSWWSKd/pERQqhazJqrMaDJc6E0OVFg99frZULPt25dUdIPB4PHf93wa9EDHQcha74512SOJk+UZFC6BoNGovhYIkzGhC6fGjw+3UaueDTnZtC9pbyYJlRd0DwKxEDrkJX/PMuSQhd0fFSPqOhyqyXlTijoQqhy4MGv1+rkQs+3ZA/nU7NSehi3ot3+kRFCqFr0FeZqg+UOIMeocuHBr9fW3VQ8OmG/Gm5Cl3Me9FOn6hII3TVRl1FiTPo1QhdHjT4/ZoqmeDTDfnTarkJXcx78U6fqEghdPXVaoN2f4nTVyN0+dDg91epZYJPN+RPq1VxErqY9+KdPlGRRuiqmH8/sqRVqxC6PGjw+6tUB4SfbsibhqvQxbwX7fSJihRC12Yze0v+YbOZEbo8aPD77TaL0LONxzYeJpOek9DFvAvy4GT6REUKoduDR09PT08PQpcHDX6/0POMx7YfnISu0DdRug+ELrDJVAqZSiH4ZQDsxkG9R/BrgEKQa5UH5MJfBjAQuhwwNWtNzVrBLwNgx+QGyn7p2wq5SvArAc7ZT1Tr6jSCXwYwELq7JVMp6i6Z6y6ZsdmF4mXq+9gzv17VMCr4lQC3FHrloXct3qAJm12RQOjulqlZW/+epf49Cza7UKTkBsoz99ozv+64/D02uxJjP1HNLFDY7IoEQndXmG0uU9PY7EKRYra5DGx2pYTZ5jILFDa7IoHQ3ZXkNhebXShSyW0uA5tdKUluc7HZFQ+E7s6lbnOx2YUilbrNxWZXSlK3udjsigdCd+dY21xsdqHosLa52OxKCWubi82uSCB0dyh9m4vNLhSd9G0uNrvSkL7NxWZXJBC6O5Rxm4vNLhSRjNtcbHalIeM2F5tdMUDo7kS2bS42u1BEsm1zsdktdtm2udjsigFCdydybHOx2YWikGObi81uscuxzcVmV3AI3Z0wvKNh/tePSUzQJhneQU2DqCld7dVts6k88+usI/i/MRejA/JK09Fcq5OpWYvQFRBClxv171kEvwaA3fDMrwt+DVAIWJ1EBaHLDfw8GYodQleqsDqJCkIXACorELoAvEDocgOfJaHYIXSlCquTqCB0uYHfmkCxQ+hKFVYnUUHocgNlDcUOoStVWJ1EBaHLDZQ1FDuErlRhdRIVhC43UNZQ7BC6UoXVSVQQutxAWUOxQ+hKFVYnUUHocgN/HwjFDqErVVidRAWhCwCVFQhdAF4gdLmBz5JQ7BC6UoXVSVQQutzI+K8Mpf9jRDiO4/kc57N0U/9lIbxTpHqcz4qC3BC6AOLC876E5w0udl1Q4hC6ACUNP1UG4BNCF0BcsNMFkDCELoC48P87XQnfHYDYIHQBxAWhCyBhCF0AcUHoAkgYQhdAXBC6ABKG0AUQF4QugIQhdAHEBX+9DCBhCF2Akob/TheATwhdAHHBThdAwhC6AOKC3+kCSBhCF0BcELoAEobQBRAXhC6AhCF0AcQFoQsgYQhdAHFB6AJIGEIXQFzw18sAEobQBShp+O90AfiE0AUQF+x0ASQMoQsgLvidLoCEIXQBxAWhCyBhCF0AcUHoAkgYQhdAXBC6ABKG0AUQF4QugIQhdAHEhee/761um5Xw3QGIDUIXoFC8lK8HDy4eXson+GwCcAKhC1AoXspX47Y0NVhhN2rcFoQuSAZCF6BQvJTP4zIfqbfAbnhcZoQuSAZCF6BQmNBtPAS7gtAFKUHoAhSKl/K5naZ36mBX3E4TQhckA6ELUChM6PprjbAbCF2QEoQuQKF4KZ/LYWzwGWA3XA4jQhckA6ELUChM6B6m9Nk0t9SP0mSUfBf8w8vgH16O3vt2ePFec0t9jiYlCKELUoLQBSgUL+Vz2o31Xn1Gp6+ERr948f6D3z7+fu3O39bv/G394+/X3n/w2+gXL05fCWVrVYKcdoQuSAdCF6BQvJTPaTccqqlON3A5NPbHn249Xfvkr+sst56ujf3xp4HLoYwNWeo8XVfJ0uVWXT4n5+pnIEKWgwFPXv1s6+Rsbetag8v5XbnTbkDogmQgdAEKxUv5HDZDnUfHcrT50Lkvnt98unb7r+sZ3Xy6du6L500t9ayGte6uq4TE4/F4PH61X8sciZDF37Vo019lW2r7I4Qeanfn1Q/r5Nr+CFkObrdtbUswlt+VO2wIXZAOhC5AoXgpn92m97m1LEMffh75y6ubT9dvPl2/8fDXd04NyeQKBnPw5tP1yF9eDd74z9RWlKtznpDoCZle87auyjmxNHPapaFcnRGyeKlFk/4q20L1hwk91ObKqx/WyTtuq9e8nU8Tu02P0AXJQOgCFIqX8tmtesqlYTnz2RP6yWrsu7XYd2v1Hf19MzeY56noJ6tnPvs2tZW3eXRp6dwRo4xyaWocVWa9jHJpvM6OCFm41FyV/irb4u0LE3rwuDOvflgn77it267Kp4nditAF6UDoAhSKl/LZrNVeZxXLafJ88ds1hkJTfePrfya/TDUQf5HaqsYRiBAy36tmHQyThYuTYeZnzmQ2kDjeNLK88YNopkmNw3cxRuZ7A/OEkNjIMYe6xhGY3zgnHo8TevCYgzlz8/jypC/5QhlP9jqranrDO2hb0zSyTMKnHWqvs+rYJJ341saRVDZrNUIXJAOhC1AoXspns1TXONQsffee/8eTNcYBueL3j/+Z/DLVwL3nrIa6jul4PE5IaMCuZI547IEwISR6XKfep6UGY2Tx4lGlx05dnB1p1Mt06nJtYIqQmQG70mOnRmlCyEyXulyrKvfYA3OERLsqtKpyraq8K0wIfbbVrvTYA3OEHqvbr1OX69TOyRiZ61VmOzlxDb2hHbT1HB2hydSAXek5OhIjM13qcp26XKsqTx8umwWhC9KB0AUoFC/ls1qqPXY1S++dJ+8/Xv3gm7UPvlmraenqn7vFPE/1/uPV3k+fsBo6LUqdet/h0cV4PE6iAY9d7bYGwmRh4rDMY1dbjTWj9MKFI0rm5Mbg4sb2carfqnRbqVGaRLsqXFaV26Zy94TI0rkGbQVzsvnEDKHPtliV7p5QfOtjeYLKdjLzpbsntIO27iMjdOLCAmFCCKGTV85iReiChCB0AQrFS/msZp3bpmLpuX7n4p9Wrn29eu3r1Zmv/q+m9WTyD6mYg9e+Xr34p5XeDz5Lb+uyKs16WZWiOUrIXI/SZQ2EycKFI0q3TeWyUiP0woUjSteRkRghsTGPUVuhqx1iss1lpUZoMtutSPTTEyL02WbLli9brErmSa2iTKPcy8hxMvNlywRNQk3J43m2dSVD16bSa/br1M6JpUT0sm7ZatYhdEEyELoAheKlfBazzmVVshzyUyfvPos+fD3/v6sZRR++Pnn32SE/ldrK2Tgci7Yzz+2mtjBZmGxUOC3tIbIw2ahwWZVOi3dkcWGyUeHsDhF6sEG732o4eHR8kZCpPovCafGOLJLZbkWiN0t7iCS+dFq8kzFCFs82WxQbxyuZ0/qiob7Ng+yTk1/Sw9aUPvNq62wcppkLaxye7FZYDQd1SkeQ3rzCJAtCFyQEoQtQKF7KZzFpnRZFuvbxK6fuvQw9eB19tMoSevD61L2X7eNX0lvVjywkf3IbbitzWhQOc1uILEw2VjotCoeZCd1Kh9k7spj4w6WlyDRN3us1Jw7Odlcme9MGpjZ+/kwHR6fJ4tkmc6XTotD5Bpc2/u4pEtiX4+TeKInH4yTSqlMnTsu/raNxmLkwp0XB9BOPx8lMU/pdW0xahC5IBkIXoFC8lM9s0jrMlRm1jb/beeeH4JcrM/f/FX74Ovzw9cz9fwW/XOm880P72JWMTQza/erKPSp5mUa512qQMQdV8reSJySfG7UVanmZurLMpKtIHkw902GutBnlWlW5Sl6mrtyTeprdlDheVbnHXH0g98kqeVmVYo/NeHBHbTc7UcvLqir3mDaapDIjdEFCELoAheKlfGajxm6SZ0PVuU5cvdNx65vAZz923n3WeevxiflPqTpXjiYlyGzUIHRBMhC6AIXipXwmo8ZqPAi7YULogoQgdAEKxUv5jAaNxXAQdsNoQOiCdCB0AQrFS/mMhiqzXga7YTRUIXRBMhC6AIXipXwGfZWp+gDshkGP0AXpQOgCFIqX8hn0aqOuAnbDoFcjdEEyELoAheKlfPpqtUG7H3ZDX43QBelA6AIUipfy6atVes3bsCvVKoQuSAZCF6BQvJTPZjN78djdw2YzI3RBMhC6AIXipXw9eHDxQOiCZCB0AQAAeILQBQAA4AlCFwAAgCcIXQAAAJ4gdAEAAHiC0AUAAOAJQhcAAIAnCF0AAACeIHQBAAB4gtAFAADgCUIXAACAJwhdAAAAniB0AQAAeILQBQAA4AlCFwAAgCcIXQAAAJ4gdAEAAHiC0AUAAOAJQhcAAIAnCF0AAACeIHQBAAB4gtAFAADgCUIXAACAJwhdAAAAniB0AQAAeILQBQAA4AlCFwAAgCcIXQAAAJ4gdAEAAHiC0AUAAOAJQhcAAIAnCF0AAACe/D/I9nv8gzo2MAAAAABJRU5ErkJggg==" alt="" />

看完了图,那么我们一步一步跟着我们的代码调用来看,以我们最简单的 ShardedJedis.get(key)方法为例:

  public String get(String key) {
Jedis j = getShard(key);
return j.get(key);
}

这边有调用一个getShard 方法,参数为我们传入的key,然后返回一个普通的jedis对象,那么这个getShard是用来做什么的呢,大家可能已经猜到了,这个方法就是会根据我们传入的key做一致性哈希判断,然后返回key落到的那个redis实例上的一个redis连接,不同的key返回的redis连接可能是不同的。

进入getShard 方法,你会发现这个实现是在Sharded类中实现的(看上面的类图可以发现顶层的Sharded类),代码如下:

public R getShard(String key) {
return resources.get(getShardInfo(key));
} public S getShardInfo(byte[] key) {
SortedMap<Long, S> tail = nodes.tailMap(algo.hash(key));
if (tail.isEmpty()) {
return nodes.get(nodes.firstKey());
}
return tail.get(tail.firstKey());
} public S getShardInfo(String key) {
return getShardInfo(SafeEncoder.encode(getKeyTag(key)));
}

上面的方法是层层调用的关系,在这边不细说,我们主要看下第二个方法(getShardInfo(byte[] key))实现(上面的nodes变量是一个TreeMap 类型, algo Hashing类型,即key分片所使用的hash算法,这个在前一篇有简单说过),那么这段代码的含义我们大概成猜出来了,

  1. 就是在一个TreeMap中取出大于等于key之后的部分视图SortMap
  2. 在SortMap取得第一个键值对的值,然后返回一个 S 对象,
  3. 然后根据这个S 对象,去resources(resources = new LinkedHashMap<ShardInfo<R>, R>())中get一个R对象

那么这个S R对象各自代表什么呢?看下面的代码

public class Sharded<R, S extends ShardInfo<R>>
public class BinaryShardedJedis extends Sharded<Jedis, JedisShardInfo> implements
BinaryJedisCommands

可以得出  S = JedisShardInfo, R = Jedis 对象,即在TreeMap存储了服务器划分的虚拟节点的信息,LinkedHashMap中存储了服务器的物理连接。

JedisShardInfo具体信息如下:里面包含了jedis服务器的一些信息,最重要的是它的父类中有一个weight字段,作为本jedis服务器的权值。

ok,那我们了解了实际上就是根据jedis服务器的信息去获取一个jedis的连接,返回给上层调用。

我们可以梳理下这个逻辑:

  1. 当我们使用ShardedJedis去查一个key时,首先它会把这个key进行一个hash算法
  2. 根据这个hash值然后去treeMap中,查出这个key落在哪个实例中,并返回redis实例对应的具体信息
  3. 根据这个redis的实例信息,到一个保存jedis链接和实例信息对应关系的LinkedHashMap中找到这个jedis连接
  4. 最终返回jedis连接,执行对象的命令操作(到这步后实际上和单机操作一样了)

那么我们的nodes 服务器虚拟节点和resources 服务器物理连接是什么时候初始化的呢,接下来继续看

2.redis虚拟节点(nodes)和物理连接(resources) 初始化

我们继续看Sharded的构造方法

public Sharded(List<S> shards, Hashing algo) {
this.algo = algo;
initialize(shards);
} public Sharded(List<S> shards, Hashing algo, Pattern tagPattern) {
this.algo = algo;
this.tagPattern = tagPattern;
initialize(shards);
}

这边有一个initialize方法,就是用来对虚拟节点和物理连接进行初始化的,看其实现

private void initialize(List<S> shards) {
nodes = new TreeMap<Long, S>(); for (int i = 0; i != shards.size(); ++i) {
final S shardInfo = shards.get(i);
if (shardInfo.getName() == null) for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {
nodes.put(this.algo.hash("SHARD-" + i + "-NODE-" + n), shardInfo);
}
else for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {
nodes.put(this.algo.hash(shardInfo.getName() + "*" + shardInfo.getWeight() + n), shardInfo);
}
resources.put(shardInfo, shardInfo.createResource());
}
}

具体细节就不说了,根据上面的,我们就知道是在这边进行了初始化,将每台服务器节点采用hash算法划分为160个虚拟节点(可以配置划分权重),保存在TreeMap中,

然后把每台服务器节点的信息和物理连接以键值对保存LinkedHashMap中。

然后通过一系列的查找,发现Sharded的构造方法其实是在我们 jedisPool.getResource() 时就完成的

  //初始化ShardedJedisPool
List<JedisShardInfo> infoList = Arrays.asList(shardInfo1, shardInfo2, shardInfo3);
ShardedJedisPool jedisPool = new ShardedJedisPool(poolConfig, infoList);
ShardedJedis jedis = jedisPool.getResource();

纳尼? 每次jedisPool.getResource() 才初始化?那会不会造成很慢呢,其实不用担心,其底层是使用了commons.pool来进行连接池的一些操作,会根据我们配置的连接池参数来生成对应的连接并保存,其中的细节很复杂,博主没有继续深究,实现其实和数据库连接池是一致的。

3.总结

ShardedJedis分布式具体的的实现思路:

  • redis服务器节点划分:将每台服务器节点采用hash算法划分为160个虚拟节点(可以配置划分权重)

  • 将划分虚拟节点采用TreeMap存储

  • 对每个redis服务器的物理连接采用LinkedHashMap存储

  • 对Key or KeyTag 采用同样的hash算法,然后从TreeMap获取大于等于键hash值得节点,取最邻近节点存储;当key的hash值大于虚拟节点hash值得最大值时,存入第一个虚拟节点

  • sharded采用的hash算法:MD5 和 MurmurHash两种;默认采用64位的MurmurHash算法;

好了,大概的实现如上面所说的,都是图可能会有点乱,大家如果有什么问题或者发现了什么错误,please tell me!

Jedis下的ShardedJedis(分布式)使用方法(二)的更多相关文章

  1. Jedis下的ShardedJedis(分布式)使用方法(一)

    原来项目中有用到Redis用作缓存服务,刚开始时只用一台Redis就能够满足服务,随着项目的慢慢进行,发现一台满足不了现有的项目需求,因为Redis操作都是原子性这样的特性,造成有时同时读写缓存造成查 ...

  2. Jedis下的ShardedJedis

    jedis客户端操作redis主要三种模式:单台模式.分片模式(ShardedJedis).集群模式(BinaryJedisCluster) ShardedJedis是通过一致性哈希来实现分布式缓存的 ...

  3. linux系统下php安装mbstring扩展的二种方法

    .执行 复制代码代码如下: yum install php-mbstring 2. 修改php.ini (这一步非常重要, 部分lxadmin版本无法自动修改) 复制代码代码如下: echo ‘ext ...

  4. was集群下基于接口分布式架构和开发经验谈

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/luozhonghua2014/article/details/34084935    某b项目是我首 ...

  5. 分布式共识算法 (二) Paxos算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...

  6. 在Linux下配置多线路ADSL的方法

    经过一段时间的观察,证明运行良好,现把设置过程及方法总结一下,欢迎指正.此文档可以说明双ADSL及多ADSL增加线路的配置过程. 实验环境: 操作系统: RedHat7.3 两条ADSL,长期观察线路 ...

  7. Android抓包方法(二)之Tcpdump命令+Wireshark

    Android抓包方法(二) 之Tcpdump命令+Wireshark 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等.学会抓包分 ...

  8. PHP-Fcgi下PHP的执行时间设置方法

    昨天,一个程序需要导出500条数据,结果发现到150条是,Nginx报出504 Gateway Timeout错误,原来PHP-Fcgi下的设置执行时间与isapi的不同     一般情况下设置PHP ...

  9. hadoop2.2.0+hive-0.10.0完全分布式安装方法

    hadoop+hive-0.10.0完全分布式安装方法 1.jdk版本:jdk-7u60-linux-x64.tar.gz http://www.oracle.com/technetwork/cn/j ...

随机推荐

  1. Android详细的对话框AlertDialog.Builder使用方法

      我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继 ...

  2. javascript的封装实例

    StringBuffer方法的js自定义封装: <!doctype html><html lang="en"> <head> <meta ...

  3. SharePoint 2010 文档管理之点击次数

    前言:很多场景下,我们都需要对一篇文章或者文档的点击次数进行统计,然而SharePoint本身并没有给我们设计这样一个字段,所以我们需要通过简单的字段开发来实现这样一个功能. 一.创建项目: 1. 创 ...

  4. ArcGIS 10 SP5中文版(ArcGIS10补丁5中文版)

    下载地址:百度网盘下载地址:http://pan.baidu.com/s/1o7qPGhk 来自:http://zhihu.esrichina.com.cn/?/sort_type-new__day- ...

  5. WEB程序调用客户端程序

    最近一个项目中要点击WEB页面上的链接启动自己编写的程序,而且还要接收参数,google了1.5小时,终于初步试验通过了. 尝试google了:web send message windows for ...

  6. iOS面试中常见的算法题目

    一.前言 这里是在iOS求职中自己遇到的算法题,希望对大家有所帮助.不定期更新.如果大家想在线运行代码调试,可以将代码拷贝到这里.然后进行调试.下面就是常见的算法题目. 二.正文 1.就n的阶乘.(这 ...

  7. IOS 网络浅析-(九 NSURLSession代理简介)

    从最开始什么都不懂的小白,到到现在略知一二的小孩.我觉得不仅仅是我,大家应该都会注意到代理几乎贯穿着IOS,那么问题来了,我接下来要说什么呢,那就是.标题的内容啦.上篇网络系列的文章我介绍了NSURL ...

  8. 朝花夕拾-android 自定义application 管理activity的生命周期

    为了安全退出多个已创建的activity? 可以自定义application:myapplication. 增加一个list成员保存,一些关键的已创建的activity实例: private List ...

  9. redis高可用之REDIS SENTINEL

    1. Redis主从配置 1.1. 设置主从复制 Master <= Salve 10.24.6.5:6379 <= 10.24.6.7:6379 1.2.   取消主从复制 1.3.   ...

  10. openswitch db files

    http://openvswitch.org/support/dist-docs/ovsdb-tool.1.html FILES The default db is /etc/openvswitch/ ...