SpingAOP+redis实现缓存

Redis+自定义注解+AOP实现缓存 Redis+自定义注解+AOP实现缓存 闲着没事研究aop实现查询缓存,闷头敲代码,敲出了以下东西,希望看到的大神指正! 一、自定义注解 通过自定义注解,在修饰的方法上添加该注解,在aop中切入,为该方法添加缓存到redis中 package com.wwy.annotation; import java.lang.annotation.ElementType; import java.lang... 阅读详情

参考地址:点击打开链接

实现思路参考原文,以下是对原文案例代码的补充:

项目结构:

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<bean id="dao" class="dao.impl.UserDaoImpl"></bean>
	<bean id="service" class="service.impl.UserServiceImpl">
		<property name="dao" ref="dao"></property>
	</bean>
	<!-- 声明增强方法所在的Bean -->
	<bean id="theLogger" class="aop.UserServiceLogger"></bean>
	
	<!-- 开启注解扫描 -->
    <context:component-scan base-package="service,service.impl,dao"/>
    
    <!-- 开启aop注解方式,此步骤s不能少,这样java类中的aop注解才会生效 -->
    <aop:aspectj-autoproxy/>
    
    <aop:aspectj-autoproxy proxy-target-class="false" />
    
</beans>

UserDao

package dao;

import entity.User;

/**
 * 增加DAO接口,定义了所需的持久化方法
 */
public interface UserDao {
	public User select();
	public int update();
}


UserDaoImpl

package dao.impl;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;

import dao.UserDao;
import entity.User;

/**
 * 用户DAO类,实现IDao接口,负责User类的持久化操作
 */
public class UserDaoImpl implements UserDao {

	private Statement st = null;
	private Connection conn = null;
	private ResultSet rs = null;

	public Statement lianjie(Connection conn, Statement st) {
		try {
			// 这里并未实现完整的数据库操作,仅为说明问题
			String URL = "jdbc:mysql://127.0.0.1:3306/example?useUnicode=true&characterEncoding=utf-8";
			String USER = "root";
			String PASSWORD = "yuwen";
			// 1.加载驱动程序
			Class.forName("com.mysql.jdbc.Driver");
			// 2.获得数据库链接
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
			// 3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
			st = conn.createStatement();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return st;
	}

	public void close(Statement st, Connection conn, ResultSet rs) {
		try {
			if(null!=st){
				st.close();
			}
			if(null!=conn){
				conn.close();
			}
			if(null!=rs){
				rs.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public User select() {
		User u = null;
		try {

			rs = lianjie(conn, st).executeQuery("select * from user where uId=1");
			// 4.处理数据库的返回结果(使用ResultSet类)

			while (rs.next()) {
				u = new User();
				u.setUsername(rs.getString("uName"));
				u.setPassword(rs.getString("uPass"));
			}

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		close(st, conn, rs);
		return u;
	}

	@Override
	public int update() {
		try {

			lianjie(conn, st).execute("update user set uPass='456' where uId=1");


		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		close(st, conn, rs);
		return 1;
	}
}


UserService

package service;

import entity.User;
import zhujie.RedisCache;
import zhujie.RedisEvict;

/**
 * 用户业务接口,定义了所需的业务方法
 */
public interface UserService {
	@RedisCache(type = User.class)
	public User select();

	@RedisEvict(type = User.class)
	public int update();
}

UserServiceImpl

package service.impl;

import service.UserService;

import dao.UserDao;
import entity.User;

/**
 * 用户业务类,实现对User功能的业务管理
 */
public class UserServiceImpl implements UserService {

	// 声明接口类型的引用,和具体实现类解耦合
	private UserDao dao;

	// dao 属性的setter访问器,会被Spring调用,实现设值注入
	public void setDao(UserDao dao) {
		this.dao = dao;
	}

	public User select() {
		return dao.select();
	}

	@Override
	public int update() {
		// TODO Auto-generated method stub
		return dao.update();
	}
}

User

package entity;

/**
 * 用户实体类
 */
public class User implements java.io.Serializable {
	private Integer id; // 用户ID
	private String username; // 用户名
	private String password; // 密码
	private String email; // 电子邮件

	// getter & setter
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}

RedisCache

package zhujie;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface RedisCache {
    Class type();
}

RedisEvict

package zhujie;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RedisEvict {
    Class type();
}

UserServiceLogger

package aop;

import java.lang.reflect.Method;
import java.util.List;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;

import com.alibaba.fastjson.JSON;

import entity.User;
import redis.clients.jedis.Jedis;
import zhujie.RedisCache;
import zhujie.RedisEvict;

@Aspect
public class UserServiceLogger {

	public Jedis jed() {
		Jedis jedis = new Jedis("localhost");
		System.out.println("连接成功");
		return jedis;

	}

	public void close(Jedis jedis) {
		jedis.close();
	}

	@Around("execution(* service.impl..*.select*(..))")
	public Object around(ProceedingJoinPoint pjp) {
		try {
			// 连接本地的 Redis 服务
			Jedis jedis = jed();

			// 得到类名、方法名和参数
			String clazzName = pjp.getTarget().getClass().getName();
			String methodName = pjp.getSignature().getName();
			Object[] args = pjp.getArgs();
			// 根据类名,方法名和参数生成key
			String key = genKey(clazzName, methodName, args);
			// 得到被代理的方法
			Method me = ((MethodSignature) pjp.getSignature()).getMethod();
			// 得到被代理的方法上的注解
			Class modelType = me.getAnnotation(RedisCache.class).type();

			// 检查redis中是否有缓存
			String value = jedis.hget(User.class.getName(), key);
			System.out.println("value:" + value);
			// result是方法的最终返回结果
			Object result = null;
			if (null == value) {
				// 缓存未命中
				System.out.println("缓存未命中");

				// 调用数据库查询方法
				result = pjp.proceed(args);

				// 序列化查询结果
				String json = serialize(result);
				System.out.println("json:" + json);
				// 序列化结果放入缓存
				jedis.hset(User.class.getName(), key, json);
			} else {
				// 缓存命中
				System.out.println("缓存命中, value = " + value);
				// 得到被代理方法的返回值类型
				Class returnType = ((MethodSignature) pjp.getSignature()).getReturnType();
				// 反序列化从缓存中拿到的json
				result = deserialize(value, returnType, modelType);
			}
			close(jedis);
			return result;
		} catch (Throwable e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 在方法调用前清除缓存,然后调用业务方法
	 * 
	 * @param jp
	 * @return
	 * @throws Throwable
	 */
	@Around("execution(* service.impl..*.update*(..))")
	public Object evictCache(ProceedingJoinPoint jp) throws Throwable {
		// 得到被代理的方法
		Method me = ((MethodSignature) jp.getSignature()).getMethod();
		// 得到被代理的方法上的注解
		Class modelType = me.getAnnotation(RedisEvict.class).type();

		// if (infoLog.isDebugEnabled()) {
		// infoLog.debug("清空缓存:{}", modelType.getName());
		// }

		// 清除对应缓存
		// rt.delete(modelType.getName());
		System.out.println("开始删除缓存");
		Jedis jedis = jed();
		jedis.del(modelType.getName());
		System.out.println("删除缓存成功");
		return jp.proceed(jp.getArgs());
	}

	/**
	 * 根据类名、方法名和参数生成key
	 * 
	 * @param clazzName
	 * @param methodName
	 * @param args
	 *            方法参数
	 * @return
	 */
	protected String genKey(String clazzName, String methodName, Object[] args) {
		StringBuilder sb = new StringBuilder(clazzName);
		sb.append(methodName);

		for (Object obj : args) {
			sb.append(obj.toString());
		}
		return sb.toString();
	}

	/**
	 * 序列化
	 * 
	 * @param target
	 * @return
	 */
	protected String serialize(Object target) {
		return JSON.toJSONString(target);
	}

	/**
	 * 反序列化方法
	 * 
	 * @param jsonString
	 * @param clazz
	 * @param modelType
	 * @return
	 */
	protected Object deserialize(String jsonString, Class clazz, Class modelType) {
		// 序列化结果应该是List对象
		if (clazz.isAssignableFrom(List.class)) {
			return JSON.parseArray(jsonString, modelType);
		}
		// 序列化结果是普通对象
		return JSON.parseObject(jsonString, clazz);
	}
}


AopTest

package test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;
import entity.User;

public class AopTest {

	@Test
	public void aopTest() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserService service = (UserService) ctx.getBean("service");
		User user = new User();
		User lis = service.select();
		System.out.println(lis);

	}

	@Test
	public void aopTest2() {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserService service = (UserService) ctx.getBean("service");
		User user = new User();
		service.update();

	}

}



YOLOv13改进策略【Neck】| CVPR2024 LGAG:大核分组注意力门模块,3×3分组卷积与注意力协同的特征精准融合 本文记录的是利用LGAG 模块改进 YOLOv13 的颈部融合部分。(Large-kernel Grouped Attention Gate)通过3×3分组卷积与注意力机制结合,引导解码器处理特征与跳接特征的精准融合。本文利用模块,通过3×3分组卷积扩大感受野以捕捉更广泛局部空间上下文,同时结合注意力机制生成自适应注意力系数,对YOLOv13中关键目标特征赋予高激活值、抑制冗余背景特征,在特征融合阶段实现全局语义与局部细节的高效结合,减少计算成本的同时提升特征表达能力,增强模型对复杂场景下目标的检测精度与效 阅读详情

相关推荐

用Python写个彩票小助手:自动生成双色球/大乐透号码并保存到桌面

本文介绍如何使用Python开发一个智能彩票助手,实现双色球和大乐透号码的随机生成与桌面文件保存功能。通过详细的代码示例,包括随机号码生成、文件操作、用户交互和错误处理,帮助Python初学者快速掌握实用工具开发技巧。

weixin_42566121的博客 523

使用AOP技术通过自定义注解实现统一缓存

使用java做业务开发,缓存是必不可少的性能提升技术。如果把缓存的逻辑加入到业务代码中,有几个弊端:1)代码冗余。2)代码逻辑侵入性高,容易引入bug,3)不同的人代码风格不同,导致后期维护困难。有一种办法,在入口上增加缓存注解,接口在调用之前,自动获取缓存,没有缓存在走接口逻辑,这样就清晰多了,代码也干净多了,要实现上面的思路,需要有三部需要做。**第一步:写切面逻辑,创建一个切面文件,如下:**/**

weixin_48363639的博客 1070

显著性算法 + 伪彩变换

利用opencv得到显著图和伪彩图

正在挣扎中的人 2300

AOP+自定义注解+Redis实现分布式锁

AOP+自定义注解+Redis实现分布式锁

小学生波波 3516

SpringBoot 通过 JMS 集成 IBM MQ

IBM MQ 作为老牌的企业级消息中间件,虽然在当下云原生时代已不再是主流选择,但在金融、银行、保险等传统行业的核心业务系统中仍然占据着重要地位。这些行业对系统的稳定性、可靠性和事务一致性有着极高的要求,IBM MQ 正是在这些方面表现出色。尽管近年来 RabbitMQ、Apache Kafka 等新一代消息中间件在新兴项目中更受欢迎,但许多金融公司和大型企业仍在使用 IBM MQ 作为核心业务系统的消息传递基础设施。

小单的博客专栏 954

从Delta Delay到Timing Window:详解数字芯片后端时序差异的那些坑

本文深入剖析了数字芯片后端设计中,模块级与系统级时序分析结果不一致的核心原因。重点解释了Delta Delay如何导致模块级分析的乐观假设,以及Timing Window(时序窗口)差异如何通过影响串扰噪声计算,在顶层集成时引发新的时序违例,尤其是保持时间问题。文章为工程师提供了从约束建模到签核策略的系统性应对方案。

beer8的博客 500

AOP和注解实现自定义缓存

使用自定义注解和AOP实现添加缓存

qq_63612259的博客 413

【华为OD机试真题 2025C卷新题】855、识文断句 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷新题】855、识文断句 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为

KJ.JK 1852

分布式锁+AOP实现缓存

*** 元注解:简单理解就是修饰注解的注解* @Target:用于描述注解的使用范围,简单理解就是当前注解可以用在什么地方* @Retention:表示注解的生命周期* SOURCE:只存在类文件中,在class字节码不存在* CLASS:存在到字节码文件中* RUNTIME:运行时* @Inherited:表示被GmallCache修饰的类的子类会不会继承GmallCache* @Documented:表明这个注解应该被javadoc工具记录,因此可悲javadoc类的工具文档化。

冲出仁川,走出马德里,故事还会再继续 2084

前端Three.js面试题及参考答案

渲染循环(Render Loop)是 Three.js 中一个非常重要的概念,它是一个不断重复执行的过程,用于更新和渲染 3D 场景。在每次循环中,渲染循环会更新场景中的对象状态,如位置、旋转、缩放等,然后使用渲染器将更新后的场景渲染成 2D 图像显示在屏幕上。通过不断地重复这个过程,就可以实现动画效果。渲染循环的核心作用是确保场景能够实时更新,给用户带来流畅的视觉体验。如果没有渲染循环,场景将是静态的,不会有任何变化。只有通过不断地更新和渲染,才能让场景中的对象动起来,实现各种动画效果。

大模型大数据攻城狮的专栏 2723

匹配博弈双边选择算法

刚学图论匹配方面的一些知识,记录下来。

ymengm的博客 2435

AOP缓存实现

AOP AOP是一种设计思想,是软件设计领域中的的面向切面编程,它是对面向对象编程的一种补充和完善,可以在不修改源代码的情况下给程序动态统一添加额外功能的技术 项目中的非核心业务一般是通过特定方式切入到系统中,一般这种方式就是要借助AOP实现. 实现AOP的两种方式 (1) 如果目标对象实现了接口,底层可以采用JDK动态代理来为目标创建代理对象,目标类和代理类会实现共同接口(组合方式) (2) 如果目标对象没有实现接口name底层可以采用CGLIB代理机制为目标对象创建代理对象默认创建的代理类汇集成目标对象

weixin_47409774的博客 2478

巡检类机器人电池容量计算方法论(原理+算法+真实案例)

摘要:本文系统阐述了巡检机器人电池容量的计算方法,重点解析了;能量平衡;核心原理和三种主流算法。通过光伏电站履带式巡检机器人的真实案例,详细演示了从工况拆解、功耗采集到容量计算的完整流程。文章指出:室内轻载场景可采用静态平均功耗法,户外常规工况推荐动态负载积分法,而复杂环境需采用融合估算算法。特别强调需考虑温度修正(冬季容量衰减20%)、冗余系数(1.2-1.5)和放电深度(磷酸铁锂DoD取80%)等关键参数。

start_up_go的博客 243

基于AOP+Redis实现一个简单频控拦截器

文章目录前言一、定义注解二、Aspect三、使用示例总结 前言 为了实现频控,并且可插拔形式,那么AOP无疑是一个非常好的选择。 咱们这个Aspect实现依赖了redis 一、定义注解 今天咱们做一个简单的频控组件,可以实现某个接口针对某个用户某个时间段只能调用1次 注解如下: @Inherited @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface FrequencyC

liangsheng_g的专栏 1661

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

用AOP切片+Redis防接口幂等性重复提交

如何防止接口被重复提交?接口幂等性就是用户对同一操作发起的一次请求或多次请求的结果是一致的,不会因为对此提交而重复执行或出现其他问题。例:在支付的时候,如果用户以为没支付成功(实际成功了),再次点击按钮导致被扣了两次钱,这是无法接收的问题,所以这个给问题是一定要解决的。本文使用的是AOP切片来解决这个问题。再后端通过自定义注解,将这个注解作为切点,再在需要防幂等接口上添加注解,在执行方法之前在切片当中进行判断是否是重复提交。这样减少了和业务的耦合。

qq_64680177的博客 292

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

利用AOP实现一个简单的缓存存储、清除的工具

基本要求:利用aop实现一个简单的缓存存储、清除的工具,从实际使用上来说,切面应该在provider层。在service层方法调用和数据库查询之间生效。为了简化过程,不要求与数据库交互,数据可以随机生成,不要求使用redis等中间件,可以直接缓存到内存中。 代码实现非常的基础,能够很好的理解AOP以及缓存的基本原理,想要深入理解可以去查阅更多的资料。仅供自己学习。 1、实体类: public...

Eric的博客 2976

AOP+自定义注解+Redis实现分布式缓存(经典)

AOP+自定义注解+Redis实现分布式缓存

gb4215287的博客 753

AOP缓存的实现(day13)

1. AOP缓存的实现 1.1 自定义注解 在hcds-common下创建一个新的包,名字叫com.hc.annotation,作为自定义注解的包,注解名称命名为CacheFind package com.hc.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.

qq_35671247的博客 676

Spring Cache框架(AOP思想)+ Redis实现数据缓存

SpringCache结合AOP思想实现Redis数据缓存

qq_45607971的博客 2009

java-你还在用aop拦截帮你做缓存吗?

java-你还在用aop拦截帮你做缓存吗?

苦逼的老王的博客 541

使用Spring AOP横切的方式实现模拟缓存

Spring可以灵活的 aopAspect.xml &amp;amp;amp;amp;amp;amp;amp;lt;?xml version=&amp;amp;amp;amp;amp;amp;quot;1.0&amp;amp;amp;amp;amp;amp;quot; encoding=&amp;amp;amp;amp;amp;amp;quot;UTF-8&amp;amp;amp;amp;amp;amp;quot;?&amp;amp;amp;amp;amp;a

JieZai958921541的博客 709

使用SpringAOP+Caffeine+Redis实现本地缓存与多级缓存

*** 本地缓存// 过期时间 默认10分钟 long expired() default 600;// key创建器 String keyGenerator() default "org.springframework.cache.interceptor.KeyGenerator";/*** 本地缓存// 过期时间 默认10分钟 long expired() default 600;

秃了也弱了 1324

redis+aop实现接口防刷(幂等)

总之,幂等和接口防刷都是业务中常见的场景,redis,aop也是非常常用的技术栈,希望大家通过这个文章加深对业务、redis、springAOP的使用,后面考虑更ddd重构老项目,mq等,不过时间不一定,敬请期待。

zy11517的博客 1725

Redis缓存实战-使用Spring AOP和Redis实现Dao层查询缓存优化实战

redis缓存实战

weixin_52937170的博客 1295

CGB2005 JT-13(AOP回顾 Aop实现redis缓存 自定义注解,RDB/AOF持久化策略 LRU/LFU算法 ,缓存 击穿 雪崩,Redis分片,一致性hash算法)

1 AOP实现Redis缓存服务 1.1 现有代码的分析 说明: 1.虽然在业务层service中完成了代码的实现.但是该代码不具有复用性.如果换了其他的业务则需要重新编辑. 2.由于缓存的代码写在业务层service中,所以代码的耦合性高,不方便以后的扩展. 需求: 1.能否实现代码的复用. 2.能否降低代码的耦合性. 1.2 AOP 1.2.1 AOP作用 名称:面向切面编程. 一句话总结: 在不改变原有代码的条件下,对功能进行扩展. 公式: AOP = 切入点表达式 + 通知方法. 专业术语:

aa35434的博客 468

如何使用Redission实现分布式锁及幂等性?【AOP+工具类的两种解决方案】

本文介绍了一种基于AOP实现分布式锁的方案。通过自定义@ServiceLock注解和Redisson客户端,结合Spring AOP切面编程,实现了四种锁类型(可重入锁、公平锁、读锁、写锁)的分布式控制。方案包含锁键生成、锁管理缓存、切面优先级处理(确保锁在事务外层)等核心功能,并提供了注解式和编程式两种使用方式。通过锁工厂模式和策略模式,实现了锁类型的灵活扩展和加锁失败的自定义处理。该方案能有效解决分布式环境下的并发控制问题,适用于用户注册、订单处理等高并发场景。

记得开心一点嘛的博客 1381

Springboot整合AOP和redis

Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接 Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。

m0_70812512的博客 1249
上一篇: 重大事件!重大事件!重大事件!
下一篇: java注解详解和自定义注解
Yuwen_forJava
博客等级 码龄9年 28粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值