寫給Java程序員看的Redis教程-------第二章. jedis基礎知識及理論實戰

前言: 不瞭解Redis是啥的可以去:第一章,redis入門

1.java連接Redis

Java連接Redis,請確保你的目標服務器的端口對外開放(雲端安全組設置)

1.1 給項目中導入jedis包。

jar包可以複製

[]: https://static.runoob.com/download/jedis-2.9.0.jar

這裏是一個maven依賴。

		<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.1</version><!--版本號可根據實際情況填寫-->
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>

1.2 測試jedis連接

import redis.clients.jedis.Jedis;

public class RedisJava {
    public static void main(String[] args) {
        //連接本地的 Redis 服務
        Jedis jedis = new Jedis("134.175.110.184");
        // 如果有密碼的話,使用這一行
        // jedis.auth("password");
        System.out.println("連接成功");
        //查看服務是否運行
        System.out.println("服務正在運行: " + jedis.ping());
    }
}

1.3 Java操作Redis.

import redis.clients.jedis.Jedis;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class RedisJava {
    public static void main(String[] args) {
        testSet();
        testKeysStar();
        testList();
        testKeys();
    }

    private static void testKeys() {
        //連接本地的 Redis 服務
        Jedis jedis = new Jedis("localhost");
        System.out.println("連接成功");

        // 獲取數據並輸出
        Set<String> keys = jedis.keys("*");
        Iterator<String> it = keys.iterator();
        while (it.hasNext()) {
            String key = it.next();
            System.out.println(key);
        }
    }

    private static void testList() {
        //連接本地的 Redis 服務
        Jedis jedis = new Jedis("localhost");
        System.out.println("連接成功");
        //存儲數據到列表中
        jedis.lpush("site-list", "Runoob");
        jedis.lpush("site-list", "Google");
        jedis.lpush("site-list", "Taobao");
        // 獲取存儲的數據並輸出
        List<String> list = jedis.lrange("site-list", 0, 2);
        for (int i = 0; i < list.size(); i++) {
            System.out.println("列表項爲: " + list.get(i));
        }
    }

    private static void testKeysStar() {
        //連接本地的 Redis 服務
        Jedis jedis = new Jedis("localhost");
        jedis.auth("test123");
        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }
    }

    public static void testSet() {
        //連接本地的 Redis 服務
        Jedis jedis = new Jedis("localhost");
        System.out.println("連接成功");
        //設置 redis 字符串數據
        jedis.set("runoobkey", "www.runoob.com");
        // 獲取存儲的數據並輸出
        System.out.println("redis 存儲的字符串爲: " + jedis.get("runoobkey"));
    }
}

1.4 寫出Redis常用工具類

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisUtil {

    /**
     * 服務器IP地址
     */
    private static String ADDR = "localhost";
    /**
     * 端口
     */

    private static int PORT = 6379;
    /**
     * 密碼
     */
    private static String AUTH = "123456";
    /**
     * 連接實例的最大連接數
     */
    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;
    /**
     * 數據庫模式是16個數據庫 0~15
     */
    public static final int DEFAULT_DATABASE = 0;

    /**
     * 初始化Redis連接池
     */
    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(MAX_ACTIVE);
            config.setMaxIdle(MAX_IDLE);
            config.setMaxWaitMillis(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH, DEFAULT_DATABASE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取Jedis實例
     */
    public synchronized static Jedis getJedis() {
        try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                System.out.println("redis--服務正在運行: " + resource.ping());
                return resource;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 釋放資源
     */
    public static void returnResource(final Jedis jedis) {
        if (jedis != null) {
            jedisPool.returnResource(jedis);
        }
    }
}

2. Redis 使用場景分析

本章場景主要來自《Redis實戰》.

2.1 Redis優化登錄和cookie緩存

原有系統:用戶登錄時可以選擇記住賬號,並且能將用戶的瀏覽記錄保存以供未來用戶查看or企業進行分析。

需求:用戶登錄後,瀏覽記錄頻繁的插入數據庫,目前已經超過了服務器的承受能力,請問如何優化?

在這裏插入圖片描述

分析:首先,用戶每次訪問頁面,我們可以使用cookieID從redis中查找對應的cookie,進行登錄優化。當然優化登錄操作並不能帶來很明顯的性能提升,因爲耗時操作往往在之後的插入瀏覽記錄中。

而用戶的瀏覽記錄,每次只增加一條,單條操作如果能合併爲批量操作就能大大減輕數據庫負擔。(批量插入更高速。)

瀏覽記錄我們可以先讓其在redis緩存,等其攢夠一定數量後等待低峯時期使用批量插入,插入到數據庫中,儘可能的減少磁盤峯值負載。

所以優化如下:

在這裏插入圖片描述

2.2 使用Redis 優化購物車

上文中使用的cookie,最初的設計意圖在於爲網商提供一種購物車,讓用戶可以收集他們想要購買的商品。

現在的購物車往往存放在數據庫中,但是用戶往往對購物車中的商品進行簡單而又耗時的操作:加減商品數量,添加商品。

這樣的操作就好像用戶在不斷的更新,插入數據庫數據,而且每次影響的行數只有一行,有時還會頻繁操作。這就對磁盤讀寫能力挑戰較大。

同樣,我們依然先將用戶查詢到的購物車內容,或者新增的內容放到Redis中,用戶查詢時都保存在Redis一份,插入時先插入到Redis之中。然後用戶對購物車的操作都是在Redis中進行,暫時與數據庫無關。

最終在一段時間後,redis信息過期,將其放入到DB中。

在這裏插入圖片描述

2.3 網頁緩存

在動態生成網頁的時候,通常會使用模板語言來簡化網頁的生成操作。但是很多時候很多網頁並不會產生太大的變化,此時我們就可以選擇將網頁緩存到redis中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章