锁的演化-Java中锁的解决方案

前言

上一篇分布式锁的文章中,通过超市存放物品的例子和大家简单分享了一下Java锁。本篇文章我们就来深入探讨一下Java锁的种类,以及不同的锁使用的场景,当然本篇只介绍我们常用的锁。我们分为两大类,分别是乐观锁和悲观锁,公平锁和非公平锁。

锁的演化-单体架构实战案例

前言

从本篇开始,老猫会通过电商中的业务场景和大家分享锁在实际应用场景下的演化过程。从Java单体锁到分布式环境下锁的实践。

超卖的第一种现象案例

其实在电商业务场景中,会有一个这样让人忌讳的现象,那就是“超卖”,那么什么是超卖呢?举个例子,某商品的库存数量只有10件,最终却卖出了15件,简而言之就是商品卖出的数量超过了商品本身的库存数目。“超卖”会导致商家没有商品发货,发货的时间延长,从引起交易双方的纠纷。

海量数据的切分

背景

当今社会是一个信息大爆炸的社会,大家都在用各种应用软件,也因此产生了大量的数据,企业把这些数据当做宝贝,然而这些被视为宝贝的数据往往是我们技术人员的烦恼,这些海量的数据存储和访问成为了系统设计与使用的瓶颈,而这些数据往往存储在数据库中,然后传统的数据库又是存在不足的。单个数据库是存在性能瓶颈的,并且扩展起来十分困难,在当今这个大数据的时代,我们就必须要解决这样的问题。如果单机数据库易于扩展,数据可切分,就可以避免这些问题,但是当前的这些数据库厂商,包括开源的数据库MySQL在内,提供这些服务都是要收费的。所以我们一般转向第三方的软件,使用这些软件来给我们的数据做数据切分,将原本一台数据库上的数据,分散到多台数据库中,降低每一个单体数据库的负载。那么我们如何做数据切分呢?接下来,跟着老猫来看一下切分的方案。

什么是锁

从本篇开始,我们来好好梳理一下Java开发中的锁,通过一些具体简单的例子来描述清楚从Java单体锁到分布式锁的演化流程。本篇我们先来看看什么是锁,以下老猫会通过一些日常生活中的例子也说清楚锁的概念。

描述

锁在Java中是一个非常重要的概念,在当今的互联网时代,尤其在各种高并发的情况下,我们更加离不开锁。那么到底什么是锁呢?在计算机中,锁(lock)或者互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制。锁可以强制实施排他互斥、并发控制策略。举一个生活中的例子,大家都去超市买东西,如果我们带了包的话,要放到储物柜。我们再把这个例子极端一下,假如柜子只有一个,那么此时同时来了三个人A、B、C都要往这个柜子里放东西。那么这个场景就是一个多线程,多线程自然也就离不开锁。简单示意图如下

Redis进阶

Redis缓存过期处理以及内存淘汰机制

相信大家对照着之前Redis的操作集合进行了相关的练习。大家在之前的操作集合中应该注意到了这个操作指令(expire key time:给某个key值设置过期时间)大家都知道用完这个指令之后,当前的那个key值会在规定的时间内失效。然而当其真正失效之后,这个值真的会立刻在内存中消失么?答案是否定的。

总结和规划

一路走来

从毕业到现在已经5年多了,这一路磕磕碰碰走来,遇到了一些非常值得交往的人,遇到了挺多有趣的事情。

记得刚入职场时候,感觉就是一张白纸,拿着一个月3000多的薪水感觉很开心,因为终于自己也能赚钱了,不再需要依靠父母。那时候遇到了一群好基友,包括我耐心十足的师傅。师傅是我的leader,经常会布置一些任务到我们头上,而我,确是一群里面笨的那个,稍微有点搞不定的东西就开始问他,而他总是不厌其烦的告诉我解决的办法。记得当年做了一个项目,师傅、测试陪我加班到凌晨四点,因为我的bug总是改也改不完,准确地来说,写的都是bug。后来第一家公司离职后,原来的测试妹子就把我的QQ好友给删了,可见对我有多气。

Redis持久方式

聊到redis,给我们的第一印象就是快,因为是纯内存数据库。那么redis到底能否进行持久化呢?答案是肯定的,下面我们就来看一下redis的两种持久化的机制,并且比对一下两者的优缺点。

Keepalived概念与原理

为什么决定好好看一下keepalived?因为它重要呀。下面且听老猫慢慢道来,本节老猫决定用自己最俗的语言来讲清楚老猫对keepalived的理解。

Keepalived安装以及配置

keepalived的下载地址:https://www.keepalived.org/download.html

安装步骤

(1)将下载好的keepalived压缩文件上传搭到服务器,老猫放到了/home/software下面。

(2)解压操作(老猫当前用的这个版本大家也可以在留言区留言,老猫看到后会发到大家的邮箱)

1
tar -zxvf keepalived-2.0.18.tar.gz

(3)解压之后进入到解压之后的目录,看到configure,那么此时就可以做配置了,安装的步骤和nginx的安装步骤类似。
图1

(4) 使用configure命令安装目录与核心配置文件所在的位置。

1
2
3
4
5
./configure --prefix=/usr/local/keepalived --sysconf=/etc

说明:
prefix:keepalived的安装位置。
sysconf:Keepalived的核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错。

​ 安装过程中可能遇到的警告信息:

1
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

​ 如果遇到上述警告可以安装libnl/libnl-3

1
yum -y install libnl libnl-devel

​ 然后重复步骤(4)重新配置一下configure,此时配置OK

(5)安装keepalived:

1
make && make install

(6)进入到cd /etc/keepalived/,该目录下为keepalived的核心配置文件,如果忘记安装目录,那么此时可以通过如下命令即可找到:

1
whereis keepalived

配置

Redis操作集合

操作Redis的String数据类型

string字符串:redis最简单的字符串类型的键值对缓存,也是最基本的。

key相关:

1
2
keys * :查看所有的key值(不建议在生产使用,影响性能)
type key:查看key的类型
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×