1. 程式人生 > >用java在redis中儲存物件

用java在redis中儲存物件

最近需要封裝一個操作redis的工具類,不知道怎麼向redis中儲存物件,想到過用java反射去做。在網上搜索了一下,發現可以用序列化物件的方式去儲存。再此我整理了一下

感謝,殘劍_提供的方法:http://www.cnblogs.com/liuling/p/2014-4-19-04.html(redis基礎操作)

感謝,蕭劍90提供的方法:http://blog.csdn.net/abc19900828/article/details/40373549(redis儲存物件)

以下是我借鑑之後整理的程式碼,簡單封裝。

一、redis連線池

RedisConnectionPool
package dao.redisUtil;

import 
redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class RedisConnectionPool { //Redis伺服器IP private static String IP = "localhost"; //Redis的埠號 private static int PORT = 6379; //訪問密碼 // private static String AUTH = "admin";
//可用連線例項的最大數目,預設值為8; //如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis例項,則此時pool的狀態為exhausted(耗盡)。 private static int MAX_ACTIVE = 1024; //控制一個pool最多有多少個狀態為idle(空閒的)的jedis例項,預設值也是8。 private static int MAX_IDLE = 200; //等待可用連線的最大時間,單位毫秒,預設值為-1,表示永不超時。如果超過等待時間,則直接丟擲JedisConnectionException; private static int
MAX_WAIT = 10000; private static int TIMEOUT = 10000; //在borrow一個jedis例項時,是否提前進行validate操作;如果為true,則得到的jedis例項均是可用的; private static boolean TEST_ON_BORROW = true; private static JedisPool jedisPool = null; /** * 初始化Redis連線池 */ static { try { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxActive(MAX_ACTIVE); config.setMaxIdle(MAX_IDLE); config.setMaxWait(MAX_WAIT); config.setTestOnBorrow(TEST_ON_BORROW); jedisPool = new JedisPool(config, IP, PORT, TIMEOUT); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取Jedis例項 * @return */ public synchronized static Jedis getJedis() { try { if (jedisPool != null) { Jedis resource = jedisPool.getResource(); return resource; } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } /** * 釋放jedis資源 * @param jedis */ public static void returnResource(final Jedis jedis) { if (jedis != null) { jedisPool.returnResource(jedis); } } }

二、序列化物件方法

SerializeUtil
package dao.redisUtil;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * @author Administrator
 * 序列化物件工具類
 */
public class SerializeUtil {
    public static byte[] serialize(Object object) {
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        try {
            // 序列化
baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
            oos.writeObject(object);
            byte[] bytes = baos.toByteArray();
            return bytes;
        } catch (Exception e) {

        }
        return null;
    }

    public static Object unserialize( byte[] bytes) {
        ByteArrayInputStream bais = null;
        try {
            // 反序列化
bais = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            return ois.readObject();
        } catch (Exception e) {

        }
        return null;
    }
}

三、封裝redis增刪改查基礎操作

RedisOperation
package dao.redisUtil;


import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 實現redis操作
 */
public class RedisOperation{
    //獲取redis操作例項
private Jedis jedis=RedisConnectionPool.getJedis();

    public String set(String key, HashMap<String,String> map) {
        return jedis.hmset(key,map);
    }

    public String set(byte[] key, HashMap<byte[], byte[]> map) {
        return jedis.hmset(key,map);
    }

    public String set(String key, List<String> list) {
        Long aLong=-1l;
        for (String value:list
             ) {
            aLong = jedis.lpush(key,value);
        }
        return aLong<=0?"error":"OK";
    }

    public String set(byte[] key, List<byte[]> list) {
        Long aLong=-1l;
        for (byte[] value:list
                ) {
            aLong=jedis.lpush(key,value);
        }
        return aLong<=0?"error":"OK";
    }

    public String set(String key, String value) {
        return jedis.set(key,value);
    }

    public String set(byte[] key, byte[] value) {
        return jedis.set(key, value);
    }

    public String set(String key, Set<String> set) {
        Long aLong=-1l;
        for (String value:set
             ) {
            aLong=jedis.sadd(key,value);
        }
        return aLong<=0?"error":"OK";
    }

    public String set(byte[] key, Set<byte[]> set) {
        Long aLong=-1l;
        for (byte[] value:set
                ) {
            aLong=jedis.sadd(key,value);
        }
        return aLong<=0?"error":"OK";
    }

    //redis寫入物件,用序列化物件的方式
public String set(String key, Object Obj) {
       return  jedis.set(key.getBytes(),SerializeUtil.serialize(Obj));
    }

    public Object get(String key) {
        Object object=null;
        //獲取value的型別
String type=jedis.type(key);
        //根據不同型別呼叫不同的獲取方法
if(type.toLowerCase().equals("map")){
            object=jedis.hgetAll(key);
        }else if(type.toLowerCase().equals("set")){
            object=jedis.smembers(key);
        }else if(type.toLowerCase().equals("list")){
            object=jedis.lrange(key,0,-1);
        }else if (type.toLowerCase().equals("string")){
            byte[] bytes=jedis.get(key.getBytes());
            object=SerializeUtil.unserialize(bytes);
            if(object==null){
                object=jedis.get(key);
            }
        }
        return object;
    }

    public Object get(byte[] key) {
        return null;
    }

    public Long delete(String key) {
        return jedis.del(key);
    }

    public String update(String key,Object value){
        //先刪除原有資料
Long along = jedis.del(key);
        if(along<0){
            return "error";
        }
        //再重新新增
if(value instanceof Map){
            set(key,(Map)value);
        }else if(value instanceof Set){
            set(key,(Set) value);
        }else if(value instanceof List){
            set(key,(List) value);
        }else if(value instanceof String){
            set(key,(String)value);
        }else {
            set(key,value);
        }
        return "OK";
    }
}

相關推薦

java在redis儲存物件

最近需要封裝一個操作redis的工具類,不知道怎麼向redis中儲存物件,想到過用java反射去做。在網上搜索了一下,發現可以用序列化物件的方式去儲存。再此我整理了一下感謝,殘劍_提供的方法:http://www.cnblogs.com/liuling/p/2014-4-19

【Java】連結串列儲存物件的問題

  在刷《劍指OFFER》的時候,自己犯了一個錯誤,發現:在連結串列中儲存一個物件時,如果該物件是不斷變化的,則應該建立一個新的物件複製該物件的內容(而不是指向同一個物件),將這個新的物件儲存到連結串列中。如果直接儲存該物件的話,連結串列中的物件也會不斷變化。基本資料型別和String則沒有這種問題。 其實

《Java》完成一個“將使用者通過鍵盤輸入的文字動態加入到Vector類物件,並顯示此Vector類物件儲存的字串”的應用程式

一、任務目標     完成一個java application應用程式,通過接收使用者通過鍵盤輸入的文字,把每次回車輸入的字串動態加入到Vector類物件中,並顯示此Vector類物件中儲存的字串。   二、Vector類     Vector 類可實現自動增長的物件陣列,提供了

jvm 物件在記憶體儲存的佈局

jvm  物件在記憶體中儲存的佈局有三部分:物件頭、例項資料、對齊填充。 1、物件頭:執行時資料、型別指標、陣列長度。 (1)執行時資料:hashcode雜湊碼、鎖狀態標誌、執行緒持有的鎖、GC年齡分代等,有些不是固定不變的,在執行時會根據當時的狀態進行修改。 (2)型別指標:

分享一個好的函式吧,將js物件轉成url引數

這個函式呢是自己在寫基於Vue+ElementUI管理後臺時用到的,,下面列出來兩種使用方式: 最普通的,封裝一個js函式 /** * 物件轉url引數 * @param {*} data */ function urlencode (data

【mybatis】欄位儲存多個值“,”隔開,如何查詢

目錄 做專案遇到這種情況,欄位中儲存多個值用“,”隔開。這種應該如何查詢呢。 做個簡單的例子: 表: 判斷一個值是否存在其中(FIND_IN_SET) SELECT *

Java 往TreeSet集合儲存自定義物件學生,按照學生的年齡進行排序。

Set:無序,不可以重複元素。|--HashSet:資料結構是雜湊表。執行緒是非同步的。保證元素唯一性的原理:判斷元素的hashCode值是否相同。如果相同,還會繼續判斷元素的equals方法,是否為true。|--TreeSet:可以對Set集合中的元素進行排序。底層資料

Redis 存取 java 物件 hash 雜湊命令儲存物件的各個屬性和採用 String 字串命令儲存序列化後的物件之開銷對比

轉自:http://www.jfinal.com/share/460 用一個簡單的User物件做試驗,共有4個屬性,型別分別為整型,整型,字串,字串。 測試程式碼 public class TestRedis { private static final Cache testCach

java的外部比較器、內部比較器實現物件陣列的排序

需求: 有一個People類,該類例項化的物件存放在物件陣列中。 該類的屬性有String name,int id。 請按id的大小對物件陣列中的物件進行從小到大的排序。   第一種方法:用內部比較器比較 People類如下: /* * 為了該類的物件可以比較

JAVA高階特性——迷你圖書管理系統(DOM4J操作儲存集合物件

  要求:使用XML儲存圖書資訊,使用DOM4J操作XML,進行圖書的增刪改查。 使用技術:XML/DOM4j/集合/物件     部分實現效果如果下:  實現思路   首先需要建立一個圖書類(Book類),儲存圖書的屬性(屬性和XML檔案一致,因

論IP地址在資料庫應該何種形式儲存

轉自:http://www.cnblogs.com/skynet/archive/2011/01/09/1931044.html 在看公司專案程式碼時,有涉及到ip地址儲存, 使用的是varbinary(4),但沒有文件說明 這引發我的思考——緣起 當設計一個數據表時,考慮使用何種列的資料型別對效能有比較

spring jpa使用entitymanager無法儲存物件

在spring 的事務配置如下: <tx:annotation-driven transaction-manager="transactionManager"/>     <bean id="transactionManager" class="org.s

Java儲存金額什麼資料型別

Java面試高頻問題:你會用什麼資料型別來儲存金額? 如果這個時候你回答float,double那麼恭喜你,又可以省出時間來準備別的公司的面試了,當面試官說float,和double不行的時候你可能還一臉懵逼,為啥不行?那麼請看下面的例子 public class Tes

CxImage在onSaveDocument()儲存圖片

用CxImage儲存圖片,遇到個問題,儲存後的圖片是0位元組,程式碼如下: BOOL CHalftoningDoc::OnSaveDocument(LPCTSTR lpszPathName){ // TODO: Add your specialized code

java兩個list儲存bean物件,找出其中某一屬性不同的元素

在java中運用List集合儲存物件,如果想找到兩個list中不同的部分,可以用ArrayList的contains方法,遍歷每一個物件,判斷是否是相等的,如下: public stati

List集合迴圈儲存物件時,導致迴圈後集閤全部資料都是最後一條的情況

在處理資料,List集合迴圈儲存物件時,發現迴圈後集閤中全部資料都是最後一條的情況。 code: ... AlarmInfo ai = new AlarmInfo(); //建立物件 List

HashSet儲存複雜型別物件

 這個話題還是從一個有問題的程式碼中引申出來的,原始碼如下: import java.util.*; class TreeSetTest {     public static void main(String[] args)     {         HashSet

Spring-MVCModelAndView物件所新增的內容在前端EL表示式獲取不到的問題

原來是IntelliJ IDEA預設生成的web.xml文件的頭部不正確 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "htt

word/Excel 此物件創建於package,此應用程式不能來開啟此物件

在word/Excel文件中要開啟一個包         1."點選" 出現 "即將啟用一個嵌入物件,可能帶有病毒,是否繼續"         2. 點選"是"以後,則出現了這個提示: "此物件創建於package中,此應用程式不能用來開啟此物件,請確認此應用程式已正確

python類與物件寫一個猜拳遊戲

思路:我們可以通過隨機數的方法來實現電腦隨機出拳,通過猜拳規則判斷是電腦還是玩家獲得勝利最後統計結果 import random 先匯入隨機數 class game(): 建立一個遊戲的類 裡面分為兩個屬性一個玩家名 一個電腦名 def __i