利用AOP思想实现简单数据缓存

说明:在查询用户信息时第一次查询数据来源于数据库,再次查询如果再从数据库中取数据那么性能就比较差,可以将第一次查到的数据放入缓存这样就很方便。

第一步:先自定义一个注解

/**
 * 注解?
 * 1)JDK1.5推出的一种元数据
 * 2)是java中的一种元数据(描述数据的数据)
 * 自定义注解:
 * @author Administrator
 * @Target 表示注解何时可以修饰哪些成员
 * @Retention 表示注解何时有效(一般我们自定义的注解设置为运行时生效)
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequiredCache {
	
}

第二步:将该注解添加到具体业务方法上。我此次添加到查询用户信息的方法。

	@RequiredCache
	@Override
	public PageObject<SysUserDeptResult> doFindPageObjects(String username,Integer pageCurrent) {
		System.out.println("From to database");
		//1.数据合法性验证
		if(pageCurrent==null||pageCurrent<=0)
		throw new ServiceException("参数不合法");
        //2.依据条件获取总记录数
		int rowCount=sysUserDao.getRowCount(username);
        if(rowCount==0)
		throw new ServiceException("记录不存在");
		//3.计算startIndex的值
		int pageSize=3;
		int startIndex=(pageCurrent-1)*pageSize;
		//4.依据条件获取当前页数据
		List<SysUserDeptResult> records=
			sysUserDao.findPageObjects(
		username, startIndex, pageSize);
		//5.封装数据
		PageObject<SysUserDeptResult> pageObject=
		PageUtils.newPageObject(rowCount,records, pageSize, pageCurrent);
		return pageObject;
	}
	
	@Override
	public int updateUserPwd(String password, String newPwd, String cfgPwd) {
		//1.对参数进行非空验证
		if(password==null || password.length()==0) {
			throw new IllegalArgumentException("请输入旧密码!");
		}
		if(newPwd==null || newPwd.length()==0) {
			throw new IllegalArgumentException("请输入新密码!");
		}
		if(cfgPwd==null || cfgPwd.length()==0) {
			throw new IllegalArgumentException("请确认新密码!");
		}
		//2.验证参数的合法性、
		//2.1判断两次输入的新密码是否一致
		if(!newPwd.equals(cfgPwd)) {
			throw new IllegalArgumentException("两次输入密码不一致!");
		}		
		//2.2判断旧密码是否跟登录密码一致
		//2.2.1 先获取用户的登陆身份通过shiro认证管理工具获得
		SysUser user = (SysUser) SecurityUtils.getSubject().getPrincipal();
		SimpleHash sh = new SimpleHash("MD5", password, user.getSalt());
		//sh.toHex()是将加密后的密码转换为16进制  
		if(!user.getPassword().equals(sh.toHex())) {
			throw new IllegalArgumentException("输入的旧密码不正确!");
		}
		//2.3判断新旧密码是否一致
			if(password.equals(newPwd)) {
				throw new IllegalArgumentException("新密码不能与旧密码相同!");
			}
		//3.更新密码
		String salt = UUID.randomUUID().toString();
		sh = new SimpleHash("MD5", newPwd, salt);
		int rows = sysUserDao.updateUserPwd(user.getUsername(), sh.toHex(), salt);
		
		return rows;
	}

第三步:AOP实现:首先定义一个缓存类,然后交给spring容器去管理,再声明它是需要织入具体功能的,即使用@Aspect修饰。缓存cache这里简单用了ConcurrentHashMap以后学了Redis再做修改吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Redisson可以很方便地实现数据缓存。Redisson是一个基于Redis的Java客户端,它提供了丰富的功能和API,包括分布式锁、分布式集合、分布式对象等。在使用Redisson实现数据缓存时,可以通过以下步骤进行操作: 1. 引入Redisson的依赖并配置Redis连接信息。 2. 创建RedissonClient对象,该对象是Redisson的核心组件,用于与Redis进行通信。 3. 使用Redisson提供的分布式锁功能,可以通过调用tryLock方法来加锁,该方法会返回一个布尔值表示是否成功获取到锁。在加锁时,可以设置锁的过期时间,以防止锁被长时间占用。 4. 在获取到锁之后,可以从缓存中读取数据。如果缓存中不存在所需的数据,可以从数据库或其他数据源中获取,并将数据存入缓存中。 5. 在数据更新或删除时,需要先获取到锁,然后进行相应的操作,并更新缓存。 6. 在操作完成后,需要释放锁,以便其他线程或进程可以获取到锁并进行操作。 通过以上步骤,可以利用Redisson实现数据缓存,并保证数据的一致性和并发安全性。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [分布式锁Redisson快速入门及利用AOP实现声明式缓存](https://blog.csdn.net/weixin_44743245/article/details/120805755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [redisson做分布式缓存(加锁方面)](https://blog.csdn.net/weixin_55034383/article/details/129333680)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值