Redis安装
-
Docker方式
#拉取 Redis 镜像 > docker pull redis #运行Redis 容器 > docker run --name myredis - d - p6379 : 6379 redis #执行容器中的 redis-cli, 命令行操作 > docker exec - it myredis redis- cli
-
压缩包安装
#安装C 语言的编译环境: > yum install centos-release-scl scl-utils-build > yum install -y devtoolset-8-toolchain > scl enable devtoolset-8 bash #测试gcc版本 > gcc --version gcc (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3) Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#下载redis-6.2.1.tar.gz #解压命令 > tar -zxvf redis-6.2.1.tar.gz #解压完成后进入目录:cd redis-6.2.1 #在redis-6.2.1目录下再次执行make命令 > make > make install
-
查看redis脚本
默认安装目录 /usr/local/bin
Redis 数据结构
- string 字符串
内部是一个字符数组。 - list 列表
相当于LinkedList,链表。 - hash 字典
相当于HashMap,Redis 的字典的值只能是字符串 - set 集合
相当于HashSet,内部键值对无序、唯一。 - zset 有序列表
类似SortedSet与HashMap的结合体,每个value有个socre,代表这个value的排序权重。
Redis分布式锁
SET
命令相关参数:
EX seconds
: 将键的过期时间设置为seconds
秒。 执行SET key value EX seconds
的效果等同于执行SETEX key seconds value
。PX milliseconds
: 将键的过期时间设置为milliseconds
毫秒。 执行SET key value PX milliseconds
的效果等同于执行PSETEX key milliseconds value
。NX
: 只在键不存在时, 才对键进行设置操作。 执行SET key value NX
的效果等同于执行SETNX key value
。XX
: 只在键已经存在时, 才对键进行设置操作。
-
实现
使用 set key value [EX seconds] [PX milliseconds] [NX|XX] 指令,只允许被一个客户端操作;
例如: setnx 与 expire组合的原子指令
set lock:write 1 ex 5 nx
当 锁 lock:write 不存在时加锁,过期时间5s
-
超时问题
线程执行任务时间较长,锁过期释放,被其他线程获取。
-
Java代码实现
// 若key不存在,则新建,并设置过期时间 Boolean setIfAbsent(K key, V value, long timeout, TimeUnit unit);