spring data redisプロジェクト使用問題のまとめ
1463 ワード
spring data redisを使うのはもう長い間になりました.プロジェクトの使用過程でよくあるミスを犯しました.今まとめてみます.自分が後で同じミスをしないようにします.
1.expireAt()設定タイムアウト時間エラー
以前はプロジェクトで主に使われていたexpire()という設定keyのタイムアウト時間の方法は、最近のプロジェクトでは、あるkeyがある時点で期限が切れています.たとえば、日本のランキングでは、翌日のランキングでは意味がなく、当日のkeyが翌日の0時で期限が切れるように設定されています.
1.1問題の説明
expireAtを使っています.有効期限が過ぎたことに気づきました.有効期限は特に大きい時間で、正しいとは思いません.コマンドラインで試してみました.問題がないことが分かりました.spring data redisフレームかもしれません.コードを見て、redis clusterクラスタモードを使用するべきです.BinaryJedisClauster.javaのpexpireAtではなんとpexpire()の方法を使っています.pexpireAt()を使うべきです.
reverseRange(long start,long end)を使用する過程で、プロジェクトの中でmysqlの改ページ処理として、リターンデータの大きさを直接endに与えて、リターンデータはずっと問題があります.
方法でデータを返します.startとend位置のデータを含みます.一般的に2番目のパラメータはpageStart+pageSize-1です.
3.keyが存在するかどうかを確認する
Hash、Zsetなどのデータタイプを使用する場合は、先にキャッシュのkeyが存在するかどうかを確認しないでそのまま使用することで、プログラムが異常になり、空のポインタが表示されます.
1.expireAt()設定タイムアウト時間エラー
以前はプロジェクトで主に使われていたexpire()という設定keyのタイムアウト時間の方法は、最近のプロジェクトでは、あるkeyがある時点で期限が切れています.たとえば、日本のランキングでは、翌日のランキングでは意味がなく、当日のkeyが翌日の0時で期限が切れるように設定されています.
1.1問題の説明
expireAtを使っています.有効期限が過ぎたことに気づきました.有効期限は特に大きい時間で、正しいとは思いません.コマンドラインで試してみました.問題がないことが分かりました.spring data redisフレームかもしれません.コードを見て、redis clusterクラスタモードを使用するべきです.BinaryJedisClauster.javaのpexpireAtではなんとpexpire()の方法を使っています.pexpireAt()を使うべきです.
@Override
public Long pexpireAt(final byte[] key, final long millisecondsTimestamp) {
return new JedisClusterCommand(connectionHandler, maxAttempts) {
@Override
public Long execute(Jedis connection) {
return connection.pexpire(key, millisecondsTimestamp);
}
}.runBinary(key);
}
1.2解決方法
public void expireAt(String key, Date deadLine){
final byte[] rawKey = rawKey(key);
redisTemplate.execute(connection -> connection.expireAt(rawKey, deadLine.getTime() / 1000), true);
}
2.zsetのreverseRange問題reverseRange(long start,long end)を使用する過程で、プロジェクトの中でmysqlの改ページ処理として、リターンデータの大きさを直接endに与えて、リターンデータはずっと問題があります.
方法でデータを返します.startとend位置のデータを含みます.一般的に2番目のパラメータはpageStart+pageSize-1です.
3.keyが存在するかどうかを確認する
Hash、Zsetなどのデータタイプを使用する場合は、先にキャッシュのkeyが存在するかどうかを確認しないでそのまま使用することで、プログラムが異常になり、空のポインタが表示されます.