Redis_02_Redis单机版搭建和SpringBoot的使用(实践开发类)

Posted 毛奇志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis_02_Redis单机版搭建和SpringBoot的使用(实践开发类)相关的知识,希望对你有一定的参考价值。

文章目录

一、前言

本文包括Redis的定位与基本特性(本文使用Redis 6.0.9,使用自己本地vmware虚拟机 192.168.100.138 安装redis并使用)。

二、Redis安装

参考:
CentOS7 安装Redis单实例
https://gper.club/articles/7e7e7f7ff3g5bgccg69
阿里云CentOS7 Docker安装Redis
https://gper.club/articles/7e7e7f7ff7g5egc5g6c
Redis一主二从Sentinel监控配置
https://gper.club/articles/7e7e7f7ff3g5bgccg68
CentOS 7 单机安装Redis Cluster(3主3从伪集群)
https://gper.club/articles/7e7e7f7ff3g5bgcdg60

2.1 下载redis并解压压缩包

cd /usr/local/soft/
wget https://download.redis.io/releases/redis-6.0.9.tar.gz
tar -zxvf redis-6.0.9.tar.gz

wget无法下载就直接将url粘贴到浏览器上,windows本地下载,然后ftp上传到linux上

2.2 安装gcc依赖

Redis是C语言编写的,编译需要GCC。Redis6.x.x版本支持了多线程后台处理(接收客户端还是单线程),需要gcc的版本大于4.9,但是CentOS7的默认版本是4.8.5。

查看gcc的版本:

gcc -v

升级gcc版本:

yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

确认gcc的版本(在同一个窗口中!):

gcc -v

2.3 编译安装

cd redis-6.0.9/src
make install

安装成功的结果是src目录下面出现服务端和客户端的脚本

redis-server
redis-cli
redis-sentinel

注意:在 redis-6.0.9/src redis解压目录/src 目录下,执行 make install 是编译并安装,后面可以加参数 make install PREFIX=/usr/local/redis 表示将redis安装到 /usr/local/redis 目录下,如果不指定 PREFIX=/usr/local/redis,就是直接在解压目录安装。

Redis的实际安装目录就是 redis-server、redis-cli、redis-sentinel 所在目录,它们三个都是绿色的,都是可执行完文件。
第一个是 redis服务端,使用 ./redis-server 前端启动或 ./redis-server redis.conf 后端启动来启动,使用shutdown或者shutdown nosave或者kill -9 pid杀死,使用 ps -ef|grep redis 查看(进程名为redis-server的那个进程),使用netstat -nlpt|grep 6379 默认端口为 6379
第二个是 redis客户端 ,使用 ./redis-cli --raw 启动,–raw是可以处理中文,使用 exit 或者 kill -9 pid 杀死,使用 ps -ef|grep redis 查看(进程名为redis-cli的那个进程),
第三个是 redis哨兵,使用 ./redis-sentinel sentinel.conf 后端启动,使用 kill -9 pid 杀死,,使用 ps -ef|grep redis 查看(进程名为redis-sentinel的那个进程),使用netstat -nlpt|grep 26379 ,一般端口端口配置为 26379 ,需要手动到 sentinel.conf 中配置
注意:有了redisCluster,这个sentinel哨兵的主从切换的功能基本就用不到了

2.4 启动redis-server并进入客户端redis-cli

redis启动有两种方式,前端启动和后端启动,区别是:因为默认的前端启动,只要关掉xshell的session就会停止redis-server的运行。

2.4.1 redis有两种启动方式

1、默认启动方式为前端启动

cd  /redis安装目录/bin/     (这里指进入redis安装目录,bin目录下)
./redis-server                   (启动)

默认是前端启动模式,端口是6379

2、后端启动

(1)从redis的解压目录中复制redis.conf到redis的安装目录(本文中/usr/local/redis)

(2)修改安装目录下刚刚复制过来的配置文件:

daemonize yes    (表示使用后端模式启动)

(3)[root@bogon bin]# ./redis-server redis.conf 启动

注意:redis安装目录是指 redis-server、redis-cli、redis-sentinel 所在目录,find / -name redis-server 找到,并不一定是redis解压目录

2.4.2 一般使用redis后端启动

步骤1:修改 redis.conf 文件,配置后端启动,设置密码

默认的配置文件是/usr/local/soft/redis-6.0.9/redis.conf
后台启动,不然窗口一关服务就挂了

daemonize no

改成

daemonize yes

下面一行必须改成 bind 0.0.0.0 或注释,否则只能在本机访问

bind 127.0.0.1 

如果需要密码访问,取消requirepass的注释,在外网(比如阿里云)这个必须要配置,在自己的vmware虚拟机上一般不用设置密码,就保持 requirepass 这一行注释就好了。

requirepass yourpassword

步骤2:启动(使用redis.conf配置文件启动)

./src/redis-server redis.conf

查看端口是否启动成功: (可以用 netstat -nlpt | grep 6379 也可以用 ps -ef|grep redis 或者 ps -ef|grep 6379)

ps -ef|grep redis
netstat -nltp|grep 6379

步骤3:进入客户端

./redis-cli --raw

如下:./src/redis-server redis.conf 启动服务端,使用 ./redis-cli 启动客户端

2.5 停止redis-server的两种方式

方式1:停止redis-server(在客户端中)

redis> shutdown

方式2:停止redis-server(在linux上)

ps -ef | grep redis
kill -9 xxxx

区别:shutdown默认是 shutdown save ,会触发默认打开的rdb持久化,在linux上生成dump.rdb文件,下一次启动redis-server,在redis-cli使用 keys * 命令,还可以看到上一次的 键值对;kill -9 pid 命令,直接杀死redis-server进程,redis-server进程被杀死之前不会执行rdb持久化

若手动执行 shutdown nosave ,也是可以关闭 redis-server 进程,但是不会执行默认打开的rdb持久化。

三、redis-cli的使用

3.1 database 基本命令

 select 0  # 干掉当前db所有key
 flushdb   # 干掉当前db所有key
 flushall  # 干掉当前db所有key

在redis中,flushdb和flushall 都是清空当前数据库的操作,但是两者有很大的区别:
1、flushall 清空数据库并执行持久化操作,也就是rdb文件会发生改变,变成76个字节大小(初始状态下为76字节),所以执行flushall之后数据库真正意义上清空了.
2、flushdb 清空数据库,但是不执行持久化操作,也就是说rdb文件不发生改变.而redis的数据是从rdb快照文件中读取加载到内存的,所以在flushdb之后,如果想恢复数据库,则可以直接kill掉redis-server进程,然后重新启动服务,这样redis重新读取rdb文件,数据恢复到flushdb操作之前的状态.
注意:要直接kill 掉redis-server服务,因为shutdown操作会触发持久化.
lsof -i:6379 命令查看redis-server的进程号,然后kill即可

3.2 key基本命令

 set qingshan 2673(增/改) 
 get qingshan(查) 
 keys * 
 dbsize 
 exists qingshan 
 del qingshan huihui(删) 
 rename qingshan pengyuyan 
 type qingshan

四、Java项目中使用redis

4.1 Junit测试使用Jedis单连接redis

导入依赖

<dependency>
     <groupId>redis.clients</groupId>
     <artifactId>jedis</artifactId>
     <version>2.7.0</version>
</dependency>

test使用

// Junit测试连接redis和基本的set-get操作
@Test
public void testJedisSingle() 
	Jedis jedis = new Jedis("192.168.101.3", 6379);    
    //这里表示centos IP为192.168.101.3
	jedis.set("name", "bar");
	String name = jedis.get("name");
	System.out.println(name);
	jedis.close();

附:如果centos上的redis正常启动而且测试可以完成set-get基本操作,但是本地无法连接上centos上的redis,查看防火墙是否关闭。正确的操作是关闭防火墙或开启6379号端口。centos7.0防火墙操作如下:

关闭防火墙

systemctl status firewalld.service查看防火墙状态
systemctl stop firewalld.service 关闭防火墙
systemctl status firewalld.service查看防火墙状态

开启6379端口

添加
firewall-cmd --zone=public --add-port=6379/tcp --permanent    (--permanent永久生效,没有此参数重启后失效)
重新载入
firewall-cmd --reload
查看
firewall-cmd --zone= public --query-port=6379/tcp

注:关闭防火墙和打开6379号端口只要两者选一即可。

4.2 Junit测试使用连接池连接redis

通过单实例连接redis不能对redis连接进行共享,可以使用连接池对redis连接进行共享,提高资源利用率,使用jedisPool连接redis服务,如下代码:

@Test
	public void pool() 
		JedisPoolConfig config = new JedisPoolConfig();
		//最大连接数
		config.setMaxTotal(30);
		//最大连接空闲数
		config.setMaxIdle(2);
		
		JedisPool pool = new JedisPool(config, "192.168.101.3", 6379);
		Jedis jedis = null;
 
		try  
			jedis = pool.getResource();
			
			jedis.set("name", "lisi");
			String name = jedis.get("name");
			System.out.println(name);
		catch(Exception ex)
			ex.printStackTrace();
		finally
			if(jedis != null)
				//关闭连接
				jedis.close();
			
		
		
	

4.3 在spring中使用redis

上面的都是使用Junit的测试代码,不是项目中真正运行有效代码,这里介绍spring中整合redis

配置spring配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
 
<!-- 连接池配置 -->
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<!-- 最大连接数 -->
		<property name="maxTotal" value="30" />
		<!-- 最大空闲连接数 -->
		<property name="maxIdle" value="10" />
		<!-- 每次释放连接的最大数目 -->
		<property name="numTestsPerEvictionRun" value="1024" />
		<!-- 释放连接的扫描间隔(毫秒) -->
		<property name="timeBetweenEvictionRunsMillis" value="30000" />
		<!-- 连接最小空闲时间 -->
		<property name="minEvictableIdleTimeMillis" value="1800000" />
		<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
		<property name="softMinEvictableIdleTimeMillis" value="10000" />
		<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
		<property name="maxWaitMillis" value="1500" />
		<!-- 在获取连接的时候检查有效性, 默认false -->
		<property name="testOnBorrow" value="true" />
		<!-- 在空闲时检查有效性, 默认false -->
		<property name="testWhileIdle" value="true" />
		<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
		<property name="blockWhenExhausted" value="false" />
	</bean>
	
	<!-- redis单机 通过连接池 -->
	<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
		<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
		<constructor-arg name="host" value="192.168.101.3"/>
		<constructor-arg name="port" value="6379"/>
	</bean>

测试代码:

   private ApplicationContext applicationContext;
 
	@Before
	public void init() 
		applicationContext = new ClassPathXmlApplicationContext(
				"classpath:applicationContext.xml");
	
 
	@Test
	public void testJedisPool() 
	JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
			try  
			jedis = pool.getResource();
			
			jedis.set("name", "lisi");
			String name = jedis.get("name");
			System.out.println(name);
		catch(Exception ex)
			ex.printStackTrace();
		finally
			if(jedis != null)
				//关闭连接
				jedis.close();
			
		
	

五、尾声

Redis单机版搭建和SpringBoot的使用(实践开发类),完成了。

以上是关于Redis_02_Redis单机版搭建和SpringBoot的使用(实践开发类)的主要内容,如果未能解决你的问题,请参考以下文章

Redis Cluster的搭建(3.0.3)单机和双机

Redis_24_Redission的使用

Redis_24_Redission的使用

REDIS09_分布式锁的概述加锁使用sexnu解锁使用lua脚本保证原子性引发的问题思考

快速搭建redis单机版和redis集群版

REDIS09_分布式锁的概述加锁使用sexnu解锁使用lua脚本保证原子性引发的问题思考