Featured image of post Redis安装并开机自启动,整合SpringBoot实战

Redis安装并开机自启动,整合SpringBoot实战

下载安装

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

1、上传到服务器并解压

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 前置安装
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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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、另外存放配置文件

1
2
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、修改一下配置文件

1
vim /usr/local/redis/redis.conf

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

1
2
3
4
bind 0.0.0.0
requirepass redis1234
dir /usr/local/redis/db
daemonize yes

5、修改redis_init_script启动脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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

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

1
2
chmod 777 redis_init_script
chkconfig redis_init_script on

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

整合SpringBoot

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
	<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>

启动类

1
2
3
4
5
6
7
@SpringBootApplication
public class RedisApplication {

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

配置文件

1
2
3
4
5
6
spring:
  redis:
    host: 192.168.79.120
    port: 6379
    password: redis1234
    database: 0

redis操作的工具类

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
@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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
@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中的操作就不一一写出来了。