博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用户信息缓存策略
阅读量:6906 次
发布时间:2019-06-27

本文共 2249 字,大约阅读时间需要 7 分钟。

hot3.png

由于前端需要用户信息userInfo,后端各个模块,例如报表也需要用户信息,查询的频率很高,涉及到较多的联表。

而实际系统用户较小,数据基本不变,为各模块方便查询,决定采取缓存。

选择将其放到Redis数据库中,访问用户数据时,模块间得到解耦。

1. 函数

userInfo的部分字段可能来自于函数。

由于需要,在我拿到一个用户的时候,我同时需要得知他是属于哪个顶级组织的。

组织表如下:

orgId orgName parentOrgId
1 老板 null
2 组织一 1
3 组织二 1

首先,创建一个函数,根据orgId获取rootId

CREATE FUNCTION `queryRoot`(org varchar(32)) RETURNS varchar(32)BEGIN# 定义子节点、父节点DECLARE nodeId VARCHAR(32);DECLARE parentId VARCHAR(32);DECLARE rootId VARCHAR(32);# 赋值SET nodeId = org;SET parentId = '$';WHILE parentId IS NOT NULL DO	SELECT parentOrgId INTO parentId FROM T_ORG WHERE ORG_ID = nodeId;	SET rootId = nodeId;	SET nodeId = parentId;END WHILE;RETURN rootId;END;

2. 视图

SELECT	`users`.`USER_ID` AS `userId`,	`users`.`ORG_ID` AS `orgId`,	(		SELECT			`queryRootByOrgId` (`users`.`ORG_ID`)	) AS `rootOrgId`,	`orgs`.`ORG_NAME` AS `orgName`,	`users`.`USER_NAME` AS `userName`FROM	(		`T_USERS` `users`		JOIN `T_ORG` `orgs` ON (			(				`users`.`ORG_ID` = `orgs`.`ORG_ID`			)		)	)

3. 定时更新到Redis

其中用到了反射,将属性及值存到Hash里面。

@EnableScheduling@Componentpublic class RedisTask {    @Autowired    private StringRedisTemplate redis;    @Autowired    private UserInfoRepository userInfoRepository;    static Field[] fields;    static {        fields = UserInfo.class.getDeclaredFields();        for (Field field : fields)            field.setAccessible(true);    }    /**     * 定时 3min 查询数据库,然后更新到 redis 中     */    @Scheduled(fixedRate = 3*60*1000)    private void userInfo() {        List
list = userInfoRepository.findAll(); list.forEach(user -> { Map
map = new HashMap(); String hashKey, hashValue, hash = user.getUserId(); for (Field field : fields) { try { hashKey = field.getName(); if (field.get(user) != null) hashValue = field.get(user).toString(); else hashValue = ""; map.put(hashKey, hashValue); } catch (Exception e) { System.out.println("反射异常"); e.printStackTrace(); } } redis.opsForHash().putAll(hash, map); }); }}

转载于:https://my.oschina.net/u/3035165/blog/1649469

你可能感兴趣的文章
gcc版本升级
查看>>
个人愚见: React 和 Vue 区别
查看>>
深入理解Docker架构与实现
查看>>
「译」代码优化策略 — Idle Until Urgent
查看>>
机器学习项目失败的9个原因,你中招了吗?
查看>>
前端:单页面应用和多页面应用
查看>>
使用iview的Table组件实现合并列demo
查看>>
【LeetCode】26. 删除排序数组中的重复项
查看>>
Spring Boot 参考指南(使用JTA分布式事务)
查看>>
Express 项目结构最佳实践(下)
查看>>
前端面试之JavaScript(总结)
查看>>
字符串匹配模式问题
查看>>
【勘误】第三章基本变量
查看>>
iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码
查看>>
ABAP和Java的destination和JNDI
查看>>
vue-router 3.0版本中 router.push 不能刷新页面的问题
查看>>
C++入门教程(3):语句和缩进
查看>>
菜鸟入门【ASP.NET Core】11:应用Jwtbearer Authentication、生成jwt token
查看>>
RedMonk 2018年6月编程语言排行:Objective-C 升至第九
查看>>
2016全域大数据应用论坛11位嘉宾核心观点
查看>>