Software engineering notes

Database - Redis

介紹

Install

server

brew install redis                      // Mac
sudo apt-get install redis-server       // Ubuntu

Mac 需執行 redis-server 指令才會啟動

client : 只需安裝 redis-tools

sudo apt-get install redis-tools

Command

keys

全部的 key

keys *

Key 的數量

info keyspace
> db0:keys=74415,expires=63940,avg_ttl=306997004

Find prefix string key : ‘queue:’

keys queue:*

刪除 prefix key

redis-cli KEYS "prefix:*" | xargs redis-cli DEL

Count matching keys

redis-cli keys "prefix:*" | wc -l

SET, GET

SET users:test "job: php backend, born: 1989"
GET users:test                                       // "job: php backend, born: 1989"

A String value can be at max 512 Megabytes in length.

hash : 裡面可以有很多 key 跟 value, ex: {name: test}

HSET 'me' 'name' 'test'

HGET 'me' 'name'    //得到 test

HDEL 'me' 'name'

HGETALL 'me'     //得到所有 key: value

HMSET user:1000 username antirez password P1pp0 age 34

HGETALL user:1000

HSET user:1000 password 12345

HGETALL user:1000

list

LPUSH mylist a
LPUSH mylist b

RPUSH mylist c

LRANGE mylist 0 -1
1) "b"
2) "a"
3) "c"

LPOP mylist     // 輸出 b, 剩下 a, c

LBPOP mylist mylist3 mylist3 0    // 非 block 依序彈出 value, 但如果所有的 list 都是空的, 就會 block 直到超時或有 list 被 push 值進來

LLEN mylist     // count 裡面的數量

expired time

EXPIRE key 10      // This key has been set expired time and it'll expire after 10 seconds

Show the rest of expired time

TTL key

increase

SET mykey "10"
> "OK"
INCR mykey
> (integer) 11

Transactions : MULTI + (一串指令) + EXEC

MULTI
OK
> INCR foo
QUEUED
> INCR bar
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1

查看 Connection list

client list

SETNEX (SET if Not eXists) (如果沒存在, 行為跟 SET 一樣)

SETNX mykey "Hello"

其他指令

Connect to redis server

redis-cli -h xxx-cache.cnhynt.0001.usw2.cache.amazonaws.com -p 6379

可不加 -p, 預設會使用 6379 port

latency: 跑一個 loop PING command 100 times per second 來測試, 回應的數字代表是 ms

redis-cli --latency
min: 2, max: 4, avg: 2.78 (98 samples)

ref: https://redis.io/topics/rediscli

benchmark: 它會測試不同項目

redis-benchmark

(...略...)

====== SET ======
  10000 requests completed in 0.57 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

0.01% <= 2 milliseconds
87.84% <= 3 milliseconds
97.55% <= 4 milliseconds
98.97% <= 5 milliseconds
99.40% <= 6 milliseconds
99.51% <= 14 milliseconds
99.66% <= 15 milliseconds
99.93% <= 16 milliseconds
100.00% <= 16 milliseconds
17543.86 requests per second

(...略...)

Export and Import

Backup to another redis server

Export

$ redis-cli
127.0.0.1:6379> SAVE
OK

Default backup path: /var/lib/redis/dump.rdb

Copy backup(/var/lib/redis/dump.rdb) to another server

$ scp /var/lib/redis/dump.rdb myuser@B:/tmp/dump.rdb

Import

$ sudo service redis-server stop
$ sudo cp /tmp/dump.rdb /var/lib/redis/dump.rdb
$ sudo chown redis: /var/lib/redis/dump.rdb
$ sudo service redis-server start

Import mass data

Create import.txt file :

SET job1 "First job"

SET job2 "Second job"

SET job2 "Second job"

要空一格, 不然執行後會有錯誤

import command :

cat import.txt | redis-cli --pipe

(cat import.txt; sleep 10) | nc localhost 6379 > /dev/null

對 lan 開放

/etc/redis/redis.conf :

bind 0.0.0.0

ref : https://sendgrid.com/blog/get-going-go-redis/

其他

將比對到的 key 做 HGET

redis-cli -h redis.example.ap-northeast-1.local KEYS "user:????????????????????????????????" | xargs -i@ redis-cli -h redis.example.ap-northeast-1.local hget @ name