“这是我参与更文挑战的第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中的操作就不一一写出来了。