Redis是一种基于内存的高性能NoSQL数据库,它最常见的一种应用场景就是缓存。本文将首先演示Redis的安装过程,随后介绍一些Redis常用的数据结构及其对应的命令,最后将会基于Spring实现Redis的读写。
一、安装Redis
下面将简单介绍Linux、Mac与Docker安装Redis的过程,更详细的安装说明可以参见Redis安装官方页面。
(一)安装Redis
# Linux
sudo pacman -S redis # ArchLinux
sudo apt install redis # Debian / Ubuntu
# Mac
brew install redis
# Docker
docker run --name redis1 -dp 6379:6379 redis:latest
Windows系统可以通过
wsl
安装Linux版本的redis。Docker运行Redis可以参见Redos的DockerHub官方页面。
(二)验证Redis连通性
redis-cli # 连接本机redis服务
ping # 测试redis连通性
当控制台输出PONG
即代表Redis运行成功。
二、Redis常用数据结构
Redis的记录都是以Key-Value的形式储存,Key一般是String类型,Value则可以有多种数据结构,下文中的数据结构都是指Value的数据结构。
Redis命令参考官网页面罗列了Redis支持所有命令,最常用的几种数据结构有:String、Hash、List、Set、SortedSet。
(一)String
String是Redis中最常用的字符串类型。下面是一些String常用的命令:
更多stringt组的命令详见官方string页面。
命令 | 示例 | 说明 |
---|---|---|
SET | SET age 18 | 设置值。 |
GET | GET age | 获取值。 |
SETEX | SETEX age 1000 18 | 设置值,并设置一个过期时间。此命令与SET命令的EX参数效果相同。可是用TTL 命令查看剩余有效时间。 |
SETNX | SETNX age 19 | 设置值,当指定key存在时,返回0。此命令与SET命令的NX参数效果相同。可用于实现分布式锁。 |
INCR | INCR age | 值自增,仅当值的内容是数字时才有效。可用于实现分布式ID(全局唯一ID)。 |
(二)Hash
Hash是键值对元素的无序集合,可以理解为Java中的HashMap
。下面是一些Hash常用的命令:
更多hasht组的命令详见官方hash页面。
命令 | 示例 | 说明 |
---|---|---|
HSET | HSET student age 18 | 设置Hash中的值(其中,key标识了Hash本身,field则标识了键值对元素中的键,下同)。 |
HGET | HGET student age | 获取Hash中的值。 |
HGETALL | HGETALL student | 获取Hash中所有的键值对。 |
HKEYS | HKEYS student | 获取Hash中所有的键。 |
HVALS | HVALS student | 获取Hash中所有的值。 |
(三)List
List是有序的集合,可以理解为Java中的LinkedList
。下面是一些Hash常用的命令:
更多listt组的命令详见官方list页面。
命令 | 示例 | 说明 |
---|---|---|
LPUSH / RPUSH | LPUSH names zhangsan lisi | 插入元素。L向左,R向右,下同。 |
LPOP / RPOP | LPOP names | 弹出(获取并删除)元素。 |
BLPOP / BRPOP | BLPOP names | 阻塞弹出元素。 |
当PUSH和POP操作方向相同时,便是一个栈(先入后出)。
当PUSH和POP操作方向不同时,便是一个队列(先入先出)。
当PUSH和POP操作方向不同,并且出操作是BLPOP或BRPOP,便是一个阻塞队列。
(四)Set
Set是元素不可重复的无序集合,可以理解为Java中的HashSet
。下面是一些Set常用的命令:
更多set组的命令详见官方set页面。
命令 | 示例 | 说明 |
---|---|---|
SADD | SADD friends zhangsan lisi wangwu | 插入元素 |
SREM | SREM friends zhangsan | 移除元素 |
SISMEMBER | SISMEMBER friends zhangsan | 元素是否存在 |
SMEMBERS | SMEMBERS friends | 获取所有元素 |
SINTER / SDIFF / SUNION | SINTER friends1 friends2 | 交集/差集/并集 |
Set的交集、差集与并集操作可以用来实现好友关系管理。
(五)SortedSet
SortedSet是元素不可重复的有序集合,可以理解为Java中的TreeSet
。下面是一些SortedSet常用的命令:
更多sorted-set组的命令详见官方sorted-set页面。
命令 | 示例 | 说明 |
---|---|---|
ZADD | ZADD votes 10 zhangsan 20 lisi 30 wangwu | 插入元素 |
ZREM | ZREM votes zhangsan | 移除元素 |
ZSCORE | ZSCORE votes lisi | 获取score值 |
ZRANK | ZRANK votes wangwu | 获取排名 |
SortedSet在Set的基础增加了一个SCORE值用于排序,它一般用于对顺序有要求并且元素不能重复的场景,比如:排行榜。
三、Spring集成Redis
当前Redis官方推荐的Java客户端有:jedis
、lettuce
、redisson
等等。在Spring中spring-data-redis
组件可以快速集成redis,它依赖于lettuce
或jedis
。下面将基于spring-data-redis
组件介绍Spring集成Redis的过程。
首先,引入相关依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
</parent>
<dependencies>
<!-- Redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 测试相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
修改application.yml
配置文件:
spring:
data:
redis:
host: 127.0.0.1
port: 6379
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 0
max-wait: 100
引入测试类:
@SpringBootApplication
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
}
@SpringBootTest(classes = RedisApplication.class)
@RunWith(SpringRunner.class)
public class RedisTest {
@Autowired
StringRedisTemplate redisTemplate;
@Test
public void test() {
String CACHE_KEY = "age";
String CACHE_VALUE = "18";
redisTemplate.opsForValue().set(CACHE_KEY, CACHE_VALUE);
String result = redisTemplate.opsForValue().get(CACHE_KEY);
Assert.assertEquals(CACHE_VALUE, result);
}
}
上述测试用例以String数据结构为例,演示了Redis的读写操作。针对不同的数据结构,RedisTemplate有对应的opsXXX
命令,它们的对应关系如下:
RedisRedis数据结构 | RedisTemplate操作 |
---|---|
String | redisTemplate.opsForValue() |
Hash | redisTemplate.opsForHash() |
List | redisTemplate.opsForList() |
Set | redisTemplate.opsForSet() |
SortedSet | redisTemplate.opsForZSet() |
至此,Redis缓存的常用数据结构与基本用法已经介绍完了。后续将会进一步介绍Redis的缓存延迟与缓存失效,以及Redis的分布式缓存与多级缓存。
参考文档