Linux安装MySQL、Redis及分布式锁实现

最近构建项目,涉及到很多细节需要到处查看文档,作为一名合格的面向百度开发的程序员,通过“百度一下”来寻找答案是最直接的方法。然而面对千篇一律或答非所问的搜索结果,浪费了大量的时间却仍然没能解决自己的问题,就想着自己去写一篇,但是当真正动笔的时候,才发现自己才是写的最水的那个^_^

本文参考链接如下:

Linux Ubuntu JAVA运行环境配置_changgongcheng_yq的博客-CSDN博客

Centos7.2安装mysql8 - 鬼谷山人 - 博客园

CentOS7.5 安装MySQL8 tar_xintingandzhouyang的专栏-CSDN博客_centos7 mysql8 tar

Centos7重置Mysql 8.0.1 root 密码 - 网络蚂蚁 - 博客园

目录

工作开始前的准备:

一:本地项目创建

二:远程连接

1.xshell连接ECS

2.WinSCP连接

三:jdk下载及环境变量配置

四:tomcat下载及配置

1.tomcat安装

2.1阿里网关配置

2.2centos防火墙配置

五:mysql安装和配置[重点]

1.查看并删除mariadb。

2.安装依赖

3.下载并解压mysql

4.创建配置文件[重点]

5.安装mysql

6.启动mysql服务

7.将启动命令加入系统进程中

8.初始化登录密码

9.设置允许远程登录

10.使用navicat 远程连接

六:将项目发布到ECS上并远程访问

七:安装redis并在springboot中引入

1.centos下redis的最简单安装和启动

2.springboot引入redis

3.在windows下使用客户端访问redis

八:分布式锁的Redis实现

1.引入依赖

2.分布式锁核心实现代码

3.测试代码


工作开始前的准备:

阿里云ECS一台(centos7.4.1708),Xshell,WinSCP,IntelliJ IDEA

jdk 下载地址(https://download.oracle.com/otn/java/jdk/8u211-b12/478a62b7d4e34b78b671c754eaaf38ab/jdk-8u211-linux-x64.tar.gz

mysql下载地址(https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.16-el7-x86_64.tar.gz

tomcat下载地址(http://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.19/bin/apache-tomcat-9.0.19.tar.gz

redis下载地址(http://download.redis.io/releases/redis-5.0.3.tar.gz

推荐使用wget+url的方式下载,速度非常快。或者自己寻找国内的速度比较快镜像

vim命令简单了解:

I 进入文本编辑模式  yy复制  p粘贴 dd删除 ctrl+j [回车]换行 

esc退出编辑模式 :X加密文件   :wq 强制保存退出   :x保存(若修改)退出 :ZZ写入退出   :q未修改退出  :q!强制不修改退出

tar压缩文件解压:tar -vxzf 

一:本地项目创建

创建一个用于测试的项目,需要有相应的ORM框架来操作数据库。可以使用现成的项目,测试项目能正常发布运行。

此处参考使用idea5分钟生成一个SpringBoot-Mybatis项目_changgongcheng_yq的博客-CSDN博客

进入application.yml修改数据库配置为ECS的外网地址,数据库名和密码和后面创建mysql时一致

使用ctrl+alt+shift+s热键或者点击File-Project Structure,点击artifacts

1.打war包

点击“+” ->  选择第三个 web-archive -> 右键项目名 put into output root  ->修改war包名并确认  返回主界面Build-> Build Artifacts。在项目的out里可以找到war包

2.打jar包

点击“+” ->  选择第一个jar->From module...-> Main Class选择启动类xxxAplication 确认 返回主界面 ->右侧的MavenProject 的package打包。在项目的target里可以找到jar包

二:远程连接

1.xshell连接ECS

如上图,连接里填写远程ip,端口号22,用户身份验证填写ECS虚拟机的用户名和密码

2.WinSCP连接

同上,数据ip端口以及用户名密码就可以。连接成功如下图

三:jdk下载及环境变量配置

1.在root目录下新建java文件夹,将下载好的通过WinSCP复制粘贴进去。也可以通过wget+url命令下载

解压安装包,输入ll命令

2.配置环境变量

2.1配置全局环境变量

vim /etc/profile,在文末输入如下配置,可以通过shift+insert粘贴进去,自己修改对应的路径和jdk版本号

export JAVA_HOME=/root/java/jdk1.8.0_211
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

esc->:wq退出并保存,使环境变量生效 source /etc/profile,测试javac -version

2.2配置当前用户环境变量(不建议)

vim ~/.bashrc 配置同上。

四:tomcat下载及配置

1.tomcat安装

在root下新建software文件夹,将下载好的tomcat安装包拖入并解压

通过mv apache-tomcat-9.0.19 tomcat命令可以将文件夹重命名

cd /tomcat进入目录,vim conf/server.xml修改端口为80

cd /bin进入目录,ll查看命令列表,./startup.sh启动tomcat,进入浏览器输入ip地址,测试是否能看到“小老虎”

2.如果连不上,是阿里网关和防火墙的问题

2.1阿里网关配置

在实例下面找到:网络和安全-安全组,创建下图的实例,开放刚刚tomcat中设置的80端口和3306端口(mysql后面测试使用)

2.2centos防火墙配置

查看防火墙开放的端口:firewall-cmd --list-ports

添加一个开放的端口:firewall-cmd --zone=public --add-port=80/tcp --permanent    (--permanent永久生效,没有此参数重启后失效)

重载端口使生效:firewall-cmd --reload

删除开放的端口:firewall-cmd --zone= public --remove-port=80/tcp --permanent

防火墙状态:systemctl status firewalld

防火墙启动:systemctl start firewalld

防火墙关闭:systemctl stop firewalld

开机禁用  : systemctl disable firewalld

开机启用  : systemctl enable firewalld

五:mysql安装和配置[重点]

1.查看并删除mariadb。

mariadb和mysql其实一样的,因为mysql不开源了,所以centos用mariadb代替他。需要卸载避免冲突

查看:rpm -qa | grep mariadb

卸载:rpm -e --nodeps

2.安装依赖

yum install libaio,没有libaio,在初始化安装mysql的时候会报错

3.下载并解压mysql

mysql下载比较慢,强烈推荐使用wget+下载地址的方式下载安装包,若想在本地保存备份,可在centos下好后,用winscp下载到本地。

将压缩包复制到software文件夹,通过tar -vxzf命令解压缩,通过mv mysql-8.0.16-el7-x86_64 mysql重命名文件夹

4.创建配置文件[重点]
 

[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/root/software/mysql
# 设置mysql数据库的数据的存放目录
datadir=/root/software/mysql/data
# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 设置忽略表名大小写
lower_case_table_names = 1
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4

配置的重点就是basedir和datadir,basedir是你解压包的目录,datadir是你安装mysql后数据存放目录,相当于ORACLE的表空间

lower_case_table_names = 1这个配置不加的话,表名不会忽略大小写,即可以存在user和USER两张表,使用mybatis作为ORM框架时会出现问题。

保存路径 vim /etc/my.cnf

5.安装mysql

进入目录:cd mysql/bin/

执行安装:./mysqld --initialize --console

复制上图红框处的命令,这个是你初次登录数据库的随机密码

6.启动mysql服务

进入启动服务文件夹: cd ../support-files/

启动服务:./mysql.server start

如果报下图错误,则给启动添加用户权限:./mysql.server start --user=root

7.将启动命令加入系统进程中

复制命令:cp mysql.server /etc/init.d/mysqld

使用系统命令重启:service mysqld restart --user=root

8.初始化登录密码

进入bin目录:cd ../bin

使用随机密码登录:./mysql -u root -p(输入刚刚红框中的随机命令,建议使用粘贴快捷键 shift+insert)

修改密码为1234:alter user 'root'@'localhost' identified with mysql_native_password by '1234';

9.设置允许远程登录

切换数据库:use mysql

修改权限:update user set user.Host = '%' where user.User='root';

刷新权限:flush privileges;

退出登录:quit

重启数据库:service mysqld restart --user=root

10.使用navicat 远程连接

六:将项目发布到ECS上并远程访问

此处使用jar包测试,war包放到tomcat中启动tomcat即可

1.在navicat中创建和一项目对应的测试数据库和表

2.在本地项目中写一个查询test,保证测试能够正确跑通

3.在root下新建一个service目录,将项目打成jar包,复制到该目录中

4.启动项目:java -jar jar包名称.如下图

5.后台启动项目:4中启动方式退出xshell当前窗口时会导致项目中止,使用如下命令可解决

nohup java -jar dailycount-0.0.1-SNAPSHOT.jar >log.out &

七:安装redis并在springboot中引入

1.centos下redis的最简单安装和启动

1.1解压和启动

将redis压缩包复制到software目录,用tar -vxzf解压,用make&&make install安装。

redis-server启动redis服务,redis-cli启动客户端。

1.2基本命令

keys * 查看所有key,set 1 1存键值对,get 1查看key为1的值,rename 1 a重命名key=1为a,

config set requirepass "1234"设置密码为1234,auth 1234用密码登录,config get requirepass查看密码,

save序列化保存上述修改。

1.3永久修改密码:vim打开redis.conf文件,用/命令找到protected-mode,修改为no,注释掉上面的bind127.0.0.1,找到requerepass,在下面添加requerepass 1234设置密码为1234。

重启redis,用config get *查看配置,如果配置不正确,则使用redis-server redis.conf(全文件路径)命令启动redis。

2.springboot引入redis

2.1添加maven包

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.2添加redis配置

在数据库配置下添加如下配置

redis:
    database: 0
    host: 47.102.43.84
    port: 6379
    password: ****
    timeout: 500
    jedis:
      pool:
        max-idle: 8 #池中“空闲”连接的最大数量。使用负值表示无限数量的空闲连接。
        min-idle: 0 #目标为保持在池中的最小空闲连接数。这个设置只有在正面的情况下才有效果。
        max-active: 8 #池在给定时间可以分配的最大连接数。使用负值无限制。
        max-wait: -1 #连接分配在池被耗尽时抛出异常之前应该阻塞的最长时间量(以毫秒为单位)。使用负值可以无限期地阻止。

2.3编写测试方法

新建任意一个controller,核心代码如下

@RestController
public class TestController {

    private static final Logger logger = LoggerFactory.getLogger(TestController.class);

    @Autowired
    RedisTemplate redisTemplate;

    /**
     * spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化,
     * 会导致key有乱码,导致客户端无法正确访问,此处初始化String类型的序列化方法
     */
    @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        this.redisTemplate = redisTemplate;
    }

    @RequestMapping("/set")
    public void set(String key,String value){
        redisTemplate.opsForValue().set(key,value);
    }

    @RequestMapping("/get")
    public String show(String key){
        String str = null;
        try {
            str = redisTemplate.opsForValue().get(key).toString();
        } catch (Exception e) {
            logger.error(""+e);
        }
        return str;
    }
}

在浏览器访问,使用.../set?key=1&value=1调用保存方法,使用/get?key=1调用查询方法。

3.在windows下使用客户端访问redis

此处使用的是用java开发的redisclient下载地址(GitHub - caoxinyu/RedisClient: Java Redis Client GUI Tool),速度较慢,建议使用git下载

进入RedisClient\release目录点击redisclient-win32.x86.2.0.exe安装客户端,

进入界面server-add填写ip和密码,登录成功如下图

八:分布式锁的Redis实现

本文参考Redis分布式锁的正确实现方式 - Ruthless - 博客园

1.引入依赖

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

2.分布式锁核心实现代码

public class RedisTool {

    private static final String LOCK_SUCCESS = "OK";
    private static final Long RELEASE_SUCCESS = 1L;

    /**
     * 尝试获取分布式锁
     * @param jedis Redis客户端
     * @param lockKey 锁 key是唯一
     * @param requestId 请求标识 
     * @param expireTime 超期时间
     * @return 是否获取成功
     */
    public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {

        String result = jedis.set(lockKey, requestId, new SetParams().nx().px(expireTime));

        if (LOCK_SUCCESS.equals(result)) {
            return true;
        }
        return false;

    }


    /**
     * 释放分布式锁
     * @param jedis Redis客户端
     * @param lockKey 锁
     * @param requestId 请求标识
     * @return 是否释放成功
     */
    public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {

        //Lua脚本代码 确保原子性
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

        if (RELEASE_SUCCESS.equals(result)) {
            return true;
        }
        return false;

    }


}

3.测试代码

新建一个controller,插入如下代码

    String requestId = UUID.randomUUID().toString();
    String lockKey = "3";

    public Jedis connectRedis(){
        Jedis jedis = new Jedis("47.102.43.84",6379);
        jedis.auth("****");
        return jedis;
    }

    @RequestMapping("/lock")
    public boolean lock(){//为了方便观察测试结果,此处锁超时失效时间为10s
        boolean flag = RedisTool.tryGetDistributedLock(connectRedis(),lockKey, requestId,10000);
        return flag;
    }
    @RequestMapping("/unlock")
    public boolean unlock(){
        return RedisTool.releaseDistributedLock(connectRedis(),lockKey,requestId);
    }

在浏览器调用测试方法,结果如图所示,在锁失效前并且不手动释放锁,仅第一个请求能获得锁返回true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值