PCEtLXtzdWJ0ZW1wbGF0ZSBjb21tb24vaGVhZGVyX2NvbW1vbn0tLT4JPCEtLXtpZiAkX0dFVFsnbW9kJ10gPT0gJ3ZpZXd0aHJlYWQnICYmICFlbXB0eSgkX0dbJ3RpZCddKX0tLT4KCTxsaW5rIHJlbD0iY2Fub25pY2FsIiBocmVmPSJodHRwczovL3d3dy5xaWRhbzEyMy5jb20vYmJzL3RocmVhZC17JF9HWyd0aWQnXX0tMS0xLmh0bWwiIC8+Cgk8IS0te2Vsc2VpZiAkX0dFVFsnbW9kJ10gPT0gJ2ZvcnVtZGlzcGxheScgJiYgIWVtcHR5KCRfR1snZmlkJ10pfS0tPgoJPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vd3d3LnFpZGFvMTIzLmNvbS9iYnMvZm9ydW0teyRfR1snZmlkJ119LTEuaHRtbCIgLz4KCTwhLS17ZWxzZWlmICRfR0VUWydtb2QnXSA9PSAnZ3VpZGUnfS0tPgoJPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vd3d3LnFpZGFvMTIzLmNvbS9iYnMvZ3VpZGUvIiAvPgoJPCEtLXtlbHNlaWYgJF9HWydiYXNlc2NyaXB0J10gPT0gJ2ZvcnVtJyAmJiAoZW1wdHkoJF9HRVRbJ21vZCddKSB8fCAkX0dFVFsnbW9kJ10gPT0gJ2luZGV4Jyl9LS0+Cgk8bGluayByZWw9ImNhbm9uaWNhbCIgaHJlZj0iaHR0cHM6Ly93d3cucWlkYW8xMjMuY29tL2Jicy8iIC8+Cgk8IS0tey9pZn0tLT4KCXJgbmB0PG1ldGEgbmFtZT0iYXBwbGljYXRpb24tbmFtZSIgY29udGVudD0iJF9HWydzZXR0aW5nJ11bJ2JibmFtZSddIiAvPgoJPG1ldGEgbmFtZT0ibXNhcHBsaWNhdGlvbi10b29sdGlwIiBjb250ZW50PSIkX0dbJ3NldHRpbmcnXVsnYmJuYW1lJ10iIC8+Cgk8IS0te2lmICRfR1snc2V0dGluZyddWydwb3J0YWxzdGF0dXMnXX0tLT48bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVsxXVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ3BvcnRhbCddKSA/ICRfR1snc2NoZW1lJ10uJzovLycuJF9HWydzZXR0aW5nJ11bJ2RvbWFpbiddWydhcHAnXVsncG9ydGFsJ10gOiAkX0dbc2l0ZXVybF0uJ3BvcnRhbC5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L3BvcnRhbC5pY28iIC8+PCEtLXsvaWZ9LS0+Cgk8bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVsyXVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2ZvcnVtJ10pID8gJF9HWydzY2hlbWUnXS4nOi8vJy4kX0dbJ3NldHRpbmcnXVsnZG9tYWluJ11bJ2FwcCddWydmb3J1bSddIDogJF9HW3NpdGV1cmxdLidmb3J1bS5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L2Jicy5pY28iIC8+Cgk8IS0te2lmICRfR1snc2V0dGluZyddWydncm91cHN0YXR1cyddfS0tPjxtZXRhIG5hbWU9Im1zYXBwbGljYXRpb24tdGFzayIgY29udGVudD0ibmFtZT0kX0dbJ3NldHRpbmcnXVsnbmF2cyddWzNdWyduYXZuYW1lJ107YWN0aW9uLXVyaT17ZWNobyAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ2RvbWFpbiddWydhcHAnXVsnZ3JvdXAnXSkgPyAkX0dbJ3NjaGVtZSddLic6Ly8nLiRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2dyb3VwJ10gOiAkX0dbc2l0ZXVybF0uJ2dyb3VwLnBocCd9O2ljb24tdXJpPXskX0dbc2l0ZXVybF19e0lNR0RJUn0vZ3JvdXAuaWNvIiAvPjwhLS17L2lmfS0tPgoJPCEtLXtpZiBoZWxwZXJfYWNjZXNzOjpjaGVja19tb2R1bGUoJ2ZlZWQnKX0tLT48bWV0YSBuYW1lPSJtc2FwcGxpY2F0aW9uLXRhc2siIGNvbnRlbnQ9Im5hbWU9JF9HWydzZXR0aW5nJ11bJ25hdnMnXVs0XVsnbmF2bmFtZSddO2FjdGlvbi11cmk9e2VjaG8gIWVtcHR5KCRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2hvbWUnXSkgPyAkX0dbJ3NjaGVtZSddLic6Ly8nLiRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2hvbWUnXSA6ICRfR1tzaXRldXJsXS4naG9tZS5waHAnfTtpY29uLXVyaT17JF9HW3NpdGV1cmxdfXtJTUdESVJ9L2hvbWUuaWNvIiAvPjwhLS17L2lmfS0tPgoJPCEtLXtpZiAkX0dbJ2Jhc2VzY3JpcHQnXSA9PSAnZm9ydW0nICYmICRfR1snc2V0dGluZyddWydhcmNoaXZlciddfS0tPgoJCTxsaW5rIHJlbD0iYXJjaGl2ZXMiIHRpdGxlPSIkX0dbJ3NldHRpbmcnXVsnYmJuYW1lJ10iIGhyZWY9InskX0dbc2l0ZXVybF19YXJjaGl2ZXIvIiAvPgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICFlbXB0eSgkcnNzaGVhZCl9LS0+JHJzc2hlYWQ8IS0tey9pZn0tLT4KCTwhLS17aWYgd2lkdGhhdXRvKCl9LS0+CgkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBpZD0iY3NzX3dpZHRoYXV0byIgdHlwZT0idGV4dC9jc3MiIGhyZWY9J3skX0dbJ3NldHRpbmcnXVsnY3NzcGF0aCddfXtTVFlMRUlEfV93aWR0aGF1dG8uY3NzP3tWRVJIQVNIfScgLz4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+SFRNTE5PREUuY2xhc3NOYW1lICs9ICcgd2lkdGhhdXRvJzwvc2NyaXB0PgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICRfR1snYmFzZXNjcmlwdCddID09ICdmb3J1bScgfHwgJF9HWydiYXNlc2NyaXB0J10gPT0gJ2dyb3VwJ30tLT4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JF9HW3NldHRpbmddW2pzcGF0aF19Zm9ydW0uanM/e1ZFUkhBU0h9Ij48L3NjcmlwdD4KCTwhLS17ZWxzZWlmICRfR1snYmFzZXNjcmlwdCddID09ICdob21lJ30tLT4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JF9HW3NldHRpbmddW2pzcGF0aF19aG9tZS5qcz97VkVSSEFTSH0iPjwvc2NyaXB0PgoJPCEtLXtlbHNlaWYgJF9HWydiYXNlc2NyaXB0J10gPT0gJ3BvcnRhbCd9LS0+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ieyRfR1tzZXR0aW5nXVtqc3BhdGhdfXBvcnRhbC5qcz97VkVSSEFTSH0iPjwvc2NyaXB0PgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmICRfR1snYmFzZXNjcmlwdCddICE9ICdwb3J0YWwnICYmICRfR0VUWydkaXknXSA9PSAneWVzJyAmJiBjaGVja19kaXlfcGVybSgkdG9waWMpfS0tPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InskX0dbc2V0dGluZ11banNwYXRoXX1wb3J0YWwuanM/e1ZFUkhBU0h9Ij48L3NjcmlwdD4KCTwhLS17L2lmfS0tPgoJPCEtLXtpZiAkX0dFVFsnZGl5J10gPT0gJ3llcycgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBpZD0iZGl5X2NvbW1vbiIgaHJlZj0ieyRfR1snc2V0dGluZyddWydjc3NwYXRoJ119e1NUWUxFSUR9X2Nzc19kaXkuY3NzP3tWRVJIQVNIfSIgLz4KCTwhLS17L2lmfS0tPgo8L2hlYWQ+Cgo8Ym9keSBpZD0ibnZfeyRfR1tiYXNlc2NyaXB0XX0iIGNsYXNzPSJwZ197Q1VSTU9EVUxFfXtpZiAkX0dbJ2Jhc2VzY3JpcHQnXSA9PT0gJ3BvcnRhbCcgJiYgQ1VSTU9EVUxFID09PSAnbGlzdCcgJiYgIWVtcHR5KCRjYXQpfSB7JGNhdFsnYm9keWNzcyddfXsvaWZ9IiBvbmtleWRvd249ImlmKGV2ZW50LmtleUNvZGU9PTI3KSByZXR1cm4gZmFsc2U7Ij4KCTxkaXYgaWQ9ImFwcGVuZF9wYXJlbnQiPjwvZGl2PjxkaXYgaWQ9ImFqYXh3YWl0aWQiPjwvZGl2PgoJPCEtLXtpZiAkX0dFVFsnZGl5J10gPT0gJ3llcycgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQk8IS0te3RlbXBsYXRlIGNvbW1vbi9oZWFkZXJfZGl5fS0tPgoJPCEtLXsvaWZ9LS0+Cgk8IS0te2lmIGNoZWNrX2RpeV9wZXJtKCR0b3BpYyl9LS0+CgkJPCEtLXt0ZW1wbGF0ZSBjb21tb24vaGVhZGVyX2RpeW5hdn0tLT4KCTwhLS17L2lmfS0tPgoJPCEtLXtpZiBDVVJNT0RVTEUgPT0gJ3RvcGljJyAmJiAkdG9waWMgJiYgZW1wdHkoJHRvcGljWyd1c2VoZWFkZXInXSkgJiYgY2hlY2tfZGl5X3Blcm0oJHRvcGljKX0tLT4KCQkkZGl5bmF2Cgk8IS0tey9pZn0tLT4KCTwhLS17aWYgZW1wdHkoJHRvcGljKSB8fCAkdG9waWNbJ3VzZWhlYWRlciddfS0tPgoJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ21vYmlsZSddWydhbGxvd21vYmlsZSddICYmICghJF9HWydzZXR0aW5nJ11bJ2NhY2hlaW5kZXhsaWZlJ10gJiYgISRfR1snc2V0dGluZyddWydjYWNoZXRocmVhZG9uJ10gfHwgJF9HWyd1aWQnXSkgJiYgKCRfR0VUWydkaXknXSAhPSAneWVzJyB8fCAhJF9HRVRbJ2luYWpheCddKSAmJiAoJF9HWydtb2JpbGUnXSAhPSAnJyAmJiAkX0dbJ2Nvb2tpZSddWydtb2JpbGUnXSA9PSAnJyAmJiAkX0dFVFsnbW9iaWxlJ10gIT0gJ25vJyl9LS0+CgkJCTxkaXYgY2xhc3M9InhpMSBibSBibV9jIj4KCQkJICAgIHtsYW5nIHlvdXJfbW9iaWxlX2Jyb3dzZXJ9PGEgaHJlZj0ieyRfR1snc2l0ZXVybCddfWZvcnVtLnBocD9tb2JpbGU9eWVzIj57bGFuZyBnb190b19tb2JpbGV9PC9hPiA8c3BhbiBjbGFzcz0ieGcxIj58PC9zcGFuPiA8YSBocmVmPSIkX0dbJ3NldHRpbmcnXVsnbW9iaWxlJ11bJ25vbW9iaWxldXJsJ10iPntsYW5nIHRvX2JlX2NvbnRpbnVlfTwvYT4KCQkJPC9kaXY+CgkJPCEtLXsvaWZ9LS0+CgkJPCEtLXtpZiAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ3Nob3J0Y3V0J10pICYmICRfR1snbWVtYmVyJ11bY3JlZGl0c10gPj0gJF9HWydzZXR0aW5nJ11bJ3Nob3J0Y3V0J119LS0+CgkJCTxkaXYgaWQ9InNob3J0Y3V0Ij4KCQkJCTxzcGFuPjxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InNob3J0Y3V0Y2xvc2VpZCIgdGl0bGU9IntsYW5nIGNsb3NlfSI+e2xhbmcgY2xvc2V9PC9hPjwvc3Bhbj4KCQkJCXtsYW5nIHNob3J0Y3V0X25vdGljZX0KCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InNob3J0Y3V0dGlwIj57bGFuZyBzaG9ydGN1dF9hZGR9PC9hPgoKCQkJPC9kaXY+CgkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5zZXRUaW1lb3V0KHNldFNob3J0Y3V0LCAyMDAwKTs8L3NjcmlwdD4KCQk8IS0tey9pZn0tLT4KCQk8ZGl2IGlkPSJ0b3B0YiIgY2xhc3M9ImNsIj4KCQkJPCEtLXtob29rL2dsb2JhbF9jcG5hdl90b3B9LS0+CgkJCTxkaXYgY2xhc3M9IndwIj4KCQkJCTxkaXYgY2xhc3M9InoiPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3NldHRpbmcnXVsndG9wbmF2cyddWzBdICRuYXZ9LS0+CgkJCQkJCTwhLS17aWYgaXNfYXJyYXkoJG5hdikgJiYgJG5hdlsnYXZhaWxhYmxlJ10gJiYgKCEkbmF2WydsZXZlbCddIHx8ICgkbmF2WydsZXZlbCddID09IDEgJiYgJF9HWyd1aWQnXSkgfHwgKCRuYXZbJ2xldmVsJ10gPT0gMiAmJiAkX0dbJ2FkbWluaWQnXSA+IDApIHx8ICgkbmF2WydsZXZlbCddID09IDMgJiYgJF9HWydhZG1pbmlkJ10gPT0gMSkpfS0tPiRuYXZbY29kZV08IS0tey9pZn0tLT4KCQkJCQk8IS0tey9sb29wfS0tPgoJCQkJCTwhLS17aG9vay9nbG9iYWxfY3BuYXZfZXh0cmExfS0tPgoJCQkJPC9kaXY+CgkJCQk8ZGl2IGNsYXNzPSJ5Ij4KCQkJCQk8YSBpZD0ic3dpdGNoYmxpbmQiIGhyZWY9ImphdmFzY3JpcHQ6OyIgb25jbGljaz0idG9nZ2xlQmxpbmQodGhpcykiIHRpdGxlPSJ7bGFuZyBzd2l0Y2hfYmxpbmR9IiBjbGFzcz0ic3dpdGNoYmxpbmQiPjwvYT4KCQkJCQk8IS0te2hvb2svZ2xvYmFsX2NwbmF2X2V4dHJhMn0tLT4KCQkJCQk8IS0te2xvb3AgJF9HWydzZXR0aW5nJ11bJ3RvcG5hdnMnXVsxXSAkbmF2fS0tPgoJCQkJCQk8IS0te2lmIGlzX2FycmF5KCRuYXYpICYmICRuYXZbJ2F2YWlsYWJsZSddICYmICghJG5hdlsnbGV2ZWwnXSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAxICYmICRfR1sndWlkJ10pIHx8ICgkbmF2WydsZXZlbCddID09IDIgJiYgJF9HWydhZG1pbmlkJ10gPiAwKSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAzICYmICRfR1snYWRtaW5pZCddID09IDEpKX0tLT4kbmF2W2NvZGVdPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCQk8IS0te2lmIGVtcHR5KCRfR1snZGlzYWJsZWR3aWR0aGF1dG8nXSkgJiYgJF9HWydzZXR0aW5nJ11bJ3N3aXRjaHdpZHRoYXV0byddfS0tPgoJCQkJCQk8YSBocmVmPSJqYXZhc2NyaXB0OjsiIGlkPSJzd2l0Y2h3aWR0aCIgb25jbGljaz0id2lkdGhhdXRvKHRoaXMpIiB0aXRsZT0ie2lmIHdpZHRoYXV0bygpfXtsYW5nIHN3aXRjaF9uYXJyb3d9e2Vsc2V9e2xhbmcgc3dpdGNoX3dpZGV9ey9pZn0iIGNsYXNzPSJzd2l0Y2h3aWR0aCI+PCEtLXtpZiB3aWR0aGF1dG8oKX0tLT57bGFuZyBzd2l0Y2hfbmFycm93fTwhLS17ZWxzZX0tLT57bGFuZyBzd2l0Y2hfd2lkZX08IS0tey9pZn0tLT48L2E+CgkJCQkJPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXtpZiAkX0dbJ3VpZCddICYmICFlbXB0eSgkX0dbJ3N0eWxlJ11bJ2V4dHN0eWxlJ10pfS0tPjxhIGlkPSJzc2xjdCIgaHJlZj0iamF2YXNjcmlwdDo7IiBvbm1vdXNlb3Zlcj0iZGVsYXlTaG93KHRoaXMsIGZ1bmN0aW9uKCkge3Nob3dNZW51KHsnY3RybGlkJzonc3NsY3QnLCdwb3MnOiczNCEnfSl9KTsiPntsYW5nIGNoYW5nZXN0eWxlfTwvYT48IS0tey9pZn0tLT4KCQkJCQk8IS0te2lmIGNoZWNrX2RpeV9wZXJtKCR0b3BpYyl9LS0+CgkJCQkJCSRkaXluYXYKCQkJCQk8IS0tey9pZn0tLT4KCQkJCTwvZGl2PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCgkJPCEtLXtpZiAhSVNfUk9CT1R9LS0+CgkJCTwhLS17aWYgJF9HWyd1aWQnXSAmJiAhJF9HWydzZXR0aW5nJ11bJ2JiY2xvc2VkJ10gJiYgZW1wdHkoJF9HWydtZW1iZXInXVsnZnJlZXplJ10pICYmICRfR1snbWVtYmVyJ11bJ2dyb3VwaWQnXSAhPSA1fS0tPgoJCQk8dWwgaWQ9Im15cHJvbXB0X21lbnUiIGNsYXNzPSJwX3BvcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9c3BhY2UmZG89cG0iIGlkPSJwbV9udGMiIHN0eWxlPSJiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsiPjxlbSBjbGFzcz0icHJvbXB0X25ld3N7aWYgZW1wdHkoJF9HW21lbWJlcl1bbmV3cG1dKX1fMHsvaWZ9Ij48L2VtPntsYW5nIHBtX2NlbnRlcn08L2E+PC9saT4KCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ2ZvbGxvd3N0YXR1cyddfS0tPgoJCQkJCTxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9Zm9sbG93JmRvPWZvbGxvd2VyIj48ZW0gY2xhc3M9InByb21wdF9mb2xsb3dlcntpZiBlbXB0eSgkX0dbbWVtYmVyXVtuZXdwcm9tcHRfbnVtXVtmb2xsb3dlcl0pfV8wey9pZn0iPjwvZW0+PCEtLXtsYW5nIG5vdGljZV9pbnRlcmFjdGl2ZV9mb2xsb3dlcn0tLT57aWYgJF9HW21lbWJlcl1bbmV3cHJvbXB0X251bV1bZm9sbG93ZXJdfSgkX0dbbWVtYmVyXVtuZXdwcm9tcHRfbnVtXVtmb2xsb3dlcl0pey9pZn08L2E+PC9saT4KCQkJCQk8IS0te2lmICRfR1ttZW1iZXJdW25ld3Byb21wdF0gJiYgJF9HW21lbWJlcl1bbmV3cHJvbXB0X251bV1bZm9sbG93XX0tLT4KCQkJCQkJPGxpPjxhIGhyZWY9ImhvbWUucGhwP21vZD1mb2xsb3ciPjxlbSBjbGFzcz0icHJvbXB0X2NvbmNlcm4iPjwvZW0+PCEtLXtsYW5nIG5vdGljZV9pbnRlcmFjdGl2ZV9mb2xsb3d9LS0+KCRfR1ttZW1iZXJdW25ld3Byb21wdF9udW1dW2ZvbGxvd10pPC9hPjwvbGk+CgkJCQkJPCEtLXsvaWZ9LS0+CgkJCQk8IS0tey9pZn0tLT4KCQkJCTwhLS17aWYgJF9HW21lbWJlcl1bbmV3cHJvbXB0XX0tLT4KCQkJCQk8IS0te2xvb3AgJF9HWydtZW1iZXInXVsnY2F0ZWdvcnlfbnVtJ10gJGtleSAkdmFsfS0tPgoJCQkJCQk8bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPW5vdGljZSZ2aWV3PSRrZXkiPjxlbSBjbGFzcz0ibm90aWNlXyRrZXkiPjwvZW0+PCEtLXtlY2hvIGxhbmcoJ3RlbXBsYXRlJywgJ25vdGljZV8nLiRrZXkpfS0tPig8c3BhbiBjbGFzcz0icnEiPiR2YWw8L3NwYW4+KTwvYT48L2xpPgoJCQkJCTwhLS17L2xvb3B9LS0+CgkJCQk8IS0tey9pZn0tLT4KCQkJCTwhLS17aWYgZW1wdHkoJF9HWydjb29raWUnXVsnaWdub3JlX25vdGljZSddKX0tLT4KCQkJCQk8bGkgY2xhc3M9Imlnbm9yZV9ub3RpY2VsaSI+PGEgaHJlZj0iamF2YXNjcmlwdDo7IiBvbmNsaWNrPSJzZXRjb29raWUoJ2lnbm9yZV9ub3RpY2UnLCAxKTtoaWRlTWVudSgnbXlwcm9tcHRfbWVudScpIiB0aXRsZT0ie2xhbmcgdGVtcG9yYXJpbHlfdG9fcmVtaW5kfSI+PGVtIGNsYXNzPSJpZ25vcmVfbm90aWNlIj48L2VtPjwvYT48L2xpPgoJCQkJPCEtLXsvaWZ9LS0+CgkJCTwvdWw+CgkJCTwhLS17L2lmfS0tPgoJCQk8IS0te2lmICRfR1sndWlkJ10gJiYgIWVtcHR5KCRfR1snc3R5bGUnXVsnZXh0c3R5bGUnXSl9LS0+CgkJCQk8ZGl2IGlkPSJzc2xjdF9tZW51IiBjbGFzcz0iY2wgcF9wb3AiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQkJPCEtLXtpZiAhJF9HW3N0eWxlXVtkZWZhdWx0ZXh0c3R5bGVdfS0tPjxzcGFuIGNsYXNzPSJzc2xjdF9idG4iIG9uY2xpY2s9ImV4dHN0eWxlKCcnKSIgdGl0bGU9IntsYW5nIGRlZmF1bHR9Ij48aT48L2k+PC9zcGFuPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3N0eWxlJ11bJ2V4dHN0eWxlJ10gJGV4dHN0eWxlfS0tPgoJCQkJCQk8c3BhbiBjbGFzcz0ic3NsY3RfYnRuIiBvbmNsaWNrPSJleHRzdHlsZSgnJGV4dHN0eWxlWzBdJykiIHRpdGxlPSIkZXh0c3R5bGVbMV0iPjxpIHN0eWxlPSdiYWNrZ3JvdW5kOiRleHRzdHlsZVsyXSc+PC9pPjwvc3Bhbj4KCQkJCQk8IS0tey9sb29wfS0tPgoJCQkJPC9kaXY+CgkJCTwhLS17L2lmfS0tPgoJCQk8IS0te2lmICRfR1sndWlkJ119LS0+CgkJCQk8dWwgaWQ9Im15aXRlbV9tZW51IiBjbGFzcz0icF9wb3AiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCQkJPCEtLXtpZiAkX0dbJ3NldHRpbmcnXVsnZm9ydW1zdGF0dXMnXX0tLT48bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPXRocmVhZCZ2aWV3PW1lIj57bGFuZyBteXBvc3R9PC9hPjwvbGk+PCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXtpZiAkX0dbJ3NldHRpbmcnXVsnZmF2b3JpdGVzdGF0dXMnXX0tLT48bGk+PGEgaHJlZj0iaG9tZS5waHA/bW9kPXNwYWNlJmRvPWZhdm9yaXRlJnZpZXc9bWUiPntsYW5nIGZhdm9yaXRlfTwvYT48L2xpPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ2ZyaWVuZHN0YXR1cyddfS0tPjxsaT48YSBocmVmPSJob21lLnBocD9tb2Q9c3BhY2UmZG89ZnJpZW5kIj57bGFuZyBmcmllbmRzfTwvYT48L2xpPjwhLS17L2lmfS0tPgoJCQkJCTwhLS17aG9vay9nbG9iYWxfbXlpdGVtX2V4dHJhfS0tPgoJCQkJPC91bD4KCQkJPCEtLXsvaWZ9LS0+CgkJCTwhLS17c3VidGVtcGxhdGUgY29tbW9uL2hlYWRlcl9xbWVudX0tLT4KCQk8IS0tey9pZn0tLT4KCgkJPCEtLXthZC9oZWFkZXJiYW5uZXIvd3AgYV9ofS0tPgoJCTxkaXYgaWQ9ImhkIj4KCQkJPGRpdiBjbGFzcz0id3AiPgoJCQkJPGRpdiBjbGFzcz0iaGRjIGNsIj4KCQkJCQk8IS0te2V2YWwgJG1uaWQgPSBnZXRjdXJyZW50bmF2KCk7fS0tPgoJCQkJCTxoMj48IS0te2lmICFpc3NldCgkX0dbJ3NldHRpbmcnXVsnbmF2bG9nb3MnXVskbW5pZF0pfS0tPjxhIGhyZWY9IntpZiAkX0dbJ3NldHRpbmcnXVsnZG9tYWluJ11bJ2FwcCddWydkZWZhdWx0J119eyRfR1snc2NoZW1lJ119Oi8veyRfR1snc2V0dGluZyddWydkb21haW4nXVsnYXBwJ11bJ2RlZmF1bHQnXX0ve2Vsc2V9Li97L2lmfSIgdGl0bGU9IiRfR1snc2V0dGluZyddWydiYm5hbWUnXSI+eyRfR1snc3R5bGUnXVsnYm9hcmRsb2dvJ119PC9hPjwhLS17ZWxzZX0tLT4kX0dbJ3NldHRpbmcnXVsnbmF2bG9nb3MnXVskbW5pZF08IS0tey9pZn0tLT48L2gyPgoJCQkJCTwhLS17dGVtcGxhdGUgY29tbW9uL2hlYWRlcl91c2Vyc3RhdHVzfS0tPgoJCQkJPC9kaXY+CgoJCQkJPGRpdiBpZD0ibnYiPgoJCQkJCTxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgaWQ9InFtZW51IiBvbm1vdXNlb3Zlcj0iZGVsYXlTaG93KHRoaXMsIGZ1bmN0aW9uICgpIHtzaG93TWVudSh7J2N0cmxpZCc6J3FtZW51JywncG9zJzonMzQhJywnY3RybGNsYXNzJzonYScsJ2R1cmF0aW9uJzoyfSk7c2hvd0ZvcnVtbWVudSgkX0dbZmlkXSk7fSkiPntsYW5nIG15X25hdn08L2E+CgkJCQkJPHVsPgoJCQkJCQk8IS0te2xvb3AgJF9HWydzZXR0aW5nJ11bJ25hdnMnXSAkbmF2fS0tPgoJCQkJCQkJPCEtLXtpZiBpc19hcnJheSgkbmF2KSAmJiAkbmF2WydhdmFpbGFibGUnXSAmJiAoISRuYXZbJ2xldmVsJ10gfHwgKCRuYXZbJ2xldmVsJ10gPT0gMSAmJiAkX0dbJ3VpZCddKSB8fCAoJG5hdlsnbGV2ZWwnXSA9PSAyICYmICRfR1snYWRtaW5pZCddID4gMCkgfHwgKCRuYXZbJ2xldmVsJ10gPT0gMyAmJiAkX0dbJ2FkbWluaWQnXSA9PSAxKSl9LS0+PGxpIHtpZiAkbW5pZCA9PSAkbmF2W25hdmlkXSB8fCBzdWJzdHIoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sIDEpID09IHN0cl9yZXBsYWNlKCcuLycsICcnLCAkbmF2W2ZpbGVuYW1lXSl9Y2xhc3M9ImEiIHsvaWZ9JG5hdltuYXZdPjwvbGk+PCEtLXsvaWZ9LS0+CgkJCQkJCTwhLS17L2xvb3B9LS0+CgkJCQkJPC91bD4KCQkJCQk8IS0te2hvb2svZ2xvYmFsX25hdl9leHRyYX0tLT4KCQkJCTwvZGl2PgoJCQkJPCEtLXtpZiAhZW1wdHkoJF9HWydzZXR0aW5nJ11bJ3BsdWdpbnMnXVsnanNtZW51J10pfS0tPgoJCQkJCTx1bCBjbGFzcz0icF9wb3AgaF9wb3AiIGlkPSJwbHVnaW5fbWVudSIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgoJCQkJCTwhLS17bG9vcCAkX0dbJ3NldHRpbmcnXVsncGx1Z2lucyddWydqc21lbnUnXSAkbW9kdWxlfS0tPgoJCQkJCQkgPCEtLXtpZiBpbl9hcnJheSgkbW9kdWxlWydhZG1pbmlkJ10sIGFycmF5KDAsIC0xKSkgfHwgKCRtb2R1bGVbJ2FkbWluaWQnXSAmJiAkX0dbJ2FkbWluaWQnXSA+IDAgJiYgJG1vZHVsZVsnYWRtaW5pZCddID49ICRfR1snYWRtaW5pZCddKX0tLT4KCQkJCQkJIDxsaT4kbW9kdWxlW3VybF08L2xpPgoJCQkJCQkgPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCQk8L3VsPgoJCQkJPCEtLXsvaWZ9LS0+CgkJCQkkX0dbc2V0dGluZ11bbWVudW5hdnNdCgkJCQk8ZGl2IGlkPSJtdSIgY2xhc3M9ImNsIj4KCQkJCTwhLS17aWYgJF9HWydzZXR0aW5nJ11bJ3N1Ym5hdnMnXX0tLT4KCQkJCQk8IS0te2xvb3AgJF9HW3NldHRpbmddW3N1Ym5hdnNdICRuYXZpZCAkc3VibmF2fS0tPgoJCQkJCQk8IS0te2lmICRfR1snc2V0dGluZyddWyduYXZzdWJob3ZlciddIHx8ICRtbmlkID09ICRuYXZpZH0tLT4KCQkJCQkJPHVsIGNsYXNzPSJjbCB7aWYgJG1uaWQgPT0gJG5hdmlkfWN1cnJlbnR7L2lmfSIgaWQ9InNuYXZfJG5hdmlkIntpZiAkbW5pZCAhPSAkbmF2aWR9IHN0eWxlPSJkaXNwbGF5Om5vbmUiey9pZn0+CgkJCQkJCSRzdWJuYXYKCQkJCQkJPC91bD4KCQkJCQkJPCEtLXsvaWZ9LS0+CgkJCQkJPCEtLXsvbG9vcH0tLT4KCQkJCTwhLS17L2lmfS0tPgoJCQkJPC9kaXY+CgkJCQk8IS0te2FkL3N1Ym5hdmJhbm5lci9hX211fS0tPgoJCQkJPCEtLXtzdWJ0ZW1wbGF0ZSBjb21tb24vcHVic2VhcmNoZm9ybX0tLT4KCQkJPC9kaXY+CgkJPC9kaXY+CgoJCTwhLS17aG9vay9nbG9iYWxfaGVhZGVyfS0tPgoJPCEtLXsvaWZ9LS0+CgoJPGRpdiBpZD0id3AiIGNsYXNzPSJ3cCI+Cg==
qidao123.com ToB IT社区-企服评测·应用市场»论坛 › 容器及微服务 › 容器及微服务 › redis 工具类
返回列表 发新帖

redis 工具类

[复制链接]
发表于 2023-4-13 19:42:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
redis 工具类
  1. /**
  2. * Redis 工具类
  3. */
  4. @Component
  5. public class RedisUtil {
  6.     @Resource
  7.     private RedisTemplate<String, Object> redisTemplate;
  8.     public RedisUtil(RedisTemplate<String, Object> redisTemplate) {
  9.         this.redisTemplate = redisTemplate;
  10.     }
  11.     /**
  12.      * 指定缓存失效时间
  13.      *
  14.      * @param key  键
  15.      * @param time 时间(秒)
  16.      * @return
  17.      */
  18.     public boolean expire(String key, long time) {
  19.         try {
  20.             if (time > 0) {
  21.                 redisTemplate.expire(key, time, TimeUnit.SECONDS);
  22.             }
  23.             return true;
  24.         } catch (Exception e) {
  25.             e.printStackTrace();
  26.             return false;
  27.         }
  28.     }
  29.     /**
  30.      * 根据key 获取过期时间
  31.      *
  32.      * @param key 键 不能为null
  33.      * @return 时间(秒) 返回0代表为永久有效
  34.      */
  35.     public long getExpire(String key) {
  36.         return redisTemplate.getExpire(key, TimeUnit.SECONDS);
  37.     }
  38.     /**
  39.      * 判断key是否存在
  40.      *
  41.      * @param key 键
  42.      * @return true 存在 false不存在
  43.      */
  44.     public boolean hasKey(String key) {
  45.         try {
  46.             return redisTemplate.hasKey(key);
  47.         } catch (Exception e) {
  48.             e.printStackTrace();
  49.             return false;
  50.         }
  51.     }
  52.     /**
  53.      * 删除缓存
  54.      *
  55.      * @param key 可以传一个值 或多个
  56.      */
  57.     @SuppressWarnings("unchecked")
  58.     public void del(String... key) {
  59.         if (key != null && key.length > 0) {
  60.             if (key.length == 1) {
  61.                 redisTemplate.delete(key[0]);
  62.             } else {
  63.                 redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(key));
  64.             }
  65.         }
  66.     }
  67.     //============================String=============================
  68.     /**
  69.      * 普通缓存获取
  70.      *
  71.      * @param key 键
  72.      * @return 值
  73.      */
  74.     public Object get(String key) {
  75.         return key == null ? null : redisTemplate.opsForValue().get(key);
  76.     }
  77.     /**
  78.      * 普通缓存放入
  79.      *
  80.      * @param key   键
  81.      * @param value 值
  82.      * @return true成功 false失败
  83.      */
  84.     public boolean set(String key, Object value) {
  85.         try {
  86.             redisTemplate.opsForValue().set(key, value);
  87.             return true;
  88.         } catch (Exception e) {
  89.             e.printStackTrace();
  90.             return false;
  91.         }
  92.     }
  93.     /**
  94.      * 普通缓存放入并设置时间
  95.      *
  96.      * @param key   键
  97.      * @param value 值
  98.      * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
  99.      * @return true成功 false 失败
  100.      */
  101.     public boolean set(String key, Object value, long time) {
  102.         try {
  103.             if (time > 0) {
  104.                 redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
  105.             } else {
  106.                 set(key, value);
  107.             }
  108.             return true;
  109.         } catch (Exception e) {
  110.             e.printStackTrace();
  111.             return false;
  112.         }
  113.     }
  114.     /**
  115.      * 分布式锁
  116.      * @param key               锁住的key
  117.      * @param lockExpireMils    锁住的时长。如果超时未解锁,视为加锁线程死亡,其他线程可夺取锁
  118.      * @return
  119.      */
  120.     public boolean setNx(String key, Long lockExpireMils) {
  121.         return (boolean) redisTemplate.execute((RedisCallback) connection -> {
  122.             //获取锁
  123.             return connection.setNX(key.getBytes(), String.valueOf(System.currentTimeMillis() + lockExpireMils + 1).getBytes());
  124.         });
  125.     }
  126.     /**
  127.      * 递增
  128.      *
  129.      * @param key   键
  130.      * @param delta 要增加几(大于0)
  131.      * @return
  132.      */
  133.     public long incr(String key, long delta) {
  134.         if (delta < 0) {
  135.             throw new RuntimeException("递增因子必须大于0");
  136.         }
  137.         return redisTemplate.opsForValue().increment(key, delta);
  138.     }
  139.     /**
  140.      * 递减
  141.      *
  142.      * @param key   键
  143.      * @param delta 要减少几(小于0)
  144.      * @return
  145.      */
  146.     public long decr(String key, long delta) {
  147.         if (delta < 0) {
  148.             throw new RuntimeException("递减因子必须大于0");
  149.         }
  150.         return redisTemplate.opsForValue().increment(key, -delta);
  151.     }
  152.     //================================Map=================================
  153.     /**
  154.      * HashGet
  155.      *
  156.      * @param key  键 不能为null
  157.      * @param item 项 不能为null
  158.      * @return 值
  159.      */
  160.     public Object hget(String key, String item) {
  161.         return redisTemplate.opsForHash().get(key, item);
  162.     }
  163.     /**
  164.      * 获取hashKey对应的所有键值
  165.      *
  166.      * @param key 键
  167.      * @return 对应的多个键值
  168.      */
  169.     public Map<Object, Object> hmget(String key) {
  170.         return redisTemplate.opsForHash().entries(key);
  171.     }
  172.     /**
  173.      * HashSet
  174.      *
  175.      * @param key 键
  176.      * @param map 对应多个键值
  177.      * @return true 成功 false 失败
  178.      */
  179.     public boolean hmset(String key, Map<String, Object> map) {
  180.         try {
  181.             redisTemplate.opsForHash().putAll(key, map);
  182.             return true;
  183.         } catch (Exception e) {
  184.             e.printStackTrace();
  185.             return false;
  186.         }
  187.     }
  188.     /**
  189.      * HashSet 并设置时间
  190.      *
  191.      * @param key  键
  192.      * @param map  对应多个键值
  193.      * @param time 时间(秒)
  194.      * @return true成功 false失败
  195.      */
  196.     public boolean hmset(String key, Map<String, Object> map, long time) {
  197.         try {
  198.             redisTemplate.opsForHash().putAll(key, map);
  199.             if (time > 0) {
  200.                 expire(key, time);
  201.             }
  202.             return true;
  203.         } catch (Exception e) {
  204.             e.printStackTrace();
  205.             return false;
  206.         }
  207.     }
  208.     /**
  209.      * 向一张hash表中放入数据,如果不存在将创建
  210.      *
  211.      * @param key   键
  212.      * @param item  项
  213.      * @param value 值
  214.      * @return true 成功 false失败
  215.      */
  216.     public boolean hset(String key, String item, Object value) {
  217.         try {
  218.             redisTemplate.opsForHash().put(key, item, value);
  219.             return true;
  220.         } catch (Exception e) {
  221.             e.printStackTrace();
  222.             return false;
  223.         }
  224.     }
  225.     /**
  226.      * 向一张hash表中放入数据,如果不存在将创建
  227.      *
  228.      * @param key   键
  229.      * @param item  项
  230.      * @param value 值
  231.      * @param time  时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间
  232.      * @return true 成功 false失败
  233.      */
  234.     public boolean hset(String key, String item, Object value, long time) {
  235.         try {
  236.             redisTemplate.opsForHash().put(key, item, value);
  237.             if (time > 0) {
  238.                 expire(key, time);
  239.             }
  240.             return true;
  241.         } catch (Exception e) {
  242.             e.printStackTrace();
  243.             return false;
  244.         }
  245.     }
  246.     /**
  247.      * 删除hash表中的值
  248.      *
  249.      * @param key  键 不能为null
  250.      * @param item 项 可以使多个 不能为null
  251.      */
  252.     public void hdel(String key, Object... item) {
  253.         redisTemplate.opsForHash().delete(key, item);
  254.     }
  255.     /**
  256.      * 判断hash表中是否有该项的值
  257.      *
  258.      * @param key  键 不能为null
  259.      * @param item 项 不能为null
  260.      * @return true 存在 false不存在
  261.      */
  262.     public boolean hHasKey(String key, String item) {
  263.         return redisTemplate.opsForHash().hasKey(key, item);
  264.     }
  265.     /**
  266.      * hash递增 如果不存在,就会创建一个 并把新增后的值返回
  267.      *
  268.      * @param key  键
  269.      * @param item 项
  270.      * @param by   要增加几(大于0)
  271.      * @return
  272.      */
  273.     public double hincr(String key, String item, double by) {
  274.         return redisTemplate.opsForHash().increment(key, item, by);
  275.     }
  276.     /**
  277.      * hash递减
  278.      *
  279.      * @param key  键
  280.      * @param item 项
  281.      * @param by   要减少记(小于0)
  282.      * @return
  283.      */
  284.     public double hdecr(String key, String item, double by) {
  285.         return redisTemplate.opsForHash().increment(key, item, -by);
  286.     }
  287.     //============================set=============================
  288.     /**
  289.      * 根据key获取Set中的所有值
  290.      *
  291.      * @param key 键
  292.      * @return
  293.      */
  294.     public Set<Object> sGet(String key) {
  295.         try {
  296.             return redisTemplate.opsForSet().members(key);
  297.         } catch (Exception e) {
  298.             e.printStackTrace();
  299.             return null;
  300.         }
  301.     }
  302.     /**
  303.      * 根据value从一个set中查询,是否存在
  304.      *
  305.      * @param key   键
  306.      * @param value 值
  307.      * @return true 存在 false不存在
  308.      */
  309.     public boolean sHasKey(String key, Object value) {
  310.         try {
  311.             return redisTemplate.opsForSet().isMember(key, value);
  312.         } catch (Exception e) {
  313.             e.printStackTrace();
  314.             return false;
  315.         }
  316.     }
  317.     /**
  318.      * 将数据放入set缓存
  319.      *
  320.      * @param key    键
  321.      * @param values 值 可以是多个
  322.      * @return 成功个数
  323.      */
  324.     public long sSet(String key, Object... values) {
  325.         try {
  326.             return redisTemplate.opsForSet().add(key, values);
  327.         } catch (Exception e) {
  328.             e.printStackTrace();
  329.             return 0;
  330.         }
  331.     }
  332.     /**
  333.      * 将set数据放入缓存
  334.      *
  335.      * @param key    键
  336.      * @param time   时间(秒)
  337.      * @param values 值 可以是多个
  338.      * @return 成功个数
  339.      */
  340.     public long sSetAndTime(String key, long time, Object... values) {
  341.         try {
  342.             Long count = redisTemplate.opsForSet().add(key, values);
  343.             if (time > 0) {
  344.                 expire(key, time);
  345.             }
  346.             return count;
  347.         } catch (Exception e) {
  348.             e.printStackTrace();
  349.             return 0;
  350.         }
  351.     }
  352.     /**
  353.      * 获取set缓存的长度
  354.      *
  355.      * @param key 键
  356.      * @return
  357.      */
  358.     public long sGetSetSize(String key) {
  359.         try {
  360.             return redisTemplate.opsForSet().size(key);
  361.         } catch (Exception e) {
  362.             e.printStackTrace();
  363.             return 0;
  364.         }
  365.     }
  366.     /**
  367.      * 移除值为value的
  368.      *
  369.      * @param key    键
  370.      * @param values 值 可以是多个
  371.      * @return 移除的个数
  372.      */
  373.     public long setRemove(String key, Object... values) {
  374.         try {
  375.             Long count = redisTemplate.opsForSet().remove(key, values);
  376.             return count;
  377.         } catch (Exception e) {
  378.             e.printStackTrace();
  379.             return 0;
  380.         }
  381.     }
  382.     //===============================list=================================
  383.     /**
  384.      * 获取list缓存的内容
  385.      *
  386.      * @param key   键
  387.      * @param start 开始
  388.      * @param end   结束  0 到 -1代表所有值
  389.      * @return
  390.      */
  391.     public List<Object> lGet(String key, long start, long end) {
  392.         try {
  393.             return redisTemplate.opsForList().range(key, start, end);
  394.         } catch (Exception e) {
  395.             e.printStackTrace();
  396.             return null;
  397.         }
  398.     }
  399.     /**
  400.      * 获取list缓存的长度
  401.      *
  402.      * @param key 键
  403.      * @return
  404.      */
  405.     public long lGetListSize(String key) {
  406.         try {
  407.             return redisTemplate.opsForList().size(key);
  408.         } catch (Exception e) {
  409.             e.printStackTrace();
  410.             return 0;
  411.         }
  412.     }
  413.     /**
  414.      * 通过索引 获取list中的值
  415.      *
  416.      * @param key   键
  417.      * @param index 索引  index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
  418.      * @return
  419.      */
  420.     public Object lGetIndex(String key, long index) {
  421.         try {
  422.             return redisTemplate.opsForList().index(key, index);
  423.         } catch (Exception e) {
  424.             e.printStackTrace();
  425.             return null;
  426.         }
  427.     }
  428.     /**
  429.      * 将list放入缓存
  430.      *
  431.      * @param key   键
  432.      * @param value 值
  433.      * @return
  434.      */
  435.     public boolean lSet(String key, Object value) {
  436.         try {
  437.             redisTemplate.opsForList().rightPush(key, value);
  438.             return true;
  439.         } catch (Exception e) {
  440.             e.printStackTrace();
  441.             return false;
  442.         }
  443.     }
  444.     /**
  445.      * 将list放入缓存
  446.      *
  447.      * @param key   键
  448.      * @param value 值
  449.      * @param time  时间(秒)
  450.      * @return
  451.      */
  452.     public boolean lSet(String key, Object value, long time) {
  453.         try {
  454.             redisTemplate.opsForList().rightPush(key, value);
  455.             if (time > 0) {
  456.                 expire(key, time);
  457.             }
  458.             return true;
  459.         } catch (Exception e) {
  460.             e.printStackTrace();
  461.             return false;
  462.         }
  463.     }
  464.     /**
  465.      * 将list放入缓存
  466.      *
  467.      * @param key   键
  468.      * @param value 值
  469.      * @return
  470.      */
  471.     public boolean lSet(String key, List<Object> value) {
  472.         try {
  473.             redisTemplate.opsForList().rightPushAll(key, value);
  474.             return true;
  475.         } catch (Exception e) {
  476.             e.printStackTrace();
  477.             return false;
  478.         }
  479.     }
  480.     /**
  481.      * 将list放入缓存
  482.      *
  483.      * @param key   键
  484.      * @param value 值
  485.      * @param time  时间(秒)
  486.      * @return
  487.      */
  488.     public boolean lSet(String key, List<Object> value, long time) {
  489.         try {
  490.             redisTemplate.opsForList().rightPushAll(key, value);
  491.             if (time > 0) {
  492.                 expire(key, time);
  493.             }
  494.             return true;
  495.         } catch (Exception e) {
  496.             e.printStackTrace();
  497.             return false;
  498.         }
  499.     }
  500.     /**
  501.      * 根据索引修改list中的某条数据
  502.      *
  503.      * @param key   键
  504.      * @param index 索引
  505.      * @param value 值
  506.      * @return
  507.      */
  508.     public boolean lUpdateIndex(String key, long index, Object value) {
  509.         try {
  510.             redisTemplate.opsForList().set(key, index, value);
  511.             return true;
  512.         } catch (Exception e) {
  513.             e.printStackTrace();
  514.             return false;
  515.         }
  516.     }
  517.     /**
  518.      * 移除N个值为value
  519.      *
  520.      * @param key   键
  521.      * @param count 移除多少个
  522.      * @param value 值
  523.      * @return 移除的个数
  524.      */
  525.     public long lRemove(String key, long count, Object value) {
  526.         try {
  527.             Long remove = redisTemplate.opsForList().remove(key, count, value);
  528.             return remove;
  529.         } catch (Exception e) {
  530.             e.printStackTrace();
  531.             return 0;
  532.         }
  533.     }
  534.     /**
  535.      * 模糊查询获取key值
  536.      *
  537.      * @param pattern
  538.      * @return
  539.      */
  540.     public Set keys(String pattern) {
  541.         return redisTemplate.keys(pattern);
  542.     }
  543.     /**
  544.      * 使用Redis的消息队列
  545.      *
  546.      * @param channel
  547.      * @param message 消息内容
  548.      */
  549.     public void convertAndSend(String channel, Object message) {
  550.         redisTemplate.convertAndSend(channel, message);
  551.     }
  552.     //=========BoundListOperations 用法 start============
  553.     /**
  554.      * 将数据添加到Redis的list中(从右边添加)
  555.      *
  556.      * @param listKey
  557.      * @param timeout 有效时间
  558.      * @param unit    时间类型
  559.      * @param values  待添加的数据
  560.      */
  561.     public void addToListRight(String listKey, long timeout, TimeUnit unit, Object... values) {
  562.         //绑定操作
  563.         BoundListOperations<String, Object> boundValueOperations = redisTemplate.boundListOps(listKey);
  564.         //插入数据
  565.         boundValueOperations.rightPushAll(values);
  566.         //设置过期时间
  567.         boundValueOperations.expire(timeout, unit);
  568.     }
  569.     /**
  570.      * 根据起始结束序号遍历Redis中的list
  571.      *
  572.      * @param listKey
  573.      * @param start   起始序号
  574.      * @param end     结束序号
  575.      * @return
  576.      */
  577.     public List<Object> rangeList(String listKey, long start, long end) {
  578.         //绑定操作
  579.         BoundListOperations<String, Object> boundValueOperations = redisTemplate.boundListOps(listKey);
  580.         //查询数据
  581.         return boundValueOperations.range(start, end);
  582.     }
  583.     /**
  584.      * 弹出右边的值 --- 并且移除这个值
  585.      *
  586.      * @param listKey
  587.      */
  588.     public Object rightPop(String listKey) {
  589.         //绑定操作
  590.         BoundListOperations<String, Object> boundValueOperations = redisTemplate.boundListOps(listKey);
  591.         return boundValueOperations.rightPop();
  592.     }
  593.     //=========BoundListOperations 用法 End============
  594. }
复制代码
回复

使用道具 举报

返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-10-16 23:48 , Processed in 0.021232 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表