在树莓派(Raspberry Pi)上编译安装Redis

原创
2020/03/19 17:00
阅读数 1.7K

        我的树莓派硬件是2B版本(主要硬件规格:CPU 900MHz,内存1GB,这里是生产厂商e络盟[element14]网站Raspberry Pi 2 model B 社区主页),在16GB的SD卡上安装使用的是树莓派官方2020-02-13发布的最新版本的raspbian操作系统(它是基于debian操作系统的面向树莓派硬件的发行版本;国内可从清华大学镜像站下载raspbian压缩文件:Lite版本[ 433MB,解压后大小为1.72GB],桌面版本[ 1.1GB,解压后大小为3.52GB],完全版本[ 2.5GB,解压后大小为7.xGB];我下载安装使用的是Lite版本)。完成raspbian下载以后,(Windows环境下)使用 SD Card Formatter软件 格式化SD卡、使用 Win32DiskImager软件 将下载并解压出来的raspbian映像文件写入SD卡,完成写入后,将SD卡插入树莓派的SD卡槽中就可以通电开机了。

        <<重要>>为保证树莓派持续稳定运行,强烈推荐使用独立的Micro USB供电(比如 使用手机充电器供电)。并且需要确保供电电源所提供的电压和电流满足你的树莓派及其已连接设备的供电要求(需要特别说明的是 树莓派使用串口供电会不可避免地产生莫名问题)。从上面的厂商社区主页中的表格内容可知,我的树莓派2B版本要求的电流和电压是1.8A@5V;如果接入了更多的其他设备,电流可能要求更高一些。

        在安装redis之前,我在树莓派raspbian操作系统中已经安装并运行着 MariaDB 10.3版本(执行安装 sudo apt-get install mariadb-server)、编译安装并运行着Nginx 1.16.1及其关联软件(openssl-1.1.1dpcre-8.44zlib-1.2.11)、ufw防火墙(执行安装 sudo apt-get install ufw)、OpenJDK 13.0.2_8版本、Apache Tomcat 8.5.51版本,如果在编译安装redis过程中报错说缺少相关的关联软件,请根据报错信息自行下载、编译、安装相应软件。

        使用ssh工具(如 免费的putty商用的SecureCRT)以 有线网络或无线WiFi网络或串口 正常连接到树莓派以后,就可以开始下面的操作了。提示:使用串口连接树莓派时需在SSH工具和PC机的设备管理器的驱动程序中分别设置使用115200频率才可正常使用,因为树莓派raspbian操作系统中默认设置使用此频率进行串口通讯。

一、下载redis源码:

(在默认的pi用户的home目录下执行以下脚本)

# 下载redis
nohup wget -c -t 0 http://download.redis.io/releases/redis-5.0.8.tar.gz &

# 查看下载进度(查看最后3行日志内容)
tail -n 3 nohup.log

# 完成下载后删除nohup日志
rm -f nohup.log

二、编译安装redis:

2.1 编译和安装:

# 解压缩
tar xf redis-5.0.8.tar.gz

# 进入解压的目录
cd redis-5.0.8/

# 编译
make

# 测试编译
make test

# 创建安装目录
sudo mkdir /usr/local/redis

# 安装到指定位置
sudo make PREFIX=/usr/local/redis install

# 创建日志目录和数据目录(可根据需要创建到其它位置)
sudo mkdir /usr/local/redis/logs
sudo mkdir /usr/local/redis/data

2.2 修改redis配置文件:

# 从解压后的redis-5.0.8/目录中复制初始的配置文件到安装目录下
sudo cp redis.conf /usr/local/redis/

# 编辑redis.conf文件
sudo nano /usr/local/redis/redis.conf

        在nano编辑器中使用PgUp、PgDn键翻页 分别浏览到 port, daemonize, pidfile, logfile, dir, maxmemory 等位置,并做相应修改。这几个配置项目,我的修改结果如下:

# redis使用的端口号(默认为6379)
port 36379

# redis是否以后台方式运行(默认为 daemonize no )
daemonize yes

# redis进程号文件位置(默认为 pidfile /var/run/redis_6379.pid )
pidfile /usr/local/redis/logs/redis.pid

# redis的日志文件位置(默认为空,即 logfile "" )
logfile /usr/local/redis/logs/redis-std.log

# redis的数据文件保存位置(默认为 dir ./ )
dir /usr/local/redis/data/

# redis的最大可使用内存大小(默认为未定义,即 无限制)
maxmemory 128mb

以上及其他配置项 可根据你自己的使用环境情况进行配置。

补充:nano编辑器的快捷键在屏幕底部有提示,如:保存:Ctrl + O,回车;退出: Ctrl + X;如果修改了文件内容,又按了Ctrl+X,会有提示,此时 按Y 保存并退出、或 按N 不保存并退出、或 按Ctrl + C 取消退出。

2.3 配置redis随系统自启动:

        首先创建启动脚本:

# 创建启动脚本文件
sudo nano /usr/local/redis/bin/redis.sh

        然后复制下面的shell脚本代码并粘贴到nano编辑器中,可根据你自己的情况进行适当修改,以下是我使用的shell脚本代码:

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          redis
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Redis server daemon
# Description:       Redis server daemon
### END INIT INFO

#------------------------------------------------------------------------------
# save this shell to file: /usr/local/redis/bin/redis.sh
#
# add system service:
#     sudo ln -s /usr/local/redis/bin/redis.sh /etc/init.d/redis
#     sudo systemctl enable redis
#
# managep service:         
#     sudo systemctl start   redis.service
#     sudo systemctl stop    redis.service
#     sudo systemctl status  redis.service
#     sudo systemctl restart redis.service
#
# disable service:
#     sudo systemctl disable redis
#
# if modified this shell file, then execute: sudo systemctl daemon-reload
#------------------------------------------------------------------------------

#------------------------------------------------------------------------------
#                               Functions
#------------------------------------------------------------------------------
LSB_FUNC=/lib/lsb/init-functions

# Test that init functions exists
test -r $LSB_FUNC || {
    echo "$0: Cannot find $LSB_FUNC! Script exiting." 1>&2
    exit 5
}

. $LSB_FUNC

#------------------------------------------------------------------------------
#                               Consts
#------------------------------------------------------------------------------

# Minimize path
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

PS=${PS:-"redis"}                          # redis进程名称
DESCRIPTION=${DESCRIPTION:-"Redis Server"} # redis进程描述
REDIS_HOME=/usr/local/redis                # redis安装目录
CONF_FILE=$REDIS_HOME/redis.conf           # redis配置文件
REDIS_EXE=$REDIS_HOME/bin/redis-server     # redis服务端的命令
REDIS_CLI=$REDIS_HOME/bin/redis-cli        # redis客户端的命令
PIDFILE=$REDIS_PATH/logs/redis.pid         # reids的进程号文件位置(下面的 getConfigPidFile()方法会自动从配置文件中重新获取pid文件位置)
REDISPORT=6379   # redis的默认端口(下面的 getConfigPort()方法会自动从配置文件中重新获取端口号)

#------------------------------------------------------------------------------
#                               Simple Tests
#------------------------------------------------------------------------------

# Test if redis-server is a file and executable
test -x $REDIS_EXE || {
    log_failure_msg "$0: You don't have permissions to execute redis-server." 1>&2    
    exit 4
}

test -x $REDIS_CLI || {
    log_failure_msg "$0: You don't have permissions to execute redis-cli." 1>&2          
    exit 4
}

if [ ! -e $CONF_FILE ]; then
    echo "Not existed the config file: $CONF_FILE"
    exit 4
fi

#------------------------------------------------------------------------------
#                               Functions
#------------------------------------------------------------------------------

getConfigPort() {
    # find the config port
    PORT=`grep '^[[:space:]]*port' $CONF_FILE | sed 's/[ \t]*port[ \t]\+//;s/[ \t]\+$//g'`
    if [ -n "$PORT" ]; then
        REDISPORT=$PORT
        #echo "use config port: $REDISPORT"
    fi
}

getConfigPidFile() {
    # find the config pidfile
    _PIDFILE=`grep '^[[:space:]]*pidfile' $CONF_FILE | sed 's/[ \t]*pidfile[ \t]\+//;s/[ \t]\+$//g'`
    if [[ "$_PIDFILE" =~ ^\..* ]]; then                        # 以 . 开头,表示配置在相对redis安装位置的目录下
        _PIDFILE=`echo "$_PIDFILE" | sed 's/\.//'`             # 删除前面的 . 字符
        if [[ "$PIDFILE" != "$REDIS_HOME$_PIDFILE" ]]; then    # 与上面的配置不相同,组合完整的文件路径
            PIDFILE=$REDIS_HOME$_PIDFILE
        fi
    else
        if [[ "$PIDFILE" != "$_PIDFILE" ]]; then               # 与上面的配置不相同,使用配置的文件路径
            PIDFILE=$_PIDFILE
        fi
    fi
}

# 如果不需要自动从配置文件中获取pid文件位置和端口号,请注释掉以下两行代码(在最前面加上英文#号)
getConfigPort
getConfigPidFile

start() {

    if [ -f $PIDFILE ]; then
        log_warning_msg "$PIDFILE exists, $DESCRIPTION is already running or crashed."
        return 1
    fi

    log_action_msg "Starting $DESCRIPTION on port [ $REDISPORT ] ..."
    $REDIS_EXE $CONF_FILE

    if [ $? -eq 0 ]; then
        log_success_msg "$DESCRIPTION is running now"
    else
        log_failure_msg "failed to start $DESCRIPTION, you can try to add 'sudo' before the command"
    fi
    return 0
}

stop() {

    if [ ! -f $PIDFILE ]; then
        log_warning_msg "$DESCRIPTION is NOT running. NOT existed the pid file '$PIDFILE'"
        return 1
    fi

    #PID=$(cat $PIDFILE)
    log_action_msg "$DESCRIPTION on port [ $REDISPORT ] is stopping..."
    $REDIS_CLI -p $REDISPORT SHUTDOWN
    sleep 2

    while [ -x $PIDFILE ]
    do
        log_action_msg "Waiting for $DESCRIPTION to shutdown..."
        sleep 1
    done

    log_success_msg "$DESCRIPTION stopped"
    return 0
}

status() {

    if [ -f $PIDFILE ]; then
        log_action_msg `ps -ef | grep -v grep | grep -v status | grep $PS`
        log_success_msg "$DESCRIPTION is running on port [ $REDISPORT ] with pid [ `cat $PIDFILE` ]"
        return 0
    fi

    log_warning_msg "$DESCRIPTION is NOT running. NOT existed pid file '$PIDFILE'"
    return 1
}

restart() {
    stop;
    sleep 1
    start;
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart|reload)
        restart
        ;;
    *)
        echo "    Usage:"
        echo "           1. product:  sudo systemctl start redis.service"
        echo .
        echo "           2. develop:  sudo /etc/init.d/redis {start|stop|status|restart}" >&2
        echo "                 or     sudo $REDIS_HOME/bin/redis.sh {start|stop|status|restart}" >&2
        exit 1
esac

(说明:以上shell脚本代码主要根据国外同仁 Jason Giedymin 的GitHub项目修改得来,下面的参考资料中提供了其个人网站及其GitHub项目主页的访问链接)

        按Ctrl + O并回车保存,按Ctrl + X退出nano

创建自启动软连接:

sudo ln -s /usr/local/redis/bin/redis.sh /etc/init.d/redis

开启redis自启动服务:

sudo systemctl enable redis

管理redis服务:

# 启动redis服务
sudo systemctl start   redis.service

# 停止redis服务
sudo systemctl stop    redis.service

# 查看redis服务状态
sudo systemctl status  redis.service

# 重启redis服务
sudo systemctl restart redis.service

# 取消自启动redis服务
sudo systemctl disable redis

# 重新加载配置(修改了上面的redis.sh脚本文件后需要执行此命令以同步更新系统中的服务内容)
sudo systemctl daemon-reload

        在执行上面的启动redis服务命令之后,就可以使用redis客户端程序连接redis服务器进行相关操作了。

pi@raspberrypi:~ $ /usr/local/redis/bin/redis-cli -p 36379

127.0.0.1:36379> INFO
# Server
redis_version:5.0.8
...

# Clients
connected_clients:1
...

# Memory
used_memory:256512
used_memory_human:250.50K
...

# Persistence
...

# Stats
total_connections_received:5
...

# Replication
role:master
...

# CPU
used_cpu_sys:63.272276
...

# Cluster
cluster_enabled:0

# Keyspace
127.0.0.1:36379> quit
pi@raspberrypi:~ $ 

        可访问下面的“Redis 教程”进行学习和练习。

三、参考资料:

        国外同仁 Jason Giedymin 编写的适用于debian系操作系统的自启动脚本   http://github.com/JasonGiedymin/nginx-init-ubuntu

        linux systemctl命令详解   https://www.jb51.net/article/136559.htm

        systemctl 命令完全指南   https://www.linuxidc.com/Linux/2015-07/120833.htm

        Redis 教程    https://www.runoob.com/redis/redis-tutorial.html

        树莓派的供电问题    https://blog.csdn.net/huayucong/article/details/47065809

        树莓派的三种供电方式    https://jingyan.baidu.com/article/414eccf64b92ba6b421f0a67.html

[ END ]

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部