小胖我今天高高兴兴来上班,进入办公室看了看旁边漂亮的美工妹子以及已经是我老婆的前台妹子之后,一头扎进了自己的技术部办公室,忽然就看到老板在我的位置上坐着玩着手机,看到我进来后,看了看手表,说道:来的挺早的啊。当时我的心情是这样的:
随后我回应道:必须滴,老板好,公司是我家,工作为大家。
老板说道:最近多数客户说咱们的系统登录和删除角色的时候老down机
我:
其实是这样的。。。本来我前任用的是mysql进行存储权限,角色,用户关联角色, 角色关联权限的数据信息的。但是查询起来非常慢,原因:
-
没有做缓存,每次登陆和访问时都会查询数据库。
-
数据会有很多冗余,比如有一个用户拥有两个角色并且角色同时拥有多个一样的权限时,为了保证删除一个角色而不会丢失另一个角色也拥有的权限时,在给用户添加角色,会多次复制一样的权限关联数据。
当然以我的机智。必须改版啊。
后来我就加了一个步骤,哈哈,把数据缓存进了session,我当时是这样的感觉:
但是问题又出现了,由于有一个牛逼客户创建了100个角色,和100个用户。登陆的时候在进行权限加载的阶段会变得巨慢。
在震惊这位客户的无聊成都之余。。。。我决定彻底的改变权限结构。
于是我就用了redis进行所有的权限关系数据缓存
结构大概是这样的:
用户和权限表:
key:[用户id]ulp,value:(key:url,value:[角色Id1,角色Id2,角色Id3,角色Id4,])
//相当于map内套map
第一个key 是用用户id+“ulp”字符串组成,用于登录使用时快速查询一个用户的所有权限列表,
第一个value内部key是权限的url 这样在filter内直接可以获取url后去权限列表读,如果返回为null时则不存在改权限了。
第二个value 是该权限分别属于这个用户多个角色中那几个角色赋予的,这样在删除一个角色时如果有其他角色给于用户此权限,那么该权限还会存在,如果只有一个角色的话那么改权限会在权限列表中被删除。
这次又出现问题,以为多年的高级程序员经验觉着100%是因为:
我给老板说这个问题很难解决啊。还是上一任留下的麻烦。叫我思考一下。一会应该可以解决。
我默默地给客户远程打开了redis
我觉着这样下去我会疯的,于是乎又想彻底解决这个问题。
于是我就想呀,直接自己写一个专门的保存权限相关信息的数据存储机制好了。
然后从新设计了一下,这个是第一版:
马上开始编码,在编码过程中可能要修改的呀,不过我这么机智应该难不倒我。太晚了。睡觉吧。明天还要上班呢。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于