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页面。

命令示例说明
SETSET age 18设置值。
GETGET age获取值。
SETEXSETEX age 1000 18设置值,并设置一个过期时间。此命令与SET命令的EX参数效果相同。可是用TTL命令查看剩余有效时间。
SETNXSETNX age 19设置值,当指定key存在时,返回0。此命令与SET命令的NX参数效果相同。可用于实现分布式锁
INCRINCR age值自增,仅当值的内容是数字时才有效。可用于实现分布式ID(全局唯一ID)

(二)Hash

Hash是键值对元素的无序集合,可以理解为Java中的HashMap。下面是一些Hash常用的命令:

更多hasht组的命令详见官方hash页面。

命令示例说明
HSETHSET student age 18设置Hash中的值(其中,key标识了Hash本身,field则标识了键值对元素中的键,下同)。
HGETHGET student age获取Hash中的值。
HGETALLHGETALL student获取Hash中所有的键值对。
HKEYSHKEYS student获取Hash中所有的键。
HVALSHVALS student获取Hash中所有的值。

(三)List

List是有序的集合,可以理解为Java中的LinkedList。下面是一些Hash常用的命令:

更多listt组的命令详见官方list页面。

命令示例说明
LPUSH / RPUSHLPUSH names zhangsan lisi插入元素。L向左,R向右,下同。
LPOP / RPOPLPOP names弹出(获取并删除)元素。
BLPOP / BRPOPBLPOP names阻塞弹出元素。

当PUSH和POP操作方向相同时,便是一个栈(先入后出)。

当PUSH和POP操作方向不同时,便是一个队列(先入先出)。

当PUSH和POP操作方向不同,并且出操作是BLPOP或BRPOP,便是一个阻塞队列。

(四)Set

Set是元素不可重复的无序集合,可以理解为Java中的HashSet。下面是一些Set常用的命令:

更多set组的命令详见官方set页面。

命令示例说明
SADDSADD friends zhangsan lisi wangwu插入元素
SREMSREM friends zhangsan移除元素
SISMEMBERSISMEMBER friends zhangsan元素是否存在
SMEMBERSSMEMBERS friends获取所有元素
SINTER / SDIFF / SUNIONSINTER friends1 friends2交集/差集/并集

Set的交集、差集与并集操作可以用来实现好友关系管理。

(五)SortedSet

SortedSet是元素不可重复的有序集合,可以理解为Java中的TreeSet。下面是一些SortedSet常用的命令:

更多sorted-set组的命令详见官方sorted-set页面。

命令示例说明
ZADDZADD votes 10 zhangsan 20 lisi 30 wangwu插入元素
ZREMZREM votes zhangsan移除元素
ZSCOREZSCORE votes lisi获取score值
ZRANKZRANK votes wangwu获取排名

SortedSet在Set的基础增加了一个SCORE值用于排序,它一般用于对顺序有要求并且元素不能重复的场景,比如:排行榜。

三、Spring集成Redis

当前Redis官方推荐的Java客户端有:jedislettuceredisson等等。在Spring中spring-data-redis组件可以快速集成redis,它依赖于lettucejedis。下面将基于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操作
StringredisTemplate.opsForValue()
HashredisTemplate.opsForHash()
ListredisTemplate.opsForList()
SetredisTemplate.opsForSet()
SortedSetredisTemplate.opsForZSet()

至此,Redis缓存的常用数据结构与基本用法已经介绍完了。后续将会进一步介绍Redis的缓存延迟与缓存失效,以及Redis的分布式缓存与多级缓存。

参考文档

  1. Redis官方网站
  2. 黑马程序员Redis入门到实战教程