Redis中的Key结构
概述
在Redis中,没有类似关系型数据库中的表(Table)概念,因此我们需要通过特定的命名规范来区分不同类型的键(key)。为了避免键的冲突,我们可以使用层级结构来命名键,通过添加前缀来区分不同类型的数据。
Key的命名规范
Redis的键允许有多个单词形成层级结构,多个单词之间用冒号(:)隔开。推荐的格式如下:
项目名:业务名:类型:id
这个格式可以根据实际需求进行调整,但目的是为了使键的命名更加清晰和有组织。
示例
假设我们的项目名称叫 heima
,需要存储用户(user)和商品(product)信息。我们可以这样定义键:
- 用户相关的键:
heima:user:1
- 商品相关的键:
heima:product:1
这样,即使用户ID和商品ID相同,也不会发生冲突。
存储Java对象
如果需要存储Java对象,例如一个User对象,可以将对象序列化为JSON字符串后存储。例如:
KEY | VALUE |
---|---|
heima:user:1 | {"id":1, "name": "Jack", "age": 21} |
heima:product:1 | {"id":1, "name": "小米11", "price": 4999} |
Redis桌面客户端展示
在Redis的桌面客户端中,键的层级结构会以相同前缀作为层级展示,使数据看起来层次分明,关系清晰。
编程示例
Bash示例
以下是一些使用Redis命令行的Bash示例:
# 连接到Redis服务器
redis-cli
# 设置用户相关的键值对
SET heima:user:1 '{"id":1, "name": "Jack", "age": 21}'
# 设置商品相关的键值对
SET heima:product:1 '{"id":1, "name": "小米11", "price": 4999}'
# 获取用户相关的键值对
GET heima:user:1
# 获取商品相关的键值对
GET heima:product:1
Java示例
以下是一些使用Java和Jedis库的示例:
import redis.clients.jedis.Jedis;
import com.fasterxml.jackson.databind.ObjectMapper;
public class RedisKeyExample {
public static void main(String[] args) {
// 连接到Redis服务器
Jedis jedis = new Jedis("localhost");
ObjectMapper mapper = new ObjectMapper();
// 定义用户对象
User user = new User(1, "Jack", 21);
// 定义商品对象
Product product = new Product(1, "小米11", 4999);
try {
// 将用户对象序列化为JSON字符串并存储
jedis.set("heima:user:1", mapper.writeValueAsString(user));
// 将商品对象序列化为JSON字符串并存储
jedis.set("heima:product:1", mapper.writeValueAsString(product));
// 获取用户相关的键值对并反序列化为对象
String userJson = jedis.get("heima:user:1");
User userFromRedis = mapper.readValue(userJson, User.class);
System.out.println("User from Redis: " + userFromRedis);
// 获取商品相关的键值对并反序列化为对象
String productJson = jedis.get("heima:product:1");
Product productFromRedis = mapper.readValue(productJson, Product.class);
System.out.println("Product from Redis: " + productFromRedis);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接
jedis.close();
}
}
}
// 用户类
class User {
public int id;
public String name;
public int age;
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{id=" + id + ", name='" + name + "', age=" + age + "}";
}
}
// 商品类
class Product {
public int id;
public String name;
public int price;
public Product(int id, String name, int price) {
this.id = id;
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Product{id=" + id + ", name='" + name + "', price=" + price + "}";
}
}
结合材料说明
通过以上讲解和示例,我们详细介绍了Redis中键的命名规范及其使用方法。通过使用层级结构的键命名方式,我们可以有效地避免键的冲突问题,并且使数据在Redis桌面客户端中展示得更加清晰和有组织。