簡單的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                    //那么直接返回數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM