Long expireTime=redisTemplate.boundValueOps(key).getExpire();
int countNow = Integer.valueOf(redisTemplate.boundValueOps(key).get());
获取超时时间expiretime 为0
但是我他妈的居然能拿到key对应的值,是不是redis存磁盘了,还是redis删除数据的机制原因?测试的能行,生产环境就不行了!!
迷茫2017-04-17 17:36:12
Redis サーバー、クラスター設定、マスター/スレーブ、スレーブにデータがありません。理由は不明です。データをメイン Redis サーバーにドリフトするには、仮想サーバーを使用します。設定されたキーはメイン サーバーでは表示されませんが、スレーブ Redis サービスにはデータがありません。重要なのは、メソッドを通じて有効期限をゼロにすることができますが、キーに対応する値を取得できることです。他の Redis サーバーがあるのに、データはどこに保存されているのですか? 有効期限値がゼロなのはなぜですか? それでもキーに対応する値を取得できますか? ? ?
最後に、スレーブ Redis をシャットダウンし、マスター サーバーを再起動し、IP をマスター Redis サーバーに指定すると、問題は解決しました。
理由は不明です。
データはどこへ行ったのでしょうか?
補足:
有効期限のある Key-Value で不安定なキーを設定する場合は注意してください。キーを削除するためにexpiretimeを0に設定する方法を使用した場合、redisはキーをすぐに削除しない可能性があります。
Spring Data Redis の hasKey メソッドを使用してキーが存在するかどうかを確認すると、たとえ有効期限が 0 であってもキーが削除されていない可能性があるため、罠にはまってしまいます。
Redis は遅延有効期限を使用します。 : キーにアクセスするときにキーの有効期限が切れているかどうかを判断し、有効期限が切れている場合は有効期限処理を実行します。次に、揮発性キーが毎秒サンプリングされてテストされ、期限切れのキーがある場合は、期限切れのキーがすべて処理されます。
このパトロール速度がどのような設定に関連しているのか、またそれがどれほど効率的であるのかはわかりません。したがって、不安定な鍵を設定して hasKey を使用して判定する場合は、鍵の有効期限を取得してから自分で判定する必要があることに注意してください。
「Redis の設計と実装」の初版には原理の説明が記載されています。興味がある場合は、検索してください。