Сжать строку и затем сохранить сжатый результат обратно в другой строке - очень плохая идея.
Строки, как правило, представляют собой последовательности символов.Они должны содержать буквы, знаки препинания, пробелы и тому подобное.Любой, кто обнаружит, что вы используете их для хранения двоичных данных, будет зол на вас, потому что это очень необычно.
Если вы когда-нибудь захотите сжать строки, будьте максимально честны и сохраняйте сжатые данные в байтовом массиве.Массивы байтов являются универсальными контейнерами, и в них следует ожидать хранения произвольных данных.
Вернуться к основному вопросу.В Java String
- это, в основном, char[]
, что означает, что каждый символ потребляет 16 бит (если вы имеете дело с простым английским или другими символами из базовой многоязычной плоскости ).
Поскольку все ваши символы являются ASCII, каждый из них может быть закодирован с использованием 7 битов.Добавьте еще один бит в самом начале, говоря «остальная часть этой строки только для ASCII», вы получите простую схему сжатия и 1 + 23 * 7
битов, что составляет 21 байт.Конечно, в этом случае в последнем байте есть 6 битов заполнения, но по сравнению с 2 * 23
байтами для хранения строки как есть, это уже хорошо.
(Я просто забыл: начиная с Java 9Строки, содержащие только ASCII, хранятся особым образом, который использует только 8 бит на символ вместо 16. Таким образом, предложенная выше схема сжатия будет действовать только до Java 8.)
При использовании Redis для хранения данныхимейте в виду, что он хранит все данные в оперативной памяти и вылетает, если не может выделить дополнительную оперативную память.(Насколько я помню, это было около 5 лет назад.) Поэтому, если вы уже можете оценить, что данные Redis становятся больше нескольких гигабайт, лучше выберите другую библиотеку хранения данных.