Redis五种常用数据类型

2376字

Redis 是一个开源的内存数据结构存储,可以用作数据库、缓存和消息中间件。与传统的关系型数据库不同,Redis 将数据存储在内存中,这使得它的读写速度非常快。它支持多种数据结构,这让它在处理各种场景时都非常灵活。

下面我们来深入了解 Redis 最常用的五种数据类型:

1. 字符串 (String)

Redis 中最基本的数据类型就是 字符串 (String)。它不仅仅能存储普通的文本字符串,还能存储二进制数据(比如图片、视频、序列化的 Java 对象),最大可以达到 512MB。

理解: 你可以把 Redis 的 String 类型想象成 Java 中的 String 类型,但它还能存储更广泛的数据。

常用场景:

  • 缓存: 存储用户的 Session 信息、热门文章的标题等。
  • 计数器: 记录网站的访问量、商品的点赞数等。
  • 简单键值对: 存储配置信息、用户信息等。

常用命令:

  • SET key value:设置键值对。
  • GET key:获取键的值。
  • INCR key:将键的值加 1(如果值为数字)。
  • DECR key:将键的值减 1。
  • EXPIRE key seconds:设置键的过期时间。

示例:

1
2
3
4
5
6
7
8
SET username "zhangsan"
GET username  // 返回 "zhangsan"

SET page_views 0
INCR page_views // 返回 1
INCR page_views // 返回 2

SET product:1001:name "MacBook Pro" EXPIRE 60 // 设置键值并使其在60秒后过期

2. 哈希 (Hash)

哈希 (Hash) 类型用于存储对象。它是一个键值对的集合,其中每个键都关联一个值。你可以把它理解为 Java 中的 HashMap<String, String>,在一个 Redis 的 key 下,又可以存储多个字段和值。

理解: 如果你需要在 Redis 中存储一个 Java 对象(比如用户信息),那么 Hash 类型是最好的选择。

常用场景:

  • 存储对象: 存储用户信息(姓名、年龄、邮箱等)、商品信息等。
  • 购物车: 存储用户购物车中的商品及其数量。

常用命令:

  • HSET key field value:设置哈希表中指定字段的值。
  • HGET key field:获取哈希表中指定字段的值。
  • HGETALL key:获取哈希表中所有字段和值。
  • HDEL key field1 [field2...]:删除哈希表中的一个或多个字段。

示例:

1
2
3
4
5
6
HSET user:1001 name "lisi" age 30 email "lisi@example.com"
HGET user:1001 name  // 返回 "lisi"
HGETALL user:1001 // 返回 name "lisi" age "30" email "lisi@example.com"

HSET product:laptop brand "Dell" model "XPS 15" price 12000
HGET product:laptop price // 返回 "12000"

3. 列表 (List)

列表 (List) 类型是一个有序的字符串集合,可以从列表的两端添加或删除元素。你可以把它想象成一个双向链表,或者 Java 中的 LinkedList

理解: List 非常适合用来实现队列、栈这样的数据结构。

常用场景:

  • 消息队列: 实现生产者-消费者模式。
  • 最新文章列表: 存储网站的最新发布的文章 ID。
  • 朋友圈时间线: 存储用户发布的朋友圈内容。

常用命令:

  • LPUSH key value1 [value2...]:将一个或多个值插入到列表的头部。

  • RPUSH key value1 [value2...]:将一个或多个值插入到列表的尾部。

  • LPOP key:移除并返回列表的第一个元素。

  • RPOP key:移除并返回列表的最后一个元素。

  • LRANGE key start stop:获取列表中指定范围内的元素。

  • LLEN key:获取列表的长度。

示例:

1
2
3
4
5
LPUSH mylist "apple" "banana" "orange"
LRANGE mylist 0 -1 // 返回 "orange", "banana", "apple" (从左到右)

RPUSH tasks "task1" "task2"
LPOP tasks // 返回 "task1" (模拟队列消费)

4. 集合 (Set)

集合 (Set) 类型是一个无序的字符串集合,每个元素都是唯一的,不允许重复。它类似于 Java 中的 HashSet

理解: Set 主要用于存储不重复的数据,并能进行集合间的运算(交集、并集、差集)。

常用场景:

  • 标签系统: 存储文章的标签。
  • 共同关注/共同好友: 计算两个用户之间的共同关注。
  • 抽奖活动: 存储参与抽奖的用户 ID,确保不重复。

常用命令:

  • SADD key member1 [member2...]:向集合中添加一个或多个成员。
  • SMEMBERS key:获取集合中的所有成员。
  • SISMEMBER key member:判断成员是否是集合的成员。
  • SREM key member1 [member2...]:移除集合中的一个或多个成员。
  • SINTER key1 [key2...]:返回给定所有集合的交集。
  • SUNION key1 [key2...]:返回给定所有集合的并集。
  • SDIFF key1 [key2...]:返回给定所有集合的差集。

示例:

1
2
3
4
5
6
SADD tags "Java" "Spring" "Redis"
SMEMBERS tags // 返回 "Java", "Spring", "Redis" (无序)

SADD user:1:friends "user2" "user3" "user4"
SADD user:2:friends "user3" "user4" "user5"
SINTER user:1:friends user:2:friends // 返回 "user3", "user4" (共同好友)

5. 有序集合 (Sorted Set / ZSet)

有序集合 (Sorted Set / ZSet) 类型和 Set 类似,也是字符串的集合,且每个元素都是唯一的。不同之处在于,有序集合的每个成员都会关联一个 分数 (score),Redis 会根据分数对集合中的成员进行排序。分数可以是小数。

理解: ZSet 可以看作是 Set 和 Hash 的结合,既保证元素的唯一性,又能根据分数进行排序。

常用场景:

  • 排行榜: 游戏积分排行榜、销售排行榜等。
  • 最新热点: 根据时间戳或热度分数排序。
  • 带有权重的任务队列: 根据任务的优先级进行处理。

常用命令:

  • ZADD key score member1 [score member2...]:向有序集合中添加一个或多个成员,或者更新已存在成员的分数。
  • ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合指定区间内的成员。
  • ZREVRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合中指定区间内的成员,分数从大到小。
  • ZSCORE key member:获取有序集合中指定成员的分数。
  • ZREM key member1 [member2...]:移除有序集合中的一个或多个成员。

示例:

1
2
3
4
5
6
ZADD leaderboard 95 "Alice" 88 "Bob" 92 "Charlie"
ZRANGE leaderboard 0 -1 WITHSCORES // 返回 "Bob" 88, "Charlie" 92, "Alice" 95 (分数从小到大)
ZREVRANGE leaderboard 0 1 WITHSCORES // 返回 "Alice" 95, "Charlie" 92 (分数从大到小,取前两名)

ZADD product:sales 1000 "iPhone" 800 "iPad" 1200 "MacBook"
ZREVRANGE product:sales 0 0 WITHSCORES // 返回 "MacBook" 1200 (销量最高的产品)

如何在 Spring Boot 中使用 Redis?

在 Spring Boot 中集成 Redis 非常方便,通常会使用 spring-boot-starter-data-redis 依赖。它提供了对 Jedis 或 Lettuce 客户端的自动配置。

1. 添加依赖:

pom.xml 中添加如下依赖:

XML

1
2
3
4
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 配置 Redis 连接:

application.propertiesapplication.yml 中配置 Redis 连接信息:

Properties

1
2
3
4
# application.properties
spring.data.redis.host=localhost
spring.data.redis.port=6379
# spring.data.redis.password=your_password (如果有密码的话)

3. 使用 RedisTemplateStringRedisTemplate

Spring Boot 会自动配置 RedisTemplateStringRedisTemplate。你可以直接在你的服务类中注入它们来操作 Redis。

  • RedisTemplate<K, V> 默认使用 JDK 序列化,可以操作各种 Java 对象。
  • StringRedisTemplate RedisTemplate 的子类,专门用于操作字符串类型,键和值都使用 StringRedisSerializer 进行序列化。

示例:

Java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate; // 用于操作字符串

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate; // 用于操作Java对象

    public void saveUser(String userId, String username) {
        stringRedisTemplate.opsForValue().set("user:" + userId + ":name", username);
    }

    public String getUserName(String userId) {
        return stringRedisTemplate.opsForValue().get("user:" + userId + ":name");
    }

    public void incrementPageViews(String articleId) {
        stringRedisTemplate.opsForValue().increment("article:" + articleId + ":views");
    }

    public void addUserToRanking(String username, double score) {
        redisTemplate.opsForZSet().add("game:ranking", username, score);
    }
}
如对内容有异议,请联系关邮箱2285786274@qq.com修改