zoukankan      html  css  js  c++  java
  • Linux-初识redis

    实验环境:

    Centos7.3

    yum安装redis:

    清空/etc/yum.repos.d/目录下的所有文件

    下载阿里云yum源

    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    yum clean all

    yum makecache

    yum -y install epel-release

    yum -y install redis

    编译安装:

    上传软件包redis-5.0.8.tar.gz到服务器:

           tar xf redis-5.0.8.tar.gz -C /usr/local/

           cd /usr/local/redis-5.0.8

           make -j 4

           make install

    手动添加服务启动脚本:

    vim /usr/lib/systemd/system/redis.service

           [Unit]

    Description=Redis persistent key-value database

    After=network.target

    After=network-online.target

    Wants=network-online.target

     

    [Service]

    ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd

    ExecStop=/usr/libexec/redis-shutdown

    Type=notify

    User=redis

    Group=redis

    RuntimeDirectory=redis

    RuntimeDirectoryMode=0755

     

    [Install]

    WantedBy=multi-user.target

    添加服务关闭脚本:

           #!/bin/bash

    #

    # Wrapper to close properly redis and sentinel

    test x"$REDIS_DEBUG" != x && set -x

     

    REDIS_CLI=/usr/bin/redis-cli

     

    # Retrieve service name

    SERVICE_NAME="$1"

    if [ -z "$SERVICE_NAME" ]; then

       SERVICE_NAME=redis

    fi

     

    # Get the proper config file based on service name

    CONFIG_FILE="/etc/$SERVICE_NAME.conf"

     

    # Use awk to retrieve host, port from config file

    HOST=`awk '/^[[:blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1`

    PORT=`awk '/^[[:blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1`

    PASS=`awk '/^[[:blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1`

    SOCK=`awk '/^[[:blank:]]*unixsockets/ { print $2 }' $CONFIG_FILE | tail -n1`

     

    # Just in case, use default host, port

    HOST=${HOST:-127.0.0.1}

    if [ "$SERVICE_NAME" = redis ]; then

        PORT=${PORT:-6379}

    else

        PORT=${PORT:-26739}

    fi

     

    # Setup additional parameters

    # e.g password-protected redis instances

    [ -z "$PASS"  ] || ADDITIONAL_PARAMS="-a $PASS"

     

    # shutdown the service properly

    if [ -e "$SOCK" ] ; then

            $REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdown

    else

            $REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdown

    fi

    # useradd -r redis -s /sbin/nologin          //创建redis用户

    # systemctl daemon-reload              //重新加加载Unit文件

    # systemctl start redis               //启动redis

    常用命令:

    redis获取帮助:

    127.0.0.1:6379> help          //获取使用帮助

    To get help about Redis commands type:

          "help @<group>" to get a list of commands in <group>

          "help <command>" for help on <command>

          "help <tab>" to get a list of possible help topics

          "quit" to exit

     

    说明:redis的help命令非常强大,因为redis支持众多的数据结构,每一种数据结构当中都支持N种操作,因此需要使用 help @group方式来获取某一种数据结构所支持的操作

     

    例:获取字符串组所支持有那些操作

    127.0.0.1:6379> help @string

     

    127.0.0.1:6379> help APPEND   //获取单个命令的使用方法

    APPEND key value              //命令方法

    summary: Append a value to a key

    since: 2.0.0            //说明此命令在哪个版本中引入的

    group: string        //该命令所属哪一个组

     

    查看都有哪些组:

    127.0.0.1:6379> help TAB键,每敲一次轮换一个,带有@则为一个组,不带@则为命令使用

     

    切换库(名称空间):

           127.0.0.1:6379> select 1             //表示切换到1号库中,默认为0号库,共16个,0-15

           OK

           127.0.0.1:6379[1]>

    13.3.4  键的遵循:

    可以使用ASCII字符

    键的长度不要过长,键的长度越长则消耗的空间越多

    在同一个库中(名称空间),键的名称不得重复,如果复制键的名称,实际上是修改键中的值

    在不同的库中(名称空间),键的同一个名称可以重复

    键可以实现自动过期

     

    13.3.5  Strings的操作:

    127.0.0.1:6379> help set

    SET key value [EX seconds] [PX milliseconds] [NX|XX]   //命令 键 值 [EX 过期时间,单位秒]

    summary: Set the string value of a key

    since: 1.0.0

    group: string

     

    NX:如果一个键不存在,才创建并设定值,否则不允许设定

    XX:如果一个键存在则设置建的值,如果不存在则不创建并不设置其值

     

    例:

    127.0.0.1:6379> set cjk lzll

    OK

     

    127.0.0.1:6379> set cjk aaa NX

    (nil)        //反回提示一个没能执行的操作

     

    127.0.0.1:6379> get cjk

    "lzll"

     

    127.0.0.1:6379> set foo abc XX

    (nil)

     

    定义一个键并设置过期时间为60秒

    127.0.0.1:6379> set fda abc EX 60

    OK

     

    获取键中的值:

    127.0.0.1:6379> help get

    GET key

    summary: Get the value of a key

    since: 1.0.0

    group: string

     

    例:

    127.0.0.1:6379> get cjk

    "lzll"

     

    添加键中的值(在原有键中附加值的内容):

    127.0.0.1:6379> append cjk fda

    (integer) 7

    127.0.0.1:6379> get cjk

    "lzllfda"

     

    获取指定键中的值的字符串的长度:

    127.0.0.1:6379> strlen cjk

    (integer) 7

     

    定义整数值:

    127.0.0.1:6379> set fda 0           //整数值为0

    OK

     

    增加键中的整数值:

    127.0.0.1:6379> incr fda

    (integer) 1

    127.0.0.1:6379> incr fda

    (integer) 2

    127.0.0.1:6379> incr fda

    (integer) 3

    127.0.0.1:6379> incr fda

    (integer) 4

    127.0.0.1:6379> get fda

    "4"

    注:incr命令只能对整数使用

     

    删除键:

    127.0.0.1:6379> del fda

    (integer) 1

    127.0.0.1:6379> get fda

    (nil)

     

    13.3.6  列表的操作:

    键指向一个列表,而列表可以理解为是一个字符串的容器,列表是有众多元素组成的集合,可以在键所指向的列表中附加一个值

    LPUSH    //在键所指向的列表前面插入一个值(左边加入)

           RPUSH   //在键所指向的列表后面附加一个值(右边加入)

           LPOP      //在键所指向的列表前面弹出一个值(左边弹出)

           RPOP     //在键所指向的列表后面弹出一个值(右边弹出)

           LINDEX  //根据索引获取值,指明索引位置进行获取对应的值

           LSET       //用于修改指定索引的值为指定的值

     

    例:

           127.0.0.1:6379> help @list

           LSET key index value

           summary: Set the value of an element in a list by its index

           since: 1.0.0

                        

           指定一个新的列表,在帮助中并没产明哪个命令用于创建一个新的列表,实际上创建一个新的列表使用LPUSH或RPUSH都可以

     

    例:

           127.0.0.1:6379> lpush ll cjk        //ll为列表名称,cjk为值(索引)

           (integer) 1

     

    获取列表中的值:需要指明索引位置进行获取对应的值

           127.0.0.1:6379> lindex ll 0         //第一个索引则为0

           "cjk"

     

    在原有的列表中的左侧加入一个值:

           127.0.0.1:6379> lpush ll fda

           (integer) 2

     

           127.0.0.1:6379> lindex ll 0

           "fda"

     

           127.0.0.1:6379> lindex ll 1

           "cjk"

     

    在原有的列表中的右侧加入一个值

           127.0.0.1:6379> rpush ll lzll

           (integer) 3

     

           127.0.0.1:6379> lindex ll 2

           "lzll"

     

           127.0.0.1:6379> lindex ll 1

           "cjk"

     

           127.0.0.1:6379> lindex ll 0

           "fda"

     

    修改一个已有的列表中的值:

           127.0.0.1:6379> lset ll 0 abc

           OK

     

           127.0.0.1:6379> lindex ll 0

           "abc"

     

    查看列表中的值的数量

           127.0.0.1:6379> llen ll

           (integer) 3

     

    在已有的列表中右侧弹出(删除)一个值

           127.0.0.1:6379> rpop ll

           "lzll"

     

    在已有的列表中左侧弹出(删除)一个值

           127.0.0.1:6379> lpop ll

           "abc"

           127.0.0.1:6379> lpop ll

           "cjk"

           127.0.0.1:6379> lpop ll

           (nil)

     

    redis命令选项:

    [root@xuegod63 ~]# redis-cli -h

           选项:

           -h <hostname>    指定主机IP

           -p <port>             指定端口socket文件进行通信

           -s <socket>     指定socket文件,如果客户端和服务端都在同一台主机,可以指定socket文件进行通信

           -a <password>   指定认证密码

           -r <repeat>     连接成功后指定运行的命令N次

           -i <interval>   连接成功后每个命令执行完成等待时间,使用-i选项指定

           -n <db>              

     

           [root@xuegod63 ~]# redis-cli -h 192.168.1.63        //连接redis,默认不启用密码认证

    或:

           [root@xuegod63 ~]# redis-cli    //使用redis-cli直接连接,默认连接是127.0.0.1 IP

           127.0.0.1:6379> exit    //退出连接

    配置文件详解:

           daemonize no             //表示redis并不会运行成为一个守护进程,如果需要运行成为一个守护进程,则把no,改为yes即可,如果使用服务脚本启动,即使daemonize为no,也会运行为一个守护进程

           port 6379             //监听端口:6379/tcp

           tcp-backlog 511           //指定tcp-backlog的长度

                  说明:任何的tcp服务都有可能使用到tcp-backlog功能,backlog是一个等待队列,比如:redis的并发很高时,redis有可能运行不过来时,就连接本地缓存等队列都满了以后,就会使用额外的存储地方,把新来的请求暂存下来,而这个位置则称为backlog

           bind 127.0.0.1              //监听的地址,默认监听在127.0.0.1地址上,可以指定为0.0.0.0地址,或某个特定的地址,或可以指定多个,使用空格分隔即可

           # unixsocket /tmp/redis.sock            //指定使用sock文件通信及sock文件位置,如果服务端和客户都在同一台主机上,建议打开此项,基于sock方式通信可以直接在内存中交换,数据不用再经过TCP/TP协议栈进行封装、拆封

           # unixsocketperm 700                //定义sock文件的访问权限

           timeout 0             //表示当客户端连接成功后,空闲(非活跃、或没有任何数据交互)多长时间则连接超时,0表示不启用此功能

           tcp-keepalive 0            //定义是否启用tcp-keepalive功能

           loglevel notice             //定义日志级别

           logfile /var/log/redis/redis.log        //定义日志文件

           databases 16        //定义redis默认有多少个databases,但是在分布式中,只能使用一个

     

           #### SNAPSHOTTING  ####         //定义RDB的持久化相关

           save <seconds> <changes>       //使用save指令,并指定每隔多少秒,如果发生多大变化,进行存储

           示例:

           save 900 1            //表示在900秒(15分钟内),如果至少有1个键发生改变,则做一次快照(持久化)

           save 300 10          //表示在300秒(5分钟内),如果至少有10个键发生改变,则做一次快照(持久化)

           save 60 10000       //表示在60秒(1分钟内),如果至少有10000个键发生改变,则做一次快照(持久化)

           save ""          //如果redis中的数据不需做持久化,只是作为缓存,则可以使用此方式关闭持久化功能

     

          ######## REPLICATION ####### //配置主从相关

           # slaveof <masterip> <masterport>        //此项不启用时,则为主,如果启动则为从,但是需要指明主服务器的IP,端口

           # masterauth <master-password>     //如果主服务设置了密码认证,那么从的则需要启用此项并指明主的认证密码

           slave-read-only yes            //定义从服务对主服务是否为只读(仅复制)

     

           ##### LIMITS #####                 //定义与连接和资源限制相关的配置

           # maxclients 10000                    //定义最大连接限制(并发数)

           # maxmemory <bytes>             //定义使用主机上的最大内存,默认此项关闭,表示最大将使用主机上的最大可用内存

    认证和删库:

     认证实现方法:

           (1) vim /etc/redis.conf

           # requirepass foobared              //启用此项,并指定密码即可

           requirepass PASSWORD

     

    例:

           # vim /etc/redis.conf

           requirepass kill

     

           (1) redis.conf

           # requirepass foobared              //启用此项,并指定密码即可

           requirepass PASSWORD

     

    例:

           # vim /etc/redis.conf

           requirepass kill

     

           # redis-cli

           127.0.0.1:6379> select 1

           (error) NOAUTH Authentication required.

     

           127.0.0.1:6379> auth kill

           OK

     

           127.0.0.1:6379> select 1

           OK

           127.0.0.1:6379[1]>

     

    清空数据库:

           FLUSHDB:删除当前选择的数据库所有key

           FLUSHALL:清空所有库

     

           127.0.0.1:6379> flushdb

           OK

  • 相关阅读:
    异常测试之Socket网络异常
    关于文件的INode与Java中的文件操作接口
    java程序中获取kerberos登陆hadoop
    团队游戏的那些事
    细说内测
    如何搭建视频转码集群、播放服务器
    PropertyPlaceHolderConfigurer中的location是不是用错了?
    浅谈java classloader
    foreach写失效的问题
    ArcGIS中的WKID
  • 原文地址:https://www.cnblogs.com/Vampire-MIn/p/13085252.html
Copyright © 2011-2022 走看看