Redis第一篇:Redis安装并开机自启动,整合SpringBoot实战

417 阅读6分钟

“这是我参与更文挑战的第3天,活动详情查看: 更文挑战

下载安装

官网地址:redis.io/download。 本文使用的redis-5.0.5版本。

1、上传到服务器并解压

# 前置安装
yum install -y gcc-c++
# 解压
tar -zxvf redis-5.0.5.tar.gz
cd redis-5.0.5
# 查看
ll
-rw-rw-r--.  1 root root 106874 May 16  2019 00-RELEASENOTES
-rw-rw-r--.  1 root root     53 May 16  2019 BUGS
-rw-rw-r--.  1 root root   2381 May 16  2019 CONTRIBUTING
-rw-rw-r--.  1 root root   1487 May 16  2019 COPYING
drwxrwxr-x.  6 root root    192 Apr 30 06:58 deps
-rw-rw-r--.  1 root root     11 May 16  2019 INSTALL
-rw-rw-r--.  1 root root    151 May 16  2019 Makefile
-rw-rw-r--.  1 root root   6888 May 16  2019 MANIFESTO
-rw-rw-r--.  1 root root  20555 May 16  2019 README.md
-rw-rw-r--.  1 root root  61797 May 16  2019 redis.conf
-rwxrwxr-x.  1 root root    275 May 16  2019 runtest
-rwxrwxr-x.  1 root root    280 May 16  2019 runtest-cluster
-rwxrwxr-x.  1 root root    341 May 16  2019 runtest-moduleapi
-rwxrwxr-x.  1 root root    281 May 16  2019 runtest-sentinel
-rw-rw-r--.  1 root root   9710 May 16  2019 sentinel.conf
drwxrwxr-x.  3 root root   8192 Apr 30 06:59 src
drwxrwxr-x. 11 root root    182 May 16  2019 tests
drwxrwxr-x.  8 root root   4096 May 16  2019 utils

# 编译
make
# 安装
make install
ll /usr/local/bin
-rwxr-xr-x. 1 root root 4366568 Apr 30 06:59 redis-benchmark
-rwxr-xr-x. 1 root root 8111808 Apr 30 06:59 redis-check-aof
-rwxr-xr-x. 1 root root 8111808 Apr 30 06:59 redis-check-rdb
-rwxr-xr-x. 1 root root 4806792 Apr 30 06:59 redis-cli
lrwxrwxrwx. 1 root root      12 Apr 30 06:59 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 8111808 Apr 30 06:59 redis-server

这里建议使用新一点的版本,有些旧版本的redis在安装的时候,可能编译失败,还需要安装其他的一些库。

2、进入redis目录下的utils文件夹,使用其提供的启动脚本redis_init_script,将它复制到/etc/init.d

cd utils
ll
-rw-rw-r--. 1 root root  593 May 16  2019 build-static-symbols.tcl
-rw-rw-r--. 1 root root 1303 May 16  2019 cluster_fail_time.tcl
-rw-rw-r--. 1 root root 1098 May 16  2019 corrupt_rdb.c
drwxrwxr-x. 2 root root   60 May 16  2019 create-cluster
-rwxrwxr-x. 1 root root 2149 May 16  2019 generate-command-help.rb
drwxrwxr-x. 3 root root   31 May 16  2019 graphs
drwxrwxr-x. 2 root root   39 May 16  2019 hashtable
drwxrwxr-x. 2 root root   70 May 16  2019 hyperloglog
-rwxrwxr-x. 1 root root 9567 May 16  2019 install_server.sh
drwxrwxr-x. 2 root root   63 May 16  2019 lru
-rw-rw-r--. 1 root root 1277 May 16  2019 redis-copy.rb
-rwxrwxr-x. 1 root root 1352 May 16  2019 redis_init_script
-rwxrwxr-x. 1 root root 1047 May 16  2019 redis_init_script.tpl
-rw-rw-r--. 1 root root 1762 May 16  2019 redis-sha1.rb
drwxrwxr-x. 2 root root  135 May 16  2019 releasetools
-rwxrwxr-x. 1 root root 3787 May 16  2019 speed-regression.tcl
-rwxrwxr-x. 1 root root  693 May 16  2019 whatisdoing.sh
cp redis_init_script /etc/init.d/

3、另外存放配置文件

mkdir /usr/local/redis -p
mkdir /usr/local/redis/db -p
cp /opt/soft/redis-5.0.5/redis.conf /usr/local/redis/

4、修改一下配置文件

vim /usr/local/redis/redis.conf

以下是本人修改的一些内容,可根据实际情况需求修改

bind 0.0.0.0
requirepass redis1234
dir /usr/local/redis/db
daemonize yes

5、修改redis_init_script启动脚本

vim /etc/init.d/redis_init_script

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO

# 修改的,开机自启动
#chkconfig: 22345 10 90
#description: Start and Stop redis

REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
# 进程文件,和配置文件中一致不用修改
PIDFILE=/var/run/redis_${REDISPORT}.pid
# 修改的,配置文件所在位置
CONF="/usr/local/redis/redis.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
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac

修改启动脚本的权限和设置开启自启动

chmod 777 redis_init_script
chkconfig redis_init_script on

自此,redis的安装和开机自启动就配置完毕,接下来整合SpringBoot实战。

整合SpringBoot

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.3.RELEASE</version>
    </parent>
	<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--    演示引入    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

启动类

@SpringBootApplication
public class RedisApplication {

    public static void main(String[] args) {
        SpringApplication.run(RedisApplication.class, args);
    }
}

配置文件

spring:
  redis:
    host: 192.168.79.120
    port: 6379
    password: redis1234
    database: 0

redis操作的工具类

@Component
public class RedisUtil {
    
    private final StringRedisTemplate redisTemplate;

    public RedisUtil(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    // Key(键),简单的key-value操作

    /**
     * 实现命令:TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。
     *
     * @param key
     * @return
     */
    public long ttl(String key) {
        return redisTemplate.getExpire(key);
    }

    /**
     * 实现命令:expire 设置过期时间,单位秒
     *
     * @param key
     * @return
     */
    public void expire(String key, long timeout) {
        redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
    }

    /**
     * 实现命令:INCR key,增加key一次
     *
     * @param key
     * @return
     */
    public long incr(String key, long delta) {
        return redisTemplate.opsForValue().increment(key, delta);
    }

    /**
     * 实现命令:KEYS pattern,查找所有符合给定模式 pattern的 key
     */
    public Set<String> keys(String pattern) {
        return redisTemplate.keys(pattern);
    }

    /**
     * 实现命令:DEL key,删除一个key
     *
     * @param key
     */
    public void del(String key) {
        redisTemplate.delete(key);
    }

    // String(字符串)

    /**
     * 实现命令:SET key value,设置一个key-value(将字符串值 value关联到 key)
     *
     * @param key
     * @param value
     */
    public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 实现命令:SET key value EX seconds,设置key-value和超时时间(秒)
     *
     * @param key
     * @param value
     * @param timeout (以秒为单位)
     */
    public void set(String key, String value, long timeout) {
        redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
    }

    /**
     * 实现命令:GET key,返回 key所关联的字符串值。
     *
     * @param key
     * @return value
     */
    public String get(String key) {
        return (String) redisTemplate.opsForValue().get(key);
    }

    /**
     * 批量查询,对应mget
     *
     * @param keys
     * @return
     */
    public List<String> mget(List<String> keys) {
        return redisTemplate.opsForValue().multiGet(keys);
    }

    /**
     * 批量查询,管道pipeline
     *
     * @param keys
     * @return
     */
    public List<Object> batchGet(List<String> keys) {

//		nginx -> keepalive
//		redis -> pipeline

        List<Object> result = redisTemplate.executePipelined(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                StringRedisConnection src = (StringRedisConnection) connection;

                for (String k : keys) {
                    src.get(k);
                }
                return null;
            }
        });

        return result;
    }


    // Hash(哈希表)

    /**
     * 实现命令:HSET key field value,将哈希表 key中的域 field的值设为 value
     *
     * @param key
     * @param field
     * @param value
     */
    public void hset(String key, String field, Object value) {
        redisTemplate.opsForHash().put(key, field, value);
    }

    /**
     * 实现命令:HGET key field,返回哈希表 key中给定域 field的值
     *
     * @param key
     * @param field
     * @return
     */
    public String hget(String key, String field) {
        return (String) redisTemplate.opsForHash().get(key, field);
    }

    /**
     * 实现命令:HDEL key field [field ...],删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
     *
     * @param key
     * @param fields
     */
    public void hdel(String key, Object... fields) {
        redisTemplate.opsForHash().delete(key, fields);
    }

    /**
     * 实现命令:HGETALL key,返回哈希表 key中,所有的域和值。
     *
     * @param key
     * @return
     */
    public Map<Object, Object> hgetall(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    // List(列表)

    /**
     * 实现命令:LPUSH key value,将一个值 value插入到列表 key的表头
     *
     * @param key
     * @param value
     * @return 执行 LPUSH命令后,列表的长度。
     */
    public long lpush(String key, String value) {
        return redisTemplate.opsForList().leftPush(key, value);
    }

    /**
     * 实现命令:LPOP key,移除并返回列表 key的头元素。
     *
     * @param key
     * @return 列表key的头元素。
     */
    public String lpop(String key) {
        return (String) redisTemplate.opsForList().leftPop(key);
    }

    /**
     * 实现命令:RPUSH key value,将一个值 value插入到列表 key的表尾(最右边)。
     *
     * @param key
     * @param value
     * @return 执行 LPUSH命令后,列表的长度。
     */
    public long rpush(String key, String value) {
        return redisTemplate.opsForList().rightPush(key, value);
    }
}

编写控制类,测试redis

@RestController
@RequestMapping("test")
public class TestRedisController {

    @Autowired
    private RedisUtil redisUtil;

    @GetMapping("add")
    public void add(@RequestParam("key") String key, @RequestParam("value") String value) {
        redisUtil.set(key, value);
    }

    @GetMapping("list")
    public Object listAllKeys(){
        Set<String> keys = redisUtil.keys("*");
        return keys;
    }
}

自此,整合完毕。对于更多的RedisUtil中的操作就不一一写出来了。