くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

Redis

CentOS7 Redis4 Python3で性能確認

VirtualBox上のCentOS7にRedis4入れてPtyhonから呼んでみたときの性能回り。

VirtualBoxはRAM4GB、CPU:1コア,2.9G。

まず、接続。コネクションプール使うのがあるので比較。

import time
import redis

#コネクションプール使用で1万回接続⇒0.05472540855407715
t1 = time.time()
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='hogepass')
for i in range(10000):
    r = redis.Redis(connection_pool=pool)
print(time.time() - t1)

#普通に1万回接続⇒0.2304081916809082
t1 = time.time()
for i in range(10000):
    r = redis.Redis(host='127.0.0.1', port=6379, password='hogepass')
print(time.time() - t1)

#4.5倍くらいプールの方が早い?

で、なんでか普通に接続の方を先にやるとプールの方が遅くなる。なんじゃらほい。

キーバリュの更新。ランダム文字の10万文字をバリューにして10000回更新

import time
import redis
import string
import random

def randomCharacter(n):
    c = string.ascii_lowercase + string.ascii_uppercase + string.digits
    return ''.join([random.choice(c) for i in range(n)])

databody = randomCharacter(100000)


t1 = time.time()
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='hogepass')
r = redis.Redis(connection_pool=pool)
for i in range(10000):
    r.set(i,databody)
print(time.time() - t1)

#1回目:3.6718790531158447
#2回目:3.044043779373169
#3回目:2.0042741298675537
#4回目:2.015092134475708

初回(追加)ベースで考えると、10万文字のデータ更新で1件0.3msってところ。

索引。1万文字のバリューで1万件のデータをを1000回1件索引

t1 = time.time()
for i in range(1000):
    r.get(i)
print(time.time() - t1)

# 0.10848879814147949

1回あたり、0.1msと言った感じ。

おまけ

コネクションプールと普通の接続でmonitorの結果

import redis

pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='hogepass')
#プール1回目
r = redis.Redis(connection_pool=pool)
r.set('pool1','hoge1')#プールの場合はここでAuthのコマンド送ってる
r.get('pool1')
#プール2回目
r = redis.Redis(connection_pool=pool)
r.set('pool2','hoge2')
r.get('pool2')
#普通の1回目
r = redis.Redis(host='127.0.0.1', port=6379, password='hogepass')
r.set('not pool1','fuga1')
r.get('not pool1')
#普通の2回目
r = redis.Redis(host='127.0.0.1', port=6379, password='hogepass')
r.set('not pool2','fuga2')
r.get('not pool2')

上のmonitor結果

[0 127.0.0.1:58564] "AUTH" "hogepass"
[0 127.0.0.1:58564] "SET" "pool1" "hoge1"
[0 127.0.0.1:58564] "GET" "pool1"
[0 127.0.0.1:58564] "SET" "pool2" "hoge2"
[0 127.0.0.1:58564] "GET" "pool2"
[0 127.0.0.1:58566] "AUTH" "hogepass"
[0 127.0.0.1:58566] "SET" "not pool1" "fuga1"
[0 127.0.0.1:58566] "GET" "not pool1"
[0 127.0.0.1:58568] "AUTH" "hogepass"
[0 127.0.0.1:58568] "SET" "not pool2" "fuga2"
[0 127.0.0.1:58568] "GET" "not pool2"

コネクションプール使ってる方はやっぱ、つなぎ直しはしてませんね。つか繋ぎっぱなしになるんだろか。接続解除的な何かあったかな。あと、プールの場合は最初のSetの時にAuthコマンドはいてるっぽいですね。。。

CentOS7 + Redis

CentOS7でRedis4インストール。ググるとCentOS6だったりRedis3だったり色々なのでまとめ。

公式に載ってる通りにまずインストール。

#作業はRootで
#適当なディレクト内で実行
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar xzf redis-4.0.10.tar.gz
cd redis-4.0.10
make

#起動確認
src/redis-server

#インストール先はデフォで⇒ /usr/local/bin
make install

redisのユーザとグループを作る。

groupadd redis
useradd -s /sbin/nologin -M -g redis redis

設定・ログとかとか用のディレクトリとパーミッション

mkdir /etc/redis
mkdir /var/log/redis

chmod 755 /etc/redis
chmod 755 /var/log/redis

chown redis:redis /etc/redis 
chown redis:redis /var/log/redis

設定ファイルの雛形コピーして修正。

#最初に展開したredis-4.0.10の中
cp redis.conf /etc/redis/redis.conf_org #元ファイルをなんとなく
cp redis.conf /etc/redis/redis6379.conf

#編集
vi /etc/redis/redis6379.conf

#修正内容は↓
daemonize no
supervised auto
logfile /var/log/redis/redis6379.log
dir /var/log/redis
requirepass hogepass
maxclients 1024 

起動確認。

/usr/local/bin/redis-server /etc/redis/redis6379.conf

#別のターミナルで
redis-cli
auth hogepass
ping
quit

自動起動の設定。

#Unitの設定ファイル
vi /etc/systemd/system/redis6379.service
#中身
[Unit]
Description=Redis

[Service]
Type=simple
ExecStart=/usr/local/bin/redis-server /etc/redis/redis6379.conf
ExecStop=/usr/local/bin/redis-cli -p 6379 -a hogepass shutdown
User=redis
Group=redis

[Install]
WantedBy=multi-user.target


#起動確認
systemctl daemon-reload
systemctl start redis6379
systemctl stop redis6379

#サービス化の設定
systemctl enable redis6379

で、自動起動にして再起動すると上手くいかない場合がある。rootで色々起動確認しながらやると、DBのダンプファイルとかログファイルがrootで作成されてしまうので、自動起動時のredisユーザだと触れなくて落ちてる模様。その場合は、上記の設定で言うと「/var/log/redis」の中のファイル丸ごと消して再起動すればOK。

systemctlで起動したときのログは「 journalctl -f -u redis6379」みたいな感じでやると見れる。

参考

問合せ