每次进入后台时都需要加载各种菜单,鉴于如果每次请求数据库会大量消耗资源,所以打算用两种缓存方式解决:
1.session
2.文件缓存
注:kv数据库后期才会考虑
但是每个用户的权限不同,所以菜单也不同,所以如果用session的方式会导致分配菜单后不能及时显示,得退出重新登录方可,如果用文件方式,即可分配菜单时删除缓存文件,以上两种方式希望大家能讨论讨论,提供点思路谢谢!
每次进入后台时都需要加载各种菜单,鉴于如果每次请求数据库会大量消耗资源,所以打算用两种缓存方式解决:
1.session
2.文件缓存
注:kv数据库后期才会考虑
但是每个用户的权限不同,所以菜单也不同,所以如果用session的方式会导致分配菜单后不能及时显示,得退出重新登录方可,如果用文件方式,即可分配菜单时删除缓存文件,以上两种方式希望大家能讨论讨论,提供点思路谢谢!
我来帮助 @吃泡泡的鱼 理清一些概念吧,以及有很多人都是答非所问。
基础建议是多看看文档。
首先 PHP 默认的 session 就是文件存储的,可以看 http://php.net/manual/zh/sess... 这个配置。
那么本质上都是使用文件存储的,有快慢之分么 ?区别就在于session 是 PHP 实现了,你自己使用文件存储的逻辑是你自己实现的,只要你自己的实现不是太慢,有没什么差别。
// 以下观点,我只讨论效率问题,而不讨论是否合理问题
那么既然是说 session 默认使用文件,肯定可以使用其他的呗,完全使用 memcache 或者 redis 等等来存 session。那么这个时候的 session 存储肯定是比文件快的,同时这里也解决了多服务器的问题。
(夹带个人观点,kv 我知道,我只能说比 redis 和 memcache 来说,相对小众,不建议用)
所以
// 以下讨论合理性
不建议使用 session 存。
为什么呢,你一个用户的权限在一定时间内肯定是不会变的,这数据变动不大,如果你存session,那么每次登录都要重新计算一遍权限 ?那么还不如存文件,计算一次,永久读取,改了权限,就更新一下文件,或者简单粗暴删除文件。
那么存哪里呢。
单台服务器,使用文件缓存完全没问题,当然使用 redis 等完全可以,redis 更快。
多台服务器,使用 redis 等最好了,其实文件缓存也行,有个东西叫 rpc
有时候,效率高低比较 和 做法是否合理,是不同考虑的。基于你这个问题,你想把权限存起来,那么至少可以证明,计算权限 比 读取计算之后的权限要费时(比较拗口? 否则,每次都计算不就完了),我选择非 session 存储。
用户第一次进入 根据权限生成 一个该用户的菜单 保存到文件中 文件命名为该用户id(id.menu)
用户每次进入判断该文件是否存在 存在则读文件 不存在则请求数据库生成一个
就个人建议,更加建议使用缓存
ps: 文件缓存建议分层架构即,应用层表现为kv保存,菜单信息使用json这类的序列化方法作为v存在,底层使用文件储存的方式对应用层的kv数据进行保存
单纯从你提供的二种方案,推荐使用第一种方案,内存缓存肯定比文件缓存效率更高,文件缓存涉及到大量的磁盘io,不推荐使用。
在session存储用户菜单的时候,自己加一个过期时间,从session中获取用户菜单的时候,根据session中存储的过期时间判断下菜单是否过期,如果过期了,再从db中重新获取下菜单权限放到session中,这样处理后,分配菜单后显示可能不会那么的及时,但是用户不需要重新登录,也可以显示重新分配的菜单权限,只是稍微有点延迟。
如果想比较好的解决重新分配菜单不能及时显示问题,可以使用进程内的缓存,比如ehcache,或者进程外的独立缓存,比如redis。
当菜单重新分配后,更新下缓存中的权限数据即可。
如果用session的方式会导致分配菜单后不能及时显示,得退出重新登录方可,如果用文件方式,即可分配菜单时删除缓存文件
楼主说到分配权限不能及时更新的问题,其实与用文件缓存还是用session不是一回事。
因为session实现的功能其实也是“缓存”,只要是缓存,就会存在“不及时”的问题,同样,只要你重新分配权限后及时更新缓存,那么,权限分配也就不会有“不及时”的情况出现。
这种情况为什么不使用mysql加redis或者memcache来解决呢?第一次存数据库,读取的话去读缓存,如果没有就去读数据库同时保存缓存,修改的话改了数据库的同时也改缓存不是更好吗?session和文件都不如这个快
session可以存储在文件或者Redis等其他缓存系统
这个问题并不是考虑菜单存储问题,
而是考虑菜单是否全局存储并全局共享
通常做法是
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
2 回答793 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.3k 阅读
1 回答699 阅读✓ 已解决
最终选择了文件方式存储,感谢各位的回答