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;
            }
        }
    
    }
  • 相关阅读:
    vb.net FTP上传下载,目录操作
    vb.net导出CSV文件
    服务器内存总量
    定义数组
    监控键盘健代码
    C# FTp 上传,下载
    使用EasyUI中Tree
    微信web开发自定义分享
    mysql将时间戳格式化
    查询表时给字段赋默认值 sql
  • 原文地址:https://www.cnblogs.com/qingducx/p/5659441.html
Copyright © 2011-2022 走看看