キャッシュされたオブジェクトの楽しさSpringBoot2.x |フォースプログラム

著者|ムーンテーブル

ソース| CSDNブログ

ヘッドフィギュア|視覚的に中国から支払わダウンロード

出品 | CSDN(ID:CSDNnews)

序文

Redisのほとんどの人が最初に考えたの可能性がキャッシュされる述べたように、Javaオブジェクトがプロジェクトにキャッシュされ、その後どのように行いますか?キャッシュオブジェクトを:それは、この記事では、次の導入を何。この記事では、Redisのにオブジェクト・キャッシュにJedisによるプロジェクトSpringBootの概要を説明します。

あなたはSpringBootプロジェクトを構築する方法を知っておく必要があり、この記事を読んで、あなたが知る必要があることSpringBootが2.1.0.RELEASEで、この記事の別のバージョンです。迅速な統合Jedisクライアント(通常版)の楽しいSpringBoot 2.xの:SpringBoot統合Jedisについてを参照してください。

次は、の開始、特定のコード例は、それを紹介しましょう!

コードケース

直列化、JSON:特にUserクラスのRedisに作成され、次のプレゼンテーションキャッシュオブジェクトによって2つの方法があります。Userクラスの特定のコードを次のように:

 1public class User implements Serializable {
 2
 3    private String name;
 4    private Integer age;
 5
 6    public User(String name,Integer age){
 7        this.name = name;
 8        this.age = age;
 9    }
10    //省略 getter and setter 方法
11}

JedisCacheServiceSupportパッケージにスレッドプールJedis動作スレッド操作の処理及び復帰に有効期限、特定のコードを次のように

 1public abstract class JedisCacheServiceSupport {
 2    public static final long EXPIRE_MILLISECONDS_DEFAULT_LONG = 3*60*60*1000;
 3
 4    public Long getExpireTime(Long expireTime) {
 5        expireTime = (expireTime == null || expireTime.longValue() <= 0) ? EXPIRE_MILLISECONDS_DEFAULT_LONG : expireTime;
 6        return expireTime;
 7    }
 8
 9    public void close(Jedis jedis){
10        if(jedis != null){
11            jedis.close();
12        }
13    }
14}

連載

Redisのいまストレージオブジェクト(直列化)後にバイナリストリームに変換することによってシリアル化方法は、その後にオブジェクト(デシリアライズ)にバイナリキー、バイナリストリームが取得しました。

オブジェクトは、次の操作を行い保持します:

ObjectOutputStream.writeObject(オブジェクト)によって[]配列は、Redisの中に格納されるバイトのバイト配列ユーザー、次いでpsetex(バイト[]キー、長いミリ秒、バイト[]の値)にオブジェクトを変換します。間で

  • バイト[]キー:キーニーズがバイト配列に変換されます。

  • 長いミリ秒:対象の生存をミリ秒単位で、Redisの時間です。

  • バイト[]値:配列にbtyeオブジェクト。

オブジェクトを取得するには、次の操作を行います。

配列に(Userオブジェクトを変換)バイト配列オブジェクトは次いで、ユーザGET(バイト[]キー)、ObjectInputStream.readObjectによって変換され得ます。

によって直列化を次のように保存して検索すると、特定のコードをオブジェクト:

  1@Service
  2public class JedisCacheService extends JedisCacheServiceSupport  {
  3
  4    private static Logger logger = LoggerFactory.getLogger(JedisCacheService.class);
  5
  6
  7
  8    @Autowired
  9    private JedisPool jedisPool;
 10
 11    /**
 12     * 获取缓存中的对象
 13     * @param key
 14     * @return
 15     */
 16    public Object getObject(String key) {
 17        Jedis jedis = null;
 18        Object object = null;
 19        try {
 20            jedis = jedisPool.getResource();
 21            byte[] ObjectByteArray = jedis.get(key.getBytes());
 22            object = unserialize(ObjectByteArray);
 23        }catch (Exception e){
 24            e.printStackTrace();
 25        }finally {
 26            close(jedis);
 27        }
 28        return object;
 29    }
 30
 31    /**
 32     *  将对象缓存到Redis中,设置默认过期时间
 33     * @param key
 34     * @param value
 35     */
 36    public void putObject(String key, Object value) {
 37        putObject(key,value,null);
 38    }
 39    /**
 40     *  将对象缓存到Redis中,自定义认过期时间
 41     * @param key
 42     * @param value
 43     */
 44    public void putObject(String key, Object value, Long expireTime) {
 45        Jedis jedis = null;
 46        try {
 47            jedis = jedisPool.getResource();
 48            jedis.psetex(key.getBytes(),getExpireTime(expireTime),serialize(value));
 49        }catch (Exception e){
 50            e.printStackTrace();
 51        }finally {
 52            close(jedis);
 53        }
 54    }
 55
 56
 57    /**
 58     * 序列化
 59     * @param object
 60     * @return
 61     */
 62    public static byte[] serialize(Object object) {
 63        ObjectOutputStream oos = null;
 64        ByteArrayOutputStream baos = null;
 65        try {
 66            baos = new ByteArrayOutputStream();
 67            oos = new ObjectOutputStream(baos);
 68            oos.writeObject(object);
 69            byte[] bytes = baos.toByteArray();
 70            return bytes;
 71        } catch (Exception e) {
 72            logger.error(e.getMessage(), e);
 73        } finally {
 74            IOUtil.closeStream(oos);
 75            IOUtil.closeStream(baos);
 76        }
 77        return null;
 78    }
 79
 80    /**
 81     * 反序列化
 82     * @param bytes
 83     * @return
 84     */
 85    public static Object unserialize(byte[] bytes) {
 86        if (bytes == null) return null;
 87
 88        ByteArrayInputStream bais = null;
 89        ObjectInputStream ois = null;
 90        try {
 91            bais = new ByteArrayInputStream(bytes);
 92            ois = new ObjectInputStream(bais);
 93            return ois.readObject();
 94        } catch (Exception e) {
 95            logger.error(e.getMessage(), e);
 96        } finally {
 97            IOUtil.closeStream(bais);
 98            IOUtil.closeStream(ois);
 99        }
100        return null;
101    }
102}

次のように入力と出力を閉じるとツール固有のコードストリーム。

 1public class IOUtil {
 2    public static void closeStream(InputStream inputStream) {
 3        if (inputStream != null) {
 4            try {
 5                inputStream.close();
 6            } catch (IOException e) {
 7                e.printStackTrace();
 8            }
 9
10        }
11    }
12
13    public static void closeStream(OutputStream outputStream) {
14        if (outputStream != null) {
15            try {
16                outputStream.close();
17            } catch (IOException e) {
18                e.printStackTrace();
19            }
20
21        }
22    }
23}

シリアル化デモ

試験JedisCacheServiceのputObject(オブジェクトがキャッシュ内に置か)以下のようには、getObject(キャッシュからオブジェクトを取得)、特定のコードがあります:

 1@RunWith(SpringRunner.class)
 2@SpringBootTest
 3public class JedisCacheServiceTest {
 4    private  Logger logger = LoggerFactory.getLogger(JedisCacheService.class);
 5    @Autowired
 6    private JedisCacheService jedisCacheService;
 7
 8    @Test
 9    public void putObject() {
10        User user = new User("zhuoqiammingyue",19);
11        jedisCacheService.putObject("user01",user);
12        logger.info("缓存用户成功!");
13    }
14
15    @Test
16    public void getObject() {
17        User user = (User)jedisCacheService.getObject("user01");
18        logger.info("User name={},age={}",user.getName(),user.getAge());
19    }
20}

putObjectログ情報:

12020-02-26 22:08:50.320  INFO 26748 --- [           main] cn.lijunkui.cache.JedisCacheServiceTest  : Started JedisCacheServiceTest in 7.157 seconds (JVM running for 9.357)
22020-02-26 22:08:51.144  INFO 26748 --- [           main] cn.lijunkui.cache.JedisCacheService      : 缓存用户成功!

getObjectメソッドログの情報。

12020-02-26 22:09:57.492  INFO 9612 --- [           main] cn.lijunkui.cache.JedisCacheServiceTest  : Started JedisCacheServiceTest in 7.07 seconds (JVM running for 8.902)
22020-02-26 22:09:58.143  INFO 9612 --- [           main] cn.lijunkui.cache.JedisCacheService      : User name=zhuoqiammingyue,age=19

JSON方法

JSONの方法が張らJSONオブジェクトでキーが取得した後、JSON文字列、JSONのRedisに読める文字列にオブジェクトを保存することです。完成GoogleによるGsonに文字列にJSONオブジェクトは、次のように特定のコードに依存依存Gsonを導入する必要があります。

1<dependency>
2    <groupId>com.google.code.gson</groupId>
3    <artifactId>gson</artifactId>
4    <version>2.8.5</version>
5</dependency>

次のようにJSONストレージターゲットの特定の操作は次のとおりです。

Gson.toJson(オブジェクトSRC)により、ユーザJSON文字列、RedisのにJSON文字列に次にpsetex(文字列キー、長いミリ秒、文字列値)にオブジェクトを変換します。

JSONは、次の操作を行うオブジェクトを取得します:

JSONユーザーオブジェクトに文字列を変換するJSON文字列、そしてGson.fromJson(文字列JSON、クラス<T> classOfT)の取得(文字列キー)Userオブジェクトによって。

保存と方法によって、以下のように検索は、JSONの特定のコードをオブジェクト:

 1@Service
 2public class JedisJsonCacheService extends JedisCacheServiceSupport {
 3
 4    private static Logger logger = LoggerFactory.getLogger(JedisJsonCacheService.class);
 5
 6    @Autowired
 7    private JedisPool jedisPool;
 8
 9    /**
10     * 获取缓存中的对象
11     * @param key
12     * @param clazz
13     * @return
14     */
15    public Object getObject(String key,Class clazz) {
16        Jedis jedis = null;
17        Object object = null;
18        try {
19            jedis = jedisPool.getResource();
20            String objectJson = jedis.get(key);
21             object = toObjce(objectJson,clazz);
22        }catch (Exception e){
23            e.printStackTrace();
24        }finally {
25            close(jedis);
26        }
27        return object;
28    }
29
30    /**
31     * 将对象缓存到Redis中,设置默认过期时间
32     * @param key
33     * @param value
34     */
35    public void putObject(String key, Object value) {
36        putObject(key, value,null);
37    }
38
39    /**
40     * 将对象缓存到Redis中,自定义认过期时间
41     * @param key
42     * @param value
43     * @param expireTime
44     */
45    public void putObject(String key, Object value, Long expireTime) {
46        Jedis jedis = null;
47        try {
48            jedis = jedisPool.getResource();
49            jedis.psetex(key,getExpireTime(expireTime),toJson(value));
50        }catch (Exception e){
51            e.printStackTrace();
52        }finally {
53            close(jedis);
54        }
55    }
56
57
58
59    /**
60     * 将对象转换成Json串
61     * @param value
62     * @return
63     */
64    private String toJson(Object value) {
65        Gson gson = new Gson();
66        return gson.toJson(value);
67    }
68
69    /**
70     * 将Json串转换成对象
71     * @param json
72     * @param clazz
73     * @return
74     */
75    private Object  toObjce(String json,Class clazz) {
76        Gson gson = new Gson();
77        return gson.fromJson(json,clazz);
78    }
79}

シリアル化デモ

試験JedisJsonCacheServiceTestのputObject(オブジェクトがキャッシュ内に置か)次の​​ようには、getObject(キャッシュからオブジェクトを取得)、特定のコードがあります:

 1@RunWith(SpringRunner.class)
 2@SpringBootTest
 3public class JedisJsonCacheServiceTest {
 4
 5    private Logger logger = LoggerFactory.getLogger(JedisJsonCacheServiceTest.class);
 6    @Autowired
 7    private JedisJsonCacheService jedisJsonCacheService;
 8
 9    @Test
10    public void putObject() {
11        User user = new User("zhuoqiammingyue2",20);
12        jedisJsonCacheService.putObject("user02",user);
13        logger.info("缓存用户成功!");
14    }
15
16    @Test
17    public void getObject() {
18        User user = (User)jedisJsonCacheService.getObject("user02",User.class);
19        logger.info("User name={},age={}",user.getName(),user.getAge());
20    }
21}

putObjectログ情報:

12020-02-27 07:57:16.184  INFO 3692 --- [           main] c.l.cache.JedisJsonCacheServiceTest      : Started JedisJsonCacheServiceTest in 7.92 seconds (JVM running for 10.786)
22020-02-27 07:57:16.852  INFO 3692 --- [           main] c.l.cache.JedisJsonCacheServiceTest      : 缓存用户成功!

getObjectメソッドログの情報。

12020-02-27 07:57:56.359  INFO 27624 --- [           main] c.l.cache.JedisJsonCacheServiceTest      : Started JedisJsonCacheServiceTest in 7.364 seconds (JVM running for 9.256)
22020-02-27 07:57:56.824  INFO 27624 --- [           main] c.l.cache.JedisJsonCacheServiceTest      : User name=zhuoqiammingyue2,age=20

概要

実際の開発でJSONシーケンスおよびこれら二つの方法は、あなたの好みに応じて選択することができます。Gsonを使用してJSONの仕方はもちろん、あなたはまた、シリアライズとデシリアライズネイティブJavaを使用してFASTJSON、シリアライズを使用することができますが、あなたはまた、より効率的なヘッセシリアライズとデシリアライズに切り替えることができます。

サンプルコード

次のように私のローカル環境は以下のとおりです。

  • SpringBootバージョン:2.1.0.RELEASE

  • ApacheのMavenのバージョン:3.6.0

  • Javaバージョン:1.8.0_144

  • IDEA:IntellJのIDEA

このような問題のように動作中のモジュールでの私のGitHubのリポジトリspringbootexamplesにすることができ、スプリング・ブート2.xの-redis-と呼ばれる jedis-objectcacheは、 ビューのプロジェクトを比較します

GitHubのします。https://github.com/zhuoqianmingyue/springbootexamples

オリジナルリンクします。https://blog.csdn.net/ljk126wy/article/details/104519059

【終わり】

「フォース計画[第二四半期] -学習能力チャレンジ」開始!
今3月21日まで、原作者、挑戦にあなたを待って排他的[全表示]メダルをサポートするために流れなければなりません

推奨読書 

マイクロチャネルQQ小さなプログラムが原因凹凸の閉鎖された。世界最大のボットネットにおけるMicrosoftの大ブレイク、VSコード1.43リリース|オタクのヘッドライン

公式宣伝!5G、新しい力XG研究所基盤の確立にアリ

最先端技術クエスト:知識マップ構築プロセスおよび方法

被災地におけるドイツ武漢のプログラマ:早朝のダウンロードデータ、衝突速度の仕事

脆弱性および脅威はネイティブ何を曇らせますか?ネイティブどのようにクラウドのセキュリティ?ここであなたが知る必要があるすべてです!

シンプルな白のアナログビットコインシステム、手の波をプログラミングし、書き込みにあなたを取ります!(コード付)|ボーウェンおすすめ

あなたは私は好きなよう真剣に、すべてのポイントを見て

解放1817元の記事 ウォンの賞賛40000 + ビュー1644万+

おすすめ

転載: blog.csdn.net/csdnnews/article/details/104832409