• 17_10_24 Redis 实例


    一,下载Redis,并打开

    二,ssm中

    poml.xml中:
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>1.6.2.RELEASE</version>
    </dependency>
    <!-- redis客户端jar -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.8.0</version>
    </dependency>
    <!-- 字节码操作包,用于动态生成代理类之类的操作,用于序列化和反序列化 -->
    <dependency>
    	<groupId>cglib</groupId>
    	<artifactId>cglib</artifactId>
    	<version>2.2</version>
    </dependency>
    <!-- aop注解 -->
    <dependency>
    	<groupId>org.aspectj</groupId>
    	<artifactId>aspectjrt</artifactId>
    <version>1.6.12</version>
    </dependency>
    <dependency>
    	<groupId>org.aspectj</groupId>
    	<artifactId>aspectjweaver</artifactId>
    	<version>1.6.12</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-aop</artifactId>
    	<version>4.3.9.RELEASE</version>
    </dependency>
    
    mybatis-spring.xml中:
    <!-- redis数据源 -->
    	<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    		<property name="maxIdle" value="${redis.maxIdle}" />
    		<property name="maxTotal" value="${redis.maxActive}" />
    		<property name="maxWaitMillis" value="${redis.maxWait}" />
    		<property name="testOnBorrow" value="${redis.testOnBorrow}" />
    	</bean>
    
    	<!-- redis连接池 -->
    	<bean class="redis.clients.jedis.JedisPool" destroy-method="close">
    		<constructor-arg name="poolConfig" ref="poolConfig" />
    		<constructor-arg name="host" value="${redis.host}" />
    		<constructor-arg name="port" value="${redis.port}" />
    	</bean>
    	<!-- Spring-redis连接池管理工厂 -->
    	<bean
    		class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    		<property name="hostName" value="${redis.host}"></property>
    		<property name="port" value="${redis.port}"></property>
    		<property name="password" value="${redis.pass}"></property>
    		<property name="poolConfig" ref="poolConfig"></property>
    	</bean>
    
    	<bean id="t" class="cm.duu.aop.T">
    	</bean>
    	<!-- Spring Aop 配置 get* 配置环绕 -->
    	<aop:config>
    		<!-- 面 -->
    		<aop:aspect ref="t">
    			<!-- 点 -->
    			<aop:around method="doAround"
    				pointcut="execution(* cm.duu.service.*.query*(..))" />
    				<aop:after method="doafter" pointcut="execution(* cm.duu.service.*.add*(..))"/>
    		</aop:aspect>
    	</aop:config>
    
    实体类:
    package cm.duu.aop;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    
    import cm.duu.util.SerializeUtil;
    import redis.clients.jedis.Jedis;
    
    public class T {
    	@Autowired
    	private JedisConnectionFactory jedisConnectionFactory;
    
    	// 包名+ 类名 + 方法名 + 参数(多个) 生成Key
    	public static String getRedisKey(ProceedingJoinPoint pjp) {
    		StringBuilder key = new StringBuilder();
    		String packageAndClassName = pjp.getTarget().getClass().getName();
    		key.append(packageAndClassName);
    		String methodName = pjp.getSignature().getName();
    		key.append(".").append(methodName);
    		Object[] args = pjp.getArgs();
    		for (Object arg : args) {
    			key.append(".").append(arg);
    		}
    		return key.toString();
    	}
    
    	public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
    
    		Jedis jedis = jedisConnectionFactory.getConnection().getNativeConnection();
    		String queryKey = getRedisKey(pjp);
    		byte[] queryFromRedis = jedis.get(queryKey.getBytes());
    		System.out.println("我们认为应该出现map" + queryFromRedis);
    		if (queryFromRedis != null) {
    			System.out.println("redis里面有数据");
    			return SerializeUtil.unserizlize(queryFromRedis);
    		} else {
    			System.out.println("redis里面没有有数据!!!!!");
    			Object queryDataFromMysql = pjp.proceed();
    			jedis.set(queryKey.getBytes(), SerializeUtil.serialize(queryDataFromMysql));
    			return queryDataFromMysql;
    		}
    	}
    	
    	public void doafter(){
    		Jedis jedis = jedisConnectionFactory.getConnection().getNativeConnection();
    		jedis.flushAll();
    	}
    
    }
    
    工具类:因为redis在存储或者获取对象的时候,必须转化序列才能转化,如:Map<String,List<Student>>这样比较复杂的情况的存储
    package cm.duu.util;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    public class SerializeUtil {
    
    	// 序列化
    	public static byte[] serialize(Object obj) throws IOException {
    		ByteArrayOutputStream bai = new ByteArrayOutputStream();
    		ObjectOutputStream obi = new ObjectOutputStream(bai);
    		obi.writeObject(obj);
    		byte[] byt = bai.toByteArray();
    		return byt;
    	}
    
    	// 反序列化
    	public static Object unserizlize(byte[] byt) throws IOException, ClassNotFoundException {
    		ByteArrayInputStream bis = new ByteArrayInputStream(byt);
    		ObjectInputStream oii = new ObjectInputStream(bis);
    		Object obj = oii.readObject();
    		return obj;
    	}
    
    }
    
    

    Jedis流程

    如下:

  • 相关阅读:
    SQL横表纵表转换和对比
    计算机书籍
    附加原型链
    Object.create()
    解构赋值是浅拷贝
    Object.keys(xxx)与Object.getOwnPropertyNames(xxx)
    剑指 Offer 45. 把数组排成最小的数
    剑指 Offer 46. 把数字翻译成字符串
    剑指 Offer 43. 1~n 整数中 1 出现的次数
    剑指 Offer 41. 数据流中的中位数
  • 原文地址:https://www.cnblogs.com/du1991/p/7722126.html
Copyright © 2020-2023  润新知