前言: 不瞭解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中。