Mysql數據批量導入Redis

爲了提升系統性能,在不少系統中使用Redis做爲緩存數據庫,那麼在系統啓動或重啓後,但願把DB的數據初始化到Redis以提升系統的性能,應該如何批量導入大量的數據呢?mysql

要導入數據,就要先了解Redis的協議(RESP),而後用sql拼接數據交給redis導入,RESP格式以下:linux

*n (*表示數組,按$劃分)
$n (表示參數長度)  cmd  (表示命令)
$n (表示參數長度)  field  (表示字段)
$n (表示參數長度)  value  (表示值)
...

咱們拼個簡單的數據,以下:redis

*4\r\n$5\r\nHMSET\r\n$8\r\nperson:1\r\n$2\r\nid\r\n$1\r\n1\r

上面表示有4組,5表示HMSET的長度,8表示person:1長度。。。
命令:HMSET person:1 id 1sql

下面咱們再寫下sql,以下:數據庫

SELECT CONCAT(
  "*8\n",
  '$', LENGTH(redis_cmd), '\n', redis_cmd, '\n',
  '$', LENGTH(hash), '\n',  hash, '\n',
  '$', LENGTH(hkey0), '\n',  hkey0, '\n',
  '$', LENGTH(hval0), '\n',  hval0, '\n',
  '$', LENGTH(hkey1), '\n',  hkey1, '\n',
  '$', LENGTH(hval1), '\n',  hval1, '\n',
  '$', LENGTH(hkey2), '\n',  hkey2, '\n',
  '$', LENGTH(hval2), '\n',  hval2, ''
)
FROM (
  SELECT
  'HMSET' AS redis_cmd, concat('hash:', id) AS hash,
  'id' AS hkey0,  id AS hval0,
  'age' AS hkey1,  age AS hval1,
  'name' AS hkey2,  name AS hval2
  FROM mytable
) AS t;

注意:換行符 windows使用 \n ,linux使用 \r\n windows

上面的sql能夠組裝redis須要的數據,下面咱們編寫導入命令:數組

mysql -uroot -proot -Dxfdb --default-character-set=utf8 --skip-column-names --raw < mysql_to_redis.sql | redis-cli -h 127.0.0.1 --pipe

--raw: 使mysql不轉換字段值中的換行符。
--skip-column-names: 使mysql輸出的每行中不包含列名。
--pipe 將命令封裝成redis通訊協議定義的數據格式,批量發送給redis執行緩存

執行命令後,若是出現相似如下提示,這說明導入正確:性能

All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 3

能夠打開 Redis-cli 輸入dbsize或者keys *命令來進行查詢。
學習交流,請加羣:64691032學習

相關文章
相關標籤/搜索