keycloak~缓存的使用
keycloak缓存的级别,往大了说有realm级的,一个realm是一个缓存,这也是它的生命周期;往小了说,也有user级的,即一个用户一个缓存,当a用户和b用户,它们的缓存是两个。
缓存提供者
InfinispanConnectionProvider
是一个接口,主要是对infinispan缓存的规定,有默认的实现DefaultInfinispanConnectionProvider
,它内包含了嵌入的infinispan缓存和远程的infinispan,分为两个独立的方法getCache和getRemoteCache,我们根据自己的情况而用。
缓存级别
- KEYS_CACHE_NAME key的字典缓存
- REALM_CACHE_NAME 域的数据缓存
- USER_CACHE_NAME 每个用户的缓存
缓存使用
下面是一个标准的缓存逻辑代码,功能是为域添加一个缓存,叫USER_IP_ADDRESS,存储ip的字典信息
public static List<GroupAttributeEntity> getIpFromCache(KeycloakSession session) {
InfinispanConnectionProvider provider = session.getProvider(InfinispanConnectionProvider.class);
// 注意:REALM_CACHE_NAME表示域级别的缓存,USER_CACHE_NAME是用户级别的,咱们这个使用域缓存即可
if (provider.getCache(REALM_CACHE_NAME) != null) {
if (!provider.getCache(REALM_CACHE_NAME).containsKey(USER_IP_ADDRESS)) {
provider.getCache(REALM_CACHE_NAME).put(USER_IP_ADDRESS, getIpListFromDb(session), 24, TimeUnit.HOURS);
}
List<GroupAttributeEntity> ipList = (List<GroupAttributeEntity>) provider.getCache(REALM_CACHE_NAME).get(USER_IP_ADDRESS);
return ipList;
}
return getIpListFromDb(session);
}
之前犯了一个很傻的错误,把REALM_CACHE_NAME写成了USER_CACHE_NAME,导致每个用户都存了一份IP字典,这完全是没有必要的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2016-10-28 大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)
2014-10-28 Nginx系列~负载均衡服务器与WWW服务器的实现
2014-10-28 Nginx系列~Nginx服务启动不了
2013-10-28 EF架构~为IEnumerable接口添加增删查等操作,原因是IEnumerable导航属性更放心
2013-10-28 EF架构~关系表插入应该写在事务里,但不应该是分布式事务
2011-10-28 MVC中ASCX分部视图的Action在哪里设置
2011-10-28 MVC LINQ中用封装的TSQL通用更新方法