一、介绍
redis是键值型的数据库,因此它的键要求唯一,因此大多数情况下我们都会以数据的id来作为key,形成唯一标识。
但是这里就会存在一个问题了:Redis没有类似MySQL中的Table的概念,没有表,所有数据都是存在一起的,那么我们该如何区分不同类型的key呢?
例如,需要存储用户、商品信息到redis,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key,那就会冲突了,该怎么办?
此时我们可以通过给key添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范:
Redis的key允许有多个单词形成层级结构,多个单词之间用 ':'(冒号)
隔开,例如我们可以这样,这个格式并非固定,但是推荐大家这样写,除非你们公司有固定key的格式。
例如我们的项目名称叫 heima
,有 user
和 product
两种不同类型的数据,我们可以这样定义key:
-
user相关的key:heima:user:1(代表id为1的用户信息)
-
product相关的key:heima:product:1
这样key就形成了一种层级关系,它们俩是一个项目的,只不过一个是 user
,一个是 product
。
现在key定义好了,那值是什么呢?我们知道用户也好,商品也好,在我们的项目中往往都是一个java类或者java对象,这样的对象该如何存储到值的位置呢?
上节将string类型的时候其实提到过,string是字符串,Java对象虽然不是字符串,但是它完全可以序列化成JSON的风格来存储。
例如一个User / Product对象,则可以将对象序列化为JSON字符串后存储:
KEY | VALUE |
---|---|
heima:user:1 | {“id”:1, “name”: “Jack”, “age”: 21} |
heima:product:1 | {“id”:1, “name”: “小米11”, “price”: 4999} |
二、代码实现
存入两个user,两个product。
PS:存入的时候JSON是一个字符串,需要加 ''
127.0.0.1:6379> set heima:user:1 '{"id":1, "name":"Jack", "age": 21}'
OK
127.0.0.1:6379> set heima:user:2 '{"id":2, "name":"Rose", "age": 18}'
OK
127.0.0.1:6379> set heima:product:1 '{"id":1, "name":"小米11", "price": 4999}'
OK
127.0.0.1:6379> set heima:product:2 '{"id":2, "name":"荣耀6", "price": 2999}'
OK
然后通过 keys *
来查看我们刚刚存入的数据,但是从这里并不能看见有什么特殊之处
但是在可视化界面中,redis会以层级结构来进行存储,形成类似于这样的结构,更加方便Redis获取数据
这样就避免了id相同时的冲突,并且让我们的数据分离,看起来比较优雅。
不仅仅是string类型可以将key按照这种方式设定,以后我们学的其他的数据类型,它的key都可以用这种方式去做成层级的模式