说明:
用redis计数器存取用户的操作次数,最多3次,但是并发会超过3次,下面的代码对吗?
BoundValueOperations<String, String> operations = redisTemplate.boundValueOps("key1");
String key1 = operations.get();
if (StringUtils.isEmpty(key1)) {
service.do();//这里是业务逻辑操作成功之后,计数器加1
operations.increment(1);
} else {
if (Integer.parseInt(key1) < 2) {
service.do();//这里是业务逻辑操作成功之后,计数器加1
operations.increment(1);
}
}
Untuk perniagaan mengira seperti ini, anda perlu mengira dahulu dan kemudian baru berniaga. Jika perniagaan telah selesai dan kaunter didapati lebih besar daripada nilai had, anda akan terkejut.
Pelan saya ialah:
Disebabkan ketidakkonsistenan data yang disebabkan oleh konkurensi, anda boleh mempertimbangkan untuk menggunakan perintah
INCR
Redis untuk menambahnya sebanyak 1 dan mendapatkan nilai terkini (ini adalah operasi sekali sahaja, jadi ia tidak akan menyebabkan tidak konsisten):Jika lebih daripada 3, bermakna ia telah melebihi dan sudah tamat; Jika
Terdapat kelemahan tertentu dalam melaksanakan fungsi di atas melalui klien Java Dalam kes konkurensi tinggi, data mungkin tidak konsisten Adalah disyorkan untuk menggunakan skrip lua untuk merangkumkan keseluruhan logik untuk memastikan keatoman operasi. Anda boleh menggunakan SCRIPT LOAD ke Skrip dicache ke pelayan dan dilaksanakan melalui nilai semakan sha1 + parameter (Kunci, ARG) untuk mengurangkan penghantaran rangkaian
Beri anda contoh:
1 Keperluan fungsian: Jika kunci tidak wujud, tetapkannya dan kembalikan palsu, dan tetapkan tamat masa dan kiraan = 1 apabila tamat masa telah dicapai atau kiraan yang ditentukan tercapai, return false dan mulakan semula Tetapkan tamat masa dan kiraan=1; jika tamat masa tidak tercapai & kiraan yang ditentukan tidak tercapai, kembalikan benar dan kiraan incr
Skrip redis.lua adalah seperti berikut:
Kod java adalah seperti berikut: