1. 程式人生 > >redis序列化對象操作

redis序列化對象操作

com sql iss stat nts 字符 project esc sage

在項目開發過程中,一些經常用到但又基本不變的對象信息我們可以把它緩存起來,這樣可以減少我們操作msql等數據庫的時間

緩存對象信息最常用的有兩種,一種是將對象信息轉成json形式的字符串緩存起來,另一種將對象系列化緩存起來

redis緩存byte數據時無論是在時間開銷還是內存開銷上都比緩存string數據有優勢,所以相較於第一種,第二種緩存方式更憂一點

下面以緩存用戶信息user為例進行操作

user對象信息:

package com.study.model;

public class User {

    private Integer id;
    
    private String name;
    
    
private Integer age; public User() { super(); } public User(Integer id, String name, Integer age) { super(); this.id = id; this.name = name; this.age = age; } public Integer getId() { return id; } public void setId(Integer id) {
this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public
String toString() { return "User {id:" + id + ", name:" + name + ", age:" + age + "}"; } }

對user進行系列化存儲代碼:

package com.study.util;

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
import com.study.model.User;

import redis.clients.jedis.Jedis;

public class RedisSerializable {
    
    private static RuntimeSchema<User> schema = RuntimeSchema.createFrom(User.class);

    public static void main(String[] args) {
        
        User user = new User(1,"張三",18);
        int timeout = 5*60;
        //將user對象存入redis
        String result = putUser(user,timeout);
        System.out.println("返回結果:" + result);
        
        User user1 = getUser(1);
        System.out.println(user1.toString());
    }
    
    public static String putUser(User user,int timeout) {
        String result = "";
        try {
            Jedis jedis = RedisUtil.getJedis();
            try {
                String key = "user:" + user.getId();
                byte[] bytes = ProtostuffIOUtil.toByteArray(user, schema, 
                        LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
                result = jedis.setex(key.getBytes(), timeout, bytes);
                return result;
            }finally {
                jedis.close();
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    
    public static User getUser(int id) {
        try {
            Jedis jedis = RedisUtil.getJedis();
            try {
                String key = "user:"+id;
                byte[] bytes = jedis.get(key.getBytes());
                if(bytes != null && bytes.length>0) {
                    User user = schema.newMessage();
                    ProtostuffIOUtil.mergeFrom(bytes, user, schema);
                    
                    return user;
                }
            }finally {
                jedis.close();
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
}

代碼git地址:https://gitee.com/sjcq/redis.git

redis序列化對象操作