Установка Redis via unix.socket
По мотивам куцей доки: http://redis.io/topics/quickstart и http://redis.io/download
От рута делаем:
mkdir /usr/src/redis
cd /usr/src/redis
wget http://redis.googlecode.com/files/redis-2.4.4.tar.gz
tar xzf redis-2.4.4.tar.gz
cd redis-2.4.4
make && make test
Если тесты прошли нормально (должно быть написано что-то вроде этого: “\o/ All tests passed without errors!”), то двигаемся дальше.
mv ../redis-2.4.4.tar.gz ./redis-2.4.4.tar.gz
cp src/redis-server /usr/local/bin/
cp src/redis-cli /usr/local/bin/
mkdir /etc/redis
mkdir /var/redis
Далее в доке предлагается сделать cp utils/redis_init_script /etc/init.d/redis_6379, где 6379 — номер дефолтного порта, но я планирую, что Redis будет работать у меня через unix.socket, поэтому будет так (везде далее нолик появляется именно по этой же причине):
cp utils/redis_init_script /etc/init.d/redis_0
Теперь нужно подредактировать конфиг:
nano /etc/init.d/redis_0
Редактированию там подлежит только номер порта (6-я строка):
REDISPORT=6379  -->  REDISPORT=0
Если номер порта не менять, то и редактировать ничего не нужно.
Но в моем случае, поскольку я планирую запускать редис через unix socket, то нужно еще внести несколько изменений:
- Добавляем переменную:
UNIXSOCK=/tmp/redis.sock - Выражение 
$CLIEXEC -p $REDISPORT shutdownв секции “stop” заменяем на$CLIEXEC -s $UNIXSOCK shutdown. 
Вот что получилось:
#!/bin/sh
REDISPORT=0
#REDISPORT=6379
UNIXSOCK=/tmp/redis.sock
OWNER=nobody
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
case "$1" in
  start)
      if [ -f $PIDFILE ]
      then
              echo "$PIDFILE exists, process is already running or crashed"
      else
              echo "Starting Redis server..."
              $EXEC $CONF
      fi
      ;;
  stop)
      if [ ! -f $PIDFILE ]
      then
              echo "$PIDFILE does not exist, process is not running"
      else
              PID=$(cat $PIDFILE)
              echo "Stopping ..."
              #$CLIEXEC -p $REDISPORT shutdown
              $CLIEXEC -s $UNIXSOCK shutdown
              while [ -x /proc/${PID} ]
              do
                  echo "Waiting for Redis to shutdown ."
                  sleep 0.5
                  echo -n ".."
                  sleep 0.5
                  echo -n ".."
              done
              echo "Redis stopped"
      fi
      ;;
  restart)
      if [ ! -f $PIDFILE ]
      then
              echo "$PIDFILE does not exist, process is not running"
      else
              PID=$(cat $PIDFILE)
              echo "Stopping ..."
              #$CLIEXEC -p $REDISPORT shutdown
              $CLIEXEC -s $UNIXSOCK shutdown
              while [ -x /proc/${PID} ]
              do
                  echo "Waiting for Redis to shutdown ..."
                  sleep 1
              done
              echo "Redis stopped"
      fi
      echo "Starting Redis server..."
      $EXEC $CONF
      ;;
  *)
      echo "Please use start or stop as first argument"
      ;;
esac
Далее нам нужно скопировать файл конфига:
cp redis.conf /etc/redis/0.conf
И отредактировать его:
nano /etc/redis/0.conf
В нем меняем следующее:
#daemonize no
daemonize yes
#pidfile /var/run/redis.pid
pidfile /var/run/redis_0.pid
#port 6379
port 0
bind 127.0.0.1
unixsocket /tmp/redis.sock
unixsocketperm 755
#loglevel verbose
loglevel warning
#logfile stdout
logfile /var/log/redis_0.log
#databases 16
databases 1
В секции “SNAPSHOTTING” можно поменять стратегию дампов. Я сделал так:
save 54000 10
save 3600 5000
dir /var/redis/dumps/
dbfilename dump_0.rdb
Поскольку в сеть смотреть мой редис не будет, то репликацию я в нем отключил (секция ‘REPLICATION’):
#slave-serve-stale-data yes
slave-serve-stale-data no
Далее, поскольку, как и сказано в конфиге, я собираюсь использовать редис не в качестве основной БД, а в качестве кеша, то стоит установить maxmemory, чтобы редис ненароком не сожрал всю память:
# 256 MB
maxmemory 268435456
Поскольку maxmemory установлен, то нужно установить и maxmemory-policy:
# maxmemory-policy volatile-lru
maxmemory-policy volatile-ttl
Выбрал volatile-ttl, потому что не знаю, как работает алгоритм LRU.
Отключаем appendfsync:
appendfsync no
Все, на этом правки конфига закончены.
Для логов мы указывали каталог /var/redis/dumps. Его нужно не забыть создать:
mkdir /var/redis/dumps
Проверяем, все ли работает. Проверить можно так:
Запускаем:
/etc/init.d/redis_0 start
Потом:
redis-cli -s /tmp/redis.sock
В консоли redis:
SET key1 "Test"
OK
GET key1
"Test"
Если все нормально, то добавляем в автозагрузку:
update-rc.d redis_0 defaults
PS
В логах редиса он сообщил мне следующее предупреждение:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
Поскольку я готов мириться с тем, что он не будет дампить себя на диск, то это предупреждение проигнорирую. А вообще решение вижу таким:
В /etc/sysctl.conf ничего, естественно, не вносим, но в /etc/init.d/redis_0
В секции старт, перед запуском редиса, сохраняем системное значение overcommit_memory:
touch /tmp/overcommit_memory_bfr_redis
chmod 0600 /tmp/overcommit_memory_bfr_redis
cat /proc/sys/vm/overcommit_memory > /tmp/overcommit_memory_bfr_redis
sysctl vm.overcommit_memory=1
А в секцию стоп возвращаем системное значение:
OCMSYS=$(cat /tmp/overcommit_memory_bfr_redis)
sysctl vm.overcommit_memory=$OCMSYS
Примерно так:
#!/bin/sh
REDISPORT=0
#REDISPORT=6379
UNIXSOCK=/tmp/redis.sock
OWNER=nobody
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
#fix WARNING about overcommit_memory
FWOBOM=FALSE
case "$1" in
  start)
      if [ -f $PIDFILE ]
      then
              echo "$PIDFILE exists, process is already running or crashed"
      else
              echo "Starting Redis server..."
              # -- fix WARNING about overcommit_memory
              if [ "TRUE" = $FWOBOM ]
              then
                touch /tmp/overcommit_memory_bfr_redis
                chmod 0600 /tmp/overcommit_memory_bfr_redis
                cat /proc/sys/vm/overcommit_memory > /tmp/overcommit_memory_bfr_redis
                sysctl vm.overcommit_memory=1
              fi
              # <--
              $EXEC $CONF
      fi
      ;;
  stop)
      if [ ! -f $PIDFILE ]
      then
              echo "$PIDFILE does not exist, process is not running"
      else
              PID=$(cat $PIDFILE)
              echo "Stopping ..."
              #$CLIEXEC -p $REDISPORT shutdown
              $CLIEXEC -s $UNIXSOCK shutdown
              while [ -x /proc/${PID} ]
              do
                  echo "Waiting for Redis to shutdown ."
                  sleep 0.5
                  echo -n ".."
                  sleep 0.5
                  echo -n ".."
              done
              # -- fix WARNING about overcommit_memory
              if [ "TRUE" = $FWOBOM ]
              then
                OCMSYS=$(cat /tmp/overcommit_memory_bfr_redis)
                sysctl vm.overcommit_memory=$OCMSYS
              fi
              # <--
              echo "Redis stopped"
      fi
      ;;
  restart)
      if [ ! -f $PIDFILE ]
      then
              echo "$PIDFILE does not exist, process is not running"
      else
              PID=$(cat $PIDFILE)
              echo "Stopping ..."
              #$CLIEXEC -p $REDISPORT shutdown
              $CLIEXEC -s $UNIXSOCK shutdown
              while [ -x /proc/${PID} ]
              do
                  echo "Waiting for Redis to shutdown ..."
                  sleep 1
              done
              echo "Redis stopped"
      fi
      echo "Starting Redis server..."
      # -- fix WARNING about overcommit_memory
      if [ "TRUE" = $FWOBOM ]
      then
        touch /tmp/overcommit_memory_bfr_redis
        chmod 0600 /tmp/overcommit_memory_bfr_redis
        cat /proc/sys/vm/overcommit_memory > /tmp/overcommit_memory_bfr_redis
        sysctl vm.overcommit_memory=1
      fi
      # <--
      $EXEC $CONF
      ;;
  *)
      echo "Please use start or stop as first argument"
      ;;
esac
PPS
- 
overcommit_memory влияет на выделение памяти ядром и на работу OOM Killer.
vm.overcommit_memory=0— более безопасный вариант, т.к. кто его знает, кого грохнет OOM Killer, если память кончится. - 
Если tcp сокет устраивает, а нужно только (возможно задать порт), то в каталоге utils с исходниками есть скрипт
install_server.sh, запуск которого сделает большую часть грязной работы, описанной выше. - 
По поводу maxmemory-policy volatile-lru vs volatile-ttl: статья на хабре про LRU