redisストレージ大量hashメモリ占有最適化
8877 ワード
仕事の中で何気なくオンラインredisメモリの占有量が高すぎることを発見して、毎日30 Wのhset操作が足りないでしょう、200 Mredisメモリ近くを占有して、そこでテストコードを編纂して、簡単にテストして、やはり最適化することができる地方があることを発見します
Spring-data-redisは、jedisを使用する開発者にとって非常に便利なserializerポリシーを提供しています.sdrは4種類の内蔵serializerを提供しています. J d k SerializationRedisSerializer:JDKのシーケンス化手段(serializableインタフェース、ObjectInputStrean、ObjectOutputStream)を用いて、データをバイトストリームで 記憶する StringRedisSerializer:文字列符号化、データstring格納 JacksonJsonRedisSerializer:jsonフォーマットストレージ OxmSerializer:xml形式ストレージ ここで、JdkSerializationRedisSerializerおよびStringRedisSerializerは最も基本的なシーケンス化ポリシーであり、「JacksonJsonRedisSerializer」および「OxmSerializer」はstirngストレージに基づいているため、それらは比較的「高度」なシーケンス化(最終的にはstring解析およびjavaオブジェクトの構築)である.
RedisTemplateでは4種類のserializerを宣言する必要があります.デフォルトは「J d k SerializationRedisSerializer」です.
1)keySerializer:通常のK-V操作に対してkeyがとるシーケンス化ポリシー2)valueSerializer:valueがとるシーケンス化ポリシー3)hashKeySerializer:hashデータ構造においてhash-keyのシーケンス化ポリシー4)hashValueSerializer:hash-valueのシーケンス化ポリシー
int,string,objectのシーケンス化テストにより,デフォルトのJ d k SerializationRedisSerializerシーケンス化後のバイトストリーム占有空間が最大であり,GenericJackson 2 JsonRedisSerializerに次いでStringRedisSerializerが最小であることが分かったが,StringRedisSerializerはstringのシーケンス化のみ可能である
参照先:https://www.cnblogs.com/yueguanguanyun/p/8283127.html
テストにより、数字は文字列を格納するよりもメモリの消費量を節約し、数字をできるだけ使うことができます.
JAvaはredisの最下位実装を操作し、hashをredisに保存するには2つの方法があります.
Long hset(String key, String field, String value);
Long hset(byte[] key, byte[] field, byte[] value);
それぞれ文字列と文字ストリームに対応し、spring data redisパッケージのRedisTemplateは、文字ストリームの実装のみを提供しているが、下位Jedisの実装を呼び出すことで、30 Wの同じデータを挿入し、テスト結果は以下の通りであることが分かった.
消費メモリは155.16 Mから49.88 Mに減少し、節約メモリは多い.
データを保存する際にJedisCommandsインタフェースを実現するhsetメソッドをできるだけ呼び出し,シーケンス化操作を行わない.
1、SPRING-DATA-REDIS:SERIALIZER例
Spring-data-redisは、jedisを使用する開発者にとって非常に便利なserializerポリシーを提供しています.sdrは4種類の内蔵serializerを提供しています.
RedisTemplateでは4種類のserializerを宣言する必要があります.デフォルトは「J d k SerializationRedisSerializer」です.
1)keySerializer:通常のK-V操作に対してkeyがとるシーケンス化ポリシー2)valueSerializer:valueがとるシーケンス化ポリシー3)hashKeySerializer:hashデータ構造においてhash-keyのシーケンス化ポリシー4)hashValueSerializer:hash-valueのシーケンス化ポリシー
int,string,objectのシーケンス化テストにより,デフォルトのJ d k SerializationRedisSerializerシーケンス化後のバイトストリーム占有空間が最大であり,GenericJackson 2 JsonRedisSerializerに次いでStringRedisSerializerが最小であることが分かったが,StringRedisSerializerはstringのシーケンス化のみ可能である
JdkSerializationRedisSerializer
int >>>>>>>>>> 81
string >>>>>>>>>> 10
object >>>>>>>>>> 113
GenericJackson2JsonRedisSerializer
int >>>>>>>>>> 3
string >>>>>>>>>> 5
object >>>>>>>>>> 27
StringRedisSerializer
string >>>>>>>>>> 3
参照先:https://www.cnblogs.com/yueguanguanyun/p/8283127.html
2、HASHはどんなデータを保存してメモリを節約します
テストにより、数字は文字列を格納するよりもメモリの消費量を節約し、数字をできるだけ使うことができます.
2.1.Jedisのhsetリロード方法
JAvaはredisの最下位実装を操作し、hashをredisに保存するには2つの方法があります.
2.1.1、JedisCommandsインタフェースの下の
2.1.2、BinaryJedisCommandsインタフェースの下の
2.2、テスト
それぞれ文字列と文字ストリームに対応し、spring data redisパッケージのRedisTemplateは、文字ストリームの実装のみを提供しているが、下位Jedisの実装を呼び出すことで、30 Wの同じデータを挿入し、テスト結果は以下の通りであることが分かった.
HASH subKey code = 123 , BinaryJedisCommands
>>>>>>>>>>>>>>>>begin
# Memory
used_memory:713224
used_memory_human:696.51K
used_memory_rss:655416
used_memory_peak:72374824
used_memory_peak_human:69.02M
used_memory_lua:36864
mem_fragmentation_ratio:0.92
mem_allocator:jemalloc-3.6.0
>>>>>>>>>>>>>>>>after
# Memory
used_memory:162700776
used_memory_human:155.16M
used_memory_rss:162599336
used_memory_peak:162700776
used_memory_peak_human:155.16M
used_memory_lua:36864
mem_fragmentation_ratio:1.00
mem_allocator:jemalloc-3.6.0
: time = 25609 ms
HASH subKey "123", BinaryJedisCommands
>>>>>>>>>>>>>>>>begin
# Memory
used_memory:713224
used_memory_human:696.51K
used_memory_rss:655416
used_memory_peak:72374824
used_memory_peak_human:69.02M
used_memory_lua:36864
mem_fragmentation_ratio:0.92
mem_allocator:jemalloc-3.6.0
>>>>>>>>>>>>>>>>after
# Memory
used_memory:71500776
used_memory_human:68.19M
used_memory_rss:71265080
used_memory_peak:72374824
used_memory_peak_human:69.02M
used_memory_lua:36864
mem_fragmentation_ratio:1.00
mem_allocator:jemalloc-3.6.0
: time = 23076 ms
HASH subKey "123", JedisCommands
>>>>>>>>>>>>>>>>begin
# Memory
used_memory:713224
used_memory_human:696.51K
used_memory_rss:655416
used_memory_peak:72374824
used_memory_peak_human:69.02M
used_memory_lua:36864
mem_fragmentation_ratio:0.92
mem_allocator:jemalloc-3.6.0
>>>>>>>>>>>>>>>>after
# Memory
used_memory:52300776
used_memory_human:49.88M
used_memory_rss:52273928
used_memory_peak:72374824
used_memory_peak_human:69.02M
used_memory_lua:36864
mem_fragmentation_ratio:1.00
mem_allocator:jemalloc-3.6.0
: time = 24877 ms
消費メモリは155.16 Mから49.88 Mに減少し、節約メモリは多い.
結論
データを保存する際にJedisCommandsインタフェースを実現するhsetメソッドをできるだけ呼び出し,シーケンス化操作を行わない.