使用Redis构建分布式锁

在软件开发中,锁是常见的一种业务处理方式,用途也很广泛。锁给我们提供了一种能够被多个线程访问的共享内存数据结构,在使用锁时,通常有着以下步骤“获取锁、然后执行操作、最后释放锁”。

最初的锁实现中,是提供给同一进程内的多个线程进行共享访问的,因为最初往往程序都是单机部署,而随着互联网技术的发展,分布式部署已成了主流,同一应用往往部署在多个不同的服务器中。

能让分布在不同服务器的进程同时访问的锁,称为分布式锁。分布式锁有多种实现方式,这里只介绍其中的一种:利用Redis实现分布式锁。

简易锁

大部分Redis用户对锁(lock)、加锁(locking)、锁超时(lock timeout)有所了解,但确不一定能够正确使用,都是因为未能正确考虑以下几种故障和异常情况:

  • 持有锁的进程因为操作时间过长而导致锁被自动释放,但进程本身并不知道,那么当该线程对锁进行释放时就有可能会将其他进程持有的锁进行释放;
  • 当前持有锁的进程在进行长时间操作时崩溃,导致锁未能正常释放,而其他想要获取锁的线程并不知道哪个线程持有锁,也无法知晓持有锁的线程已经崩溃,因此只能等待锁过期释放;
  • 当一个进程持有的锁过期后,多个线程同时尝试去获取锁,且都获取了锁;
  • 上述第一、第三种情况同时出现,导致多个线程获得了锁,而每个线程都以为自己是唯一获得锁的线程;

如今稍微好点硬件能够让Redis在服务器上每秒执行几十万次操作,虽说上述情况出现的几率较小,但在高负载时出现的几率会大大提高,因此需要编写能正确工作的锁。

- 阅读剩余部分 -

redis.conf部分配置项解析

在redis的根目录下我们看到有个redis.conf的文件,这就是redis启动的默认配置文件。之前使用src/redis-server启动后,使用info命令查看运行信息,发现config_file为空,实际上是默认使用该配置文件的。

接下来,我们来看看手动制定启动的配置文件:

src/redis-server redis.conf

- 阅读剩余部分 -

redis安装与使用

  • 安装
  • 启动/关闭
  • 运行信息查看
  • 客户端

0. 安装

以macOS/linux为例,安装redis其实很简单:

$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ make

上述方式是对redis源代码进行编译的。

- 阅读剩余部分 -

SQLServer SQL语句优化简介

在日常的工作中,或多或少会遇到一些较为复杂的SQL,当我们发现这些语句执行的慢时,总是会想办法对其修改,让它变得更快一些。本篇就来简单介绍下SQLSERVER下SQL的语句调优方法。

本文结构:

  • 语句的执行顺序
  • 优化思路
  • 使用索引
  • 写出简练的语句

- 阅读剩余部分 -

缓存设计的简单介绍

之前从一位大佬的文章中看到:缓存是提高性能最好的方式。从我个人的项目经历和所做的相关性能优化工作来看,对此深表认同。

对于业务系统而言最重要的就是数据,一般来说这种类似ERP的业务系统基本上都是使用关系型数据库,大部分的数据都是从数据库中取,属于磁盘IO,而缓存系统则都是放在内存中操作。一个是内存读写,一个是磁盘IO,效率自然是天壤之别。

本文从一下几个方面来介绍缓存系统的原理

  • 缓存的使用场景
  • 缓存设计的几种方式
  • 缓存设计的几个热点

- 阅读剩余部分 -