zoukankan      html  css  js  c++  java
  • spring-data-redis 自定义缓存(@annotation+lua+aop)(一)

    介绍:使用spring-data-redis 框架 ,利用@annotation和redis lua,spring aop 实现数据的 save、list、update、delete对缓存的影响操作(考虑增加异步数据)

      save:数据库数据添加、缓存数据添加、list后的缓存数据添加

      list:缓存数据增加

      update:数据库数据更新、缓存数据更新、list后的缓存数据更新

      delete:数据库数据删除、缓存数据删除、list后的缓存数据删除

    各种包的引用和自定义序列化:

      spring-data-redis实现了几种序列化机制 如StringRedisSerializer,GenericJackson2JsonRedisSerializer,JdkSerializationRedisSerializer等等。

      但我们也许需要一种更短,更快,的序列化方式。kryo、msgpack、protobuf都是不错的选择他们各有优势也各有特点。个人感觉protobuf需要一个原有的类才可以被序列化和反序列化本人不是特别会用试了下感觉无法使RedisSerializer保持单例了,而kryo和msgpack却不用而且性能也不错,redis lua 也集成了msgpack。所以这里我选用了msgpack作为自定义的序列化。

    以下是我的pom.xml

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.7.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.8.3</version>
        </dependency>
        <dependency>
            <groupId>com.esotericsoftware.kryo</groupId>
            <artifactId>kryo</artifactId>
            <version>2.24.0</version>
        </dependency>
        <dependency>
            <groupId>org.msgpack</groupId>
            <artifactId>msgpack</artifactId>
            <version>0.6.12</version>
        </dependency>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>2.5.0</version>
        </dependency>
    </dependencies>

    这里使用了一个池来创建msgPack

    public class MsgPackRedisSerializer<T> implements RedisSerializer<T> {
    
        private MessagePack msgPack;
    
        private GenericObjectPool<MessagePack> pool;
    
        public void setPool(GenericObjectPool<MessagePack> pool) {
            this.pool = pool;
        }
    
        public byte[] serialize(T t) throws SerializationException {
            if(t==null)
                return new byte[0];
            try {
                msgPack = pool.borrowObject();
            } catch (Exception e1) {
                msgPack = new MessagePack();
            }
            try {
                return msgPack.write(t);
            } catch (IOException e) {
                e.printStackTrace();
                return new byte[0];
            }
        }
    
        public T deserialize(byte[] bytes) throws SerializationException {
            try {
                msgPack = pool.borrowObject();
            } catch (Exception e1) {
                msgPack = new MessagePack();
            }
            try {
                T t = (T)msgPack.read(bytes);
                pool.returnObject(msgPack);
                return t;
            } catch (IOException e) {
                e.printStackTrace();
                pool.returnObject(msgPack);
                return null;
            }
        }
    
    }
  • 相关阅读:
    关于ArcGis for javascrept查询ArcGis server图层信息的方式
    Elasticsearch教程之基础概念
    C# 将日期转换成中文格式
    .Net 自定义Excel模板导出数据
    JavaScript判断浏览器类型
    简单的json传送数据
    Oracle替换临时表空间
    Python多线程循环
    crontab执行不生效-【问题篇】
    Python将MySQL表数据写入excel
  • 原文地址:https://www.cnblogs.com/qingducx/p/5659441.html
Copyright © 2011-2022 走看看