zoukankan      html  css  js  c++  java
  • 简单的redis缓存操作(get、put)

    简单的redis缓存操作(get、put)

    本文介绍简单的redis缓存操作,包括引入jedisjar包、配置redis、RedisDao需要的一些工具、向redis中放数据(put)、从redis中取数据(get)、访问redis时的逻辑

    一、引入jedis jar包

    <!-- java访问redis的jar包jedis -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.7.3</version>
    </dependency>
    <!-- protostuff序列化依赖 -->
    <dependency>
        <groupId>com.dyuproject.protostuff</groupId>
        <artifactId>protostuff-core</artifactId>
        <version>1.0.8</version>
    </dependency>
    <dependency>
        <groupId>com.dyuproject.protostuff</groupId>
        <artifactId>protostuff-runtime</artifactId>
        <version>1.0.8</version>
    </dependency>

    注意为什么要引入序列化依赖jar包protostuff?

    1)从redis中取出的数据是序列化的,我们需要使用protostuff的反序列化操作,将序列化对象转化成我们的需要的对象

    2)向redis中放入数据时,我们需要先使用protostuff的序列化操作,将对象转化成序列化对象,才能放入redis

    二、在spring配置文件中注入redis,放入spring的ioc容器

    <!-- 注入redis dao -->
    <bean id="redisDao" class="org.demo.dao.cache.RedisDao">
      <constructor-arg index="0" value="localhost"></constructor-arg>
      <constructor-arg index="1" value="6379"></constructor-arg>
    </bean>

    注意:

    1)这里的RedisDao路径是我的包路径,注意你在配置的时候应使用你自己的路径

    2)这里使用本地的redis服务localhost

    3)redis服务的默认端口是6379

    三、RedisDao需要的一些工具

      //redis连接池
        private final JedisPool jedisPool;//根据对象的字节码文件,生成空对象
        private RuntimeSchema<Object> schema = RuntimeSchema.createFrom(Object.class);  //Object.class:获取对象的字节码
        
        public RedisDao(String ip, int port){
            jedisPool = new JedisPool(ip, port);
        }

    注意:

    1)RedisDao需要redis的连接池JedisPool,就好比JDBC的数据库连接池一样。我们在RedisDao的构造器中会初始化这个连接池

    2)我们需要一个可以根据对象的字节码文件生成空对象的工具 RuntimeSchema。你要使用什么对象,你就在Object的位置写入你的对象(Object.class:获取对象的字节码文件)

    3)连接池JedisPool的初始化需要两个参数:ip、port

    四、向redis中放数据(put)

        //将对象缓存到redis
        public String putObject(Object obj){
            //缓存逻辑:Object --> 序列化 --> byte[] --> 缓存到redis
            try {
                Jedis jedis = jedisPool.getResource();  //获取redis的连接对象,相当于JDBC的connection
                try{
                    String key = "Object:"+obj.getId();
                    //进行序列化
                    byte[] bytes = ProtostuffIOUtil.toByteArray(obj, schema, 
                            LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); //如果对象过大,会进行缓冲
                    //开始缓存
                    int timeout = 60*60; //设置超时时间 一小时,通过超时维护一致性
                    String result = jedis.setex(key.getBytes(), timeout, bytes);
                    return result;
                }finally{
                    jedis.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

    注意:

    1)缓存逻辑:Object --> 序列化操作 --> byte[] --> 写入redis。也就是先把对象序列化,再写入redis!

    2)我们在操作redis之前必须先拿到redis的连接对象,从连接池拿

    五、从redis中取数据(get)

        //从redis缓存中查询
        public Object getObject(long id){
            //redis操作逻辑
            try {
                Jedis jedis = jedisPool.getResource();   //缓存连接对象,相当于数据库连接对象connection
                try {
                    String key = "Object:"+id;
                    //实体对象并没有实现内部序列化操作
                    //缓存逻辑:getByte[] --> 反序列化 --> Object
                    byte[] bytes = jedis.get(key.getBytes()); //从jedis中获取目标对象的序列化对象数组
                    if(bytes != null){
                        //反序列化逻辑
                        Object obj = schema.newMessage();  //通过schema生成一个新的空对象
                        ProtostuffIOUtil.mergeFrom(bytes, obj, schema);  //进行反序列化操作
                        return obj;
                    }
                    
                } finally {
                    jedis.close();
                }
                 
            } catch (Exception e) {
            e.printStackTrace(); }
    return null; }

    注意:

    1)取数据逻辑:redis --> 得到byte[] --> 反序列化 --> Object

    2)我们在放数据的时候,是以键值对的形式:id --> obj。我们在取数据的时候,就是根据id来取的

    六、查询redis时的逻辑

    伪代码:

    get form redis_cache              //首先查询redis
    if null                           //如果没有
        get from db                   //再从数据库db查询
        if null                       //如果仍然没有
            return null               //那么返回空
        else                          //否则
            put into redis_cache      //现将数据放入redis
            return obj                //再放回数据
    else                              //如果从redis中查询到了
        return obj                    //那么直接返回数据
  • 相关阅读:
    C#与数据库访问技术总结(十一)之数据阅读器(DataReader)1
    C#与数据库访问技术总结(十)之添加&删除
    C#与数据库访问技术总结(九)之实例
    C#与数据库访问技术总结(八)之ExecuteNonQuery方法
    C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例
    C#与数据库访问技术总结(七)综合示例
    C#与数据库访问技术总结(五)之Command对象的常用方法
    OS——进程简答题(1)
    LAMP/LNMP 一键安装脚本
    运维如何延续自己的职业生涯--萧田国2017年GOPS深圳站演讲内容
  • 原文地址:https://www.cnblogs.com/javafucker/p/7559832.html
Copyright © 2011-2022 走看看