我之前自己做了一个仿天猫的网站设计,有一次面试的时候就被问道:你的redis里面的key是怎么设置的,value里面的内容又是什么?因为时间隔了比较久,忘得差不多了,今天刚好回忆并总结一下,以防下次被问到。
当时我在service层的所有服务返回的数据都放在了redis缓存里面,比如查询所在的目录category,或者查询产品product信息,以及订单信息order,或者订单项信息orderitem等等。
那么这些不同数据的key和value的设计原则都很类似,我这里举几个例子。
1.给缓存添加分类
在我的项目里面,我把redis不同部分的数据进行了分类,比如category相关的数据都放在catrgory类别下,只需要在service层的开始,加上一个注释:@CacheConfig(cacheNames="categories")即可:
这样,关于catrgory的所有的key和value都在这个分类下,并且redis里面会创建一个sorted set类型的对象,key为categories~keys,里面所有的scores都是0,member是这个类别下的所有的key名称,这样下面执行@CacheEvict(allEntries=true),就只会删除这个类别下的所有key,别的类别下的key不会删除,比如categories~keys:
2、category缓存的key以及value的设置
【1】redis的key是自定义的,比如对于category这个service,list方法返回所有的category数据,他的key设置为:categories-all,这对应的是service层的这个函数:
这个函数返回的是list,里面放了很多的category的对象,因此为了保存这些对象,我设置了使用json将这些对象进行序列化来保存(至于如何让对象进行json序列化,只需要进行一下配置即可)。因此查看redis里面这个key的value的内容如下:
可以从上面看出来,这些变量的类是ArrayList,然后里面每个对象的类为pojo下面的Category类。这个Category类就是一个pojo,即对应着数据库里面的一个表,如果我们查看数据库里面的Category表的话,内容如下(只列出一部分):
可以看出来,83,平板是对应的,后面还有很多被挡住了。
【2】再比如如果单独查询某一个类别的所有信息,比如类别id为79的所有信息,那他的key设置为:categories-one-79。然后他的value就是这个category对象的json序列化字符串,如下,里面一开头表示这个里面的对象的类的权限定名:
对应的数据库的内容为:
他的对应的程序service层为:
【3】再比如category里面,有时候我们需要查询对应的分页信息,也就是第多少页里面包含的所有的类别信息,这里我设置的key就是:category -页偏移量 -页大小,代码如下:
3、product缓存的key以及value
如果查询某个产品,我们如果是通过类别来查询这个类别下的所有产品,他会返回一个List
redis里面的数据情况是:
如果是查询某个产品对应的信息,他返回的就是一个Product类变量,我设置的它对应的key为:products-one-产品id,代码如下:
此时redis里面的数据为:
对应的数据库内容为:
可以看出来,里面的id为148,cid为48,等等信息都是对应的。
因此,了解了上面关于redis里面的key和value是具体如何设置的,下次再被问道,就在也不用慌了!!