Redis學習記錄(一) 利用Jedis將Mysql中試題表的數據條數同步於Redis中

場景:畢業設計是一個做題系統,現在用戶進行科目的選擇時會異步刷新該科目在題庫中的題目總數,爲了短時間內不會重複地去Mysql執行SELECT語句,所以將題目總數存入Redis中(雖然用戶就我一個,但是學習嘛)

涉及:Redis、MySql、Jedis、JDBC(windows下)


一、Redis基操

1.設置Redis密碼

       上個月在阿里雲服務器上裝了Redis,沒幾天就被用來挖礦了,最主要的原因就是沒有改默認的端口號還沒有設置密碼,被人利用類似SQL注入的東西在我係統上植入了很噁心的文件,花了很多精力才清理乾淨,所以一定要設置密碼!!!

       首先,打開Redis的安裝文件夾下,記事本打開redis.windows.conf,然後搜索#requirepass foobared,將foobared替換爲你的密碼,然後將#以及左右空格去除,如下圖。

在這裏插入圖片描述

2.註冊服務

進入cmd,並進入到redis的安裝文件夾下,並執行如下指令。

redis-server --service-install redis.windows.conf`

在這裏插入圖片描述

如此我們在服務中就能看到Redis了,拉到R開頭的地方如圖:

在這裏插入圖片描述

在這裏插入圖片描述

3.進入客戶端

Redis文件夾下用cmd輸入如下指令:

redis-cli.exe

這時會發現進入如下界面:
在這裏插入圖片描述

到這裏我們試試存一個鍵,會發現報錯:
在這裏插入圖片描述

這時,我們輸入密碼試試:

在這裏插入圖片描述

       這個ok出來就好了,這時我們就可以通過Redis的各種指令來進行各種數據類型的操作,指令大全網上很多,我就不重複複製了,只記錄使用過程。


二、Jedis使用

1.導入Jar包/導入座標

利用Java來操作Redis的話我使用的是Jedis,需要兩個Jar包

jedis-2.9.0.jar
commons-pool2-2.4.2.jar

下載的話可以去github或者我將這兩個Jar打包了,設置的0積分需要點下面鏈接即可,當然用Maven導座標更簡便。

jar包下載.

2.基本運用

       就像學習Java的時候需要HelloWorld先看效果爽一下一樣,這段代碼就是最簡單的Jedis調用實例(默認的網段,默認的端口號,配置信息全注掉):

 // 配置redis連接池
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		// // 設置連接池的最大連接數
		// jedisPoolConfig.setMaxTotal(50);
		// // 設置連接池最大空閒的數量
		// jedisPoolConfig.setMaxIdle(10);
		// // 設置連接池最小空閒的數量
		// jedisPoolConfig.setMinIdle(5);
		// // 連接最大超時時間
		// jedisPoolConfig.setMaxWaitMillis(30000);

		// 創建redis連接池
		JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);

		// 獲取redis對象
		Jedis jedis = jedisPool.getResource();

		// 登陸密碼
		jedis.auth("luoxi611");

		// 插入鍵值
		jedis.set("uname", "亞索");

		System.out.println("用戶:" + jedis.get("uname"));

		// 將redis連接放回連接池
		jedis.close();

		jedisPool.close();

看一下運行結果:

用戶:亞索

       其實在Jedis中的方法和Redis的各種指令都是相同的,所以主要還是對於各種指令要能掌握,指令會的越多我們的Jedis相應的也就會的越多,百度指令大全之後發現太多了,全背下是不太可能也不可取的,只能以後用多了慢慢記憶。


三、實現需求

1.思路

       每一次查詢試題表的數量時,先去Redis中查詢,如果有就直接返回不執行Sql;如果沒有就執行查詢,但返回前插入到Redis,設置這個值的失效時間。同時畢設中其他會導致條數改變的操作需要追加更新Mysql數據庫和Redis的操作。

2.實現

JDBC的Sql代碼塊執行之前追加讀取操作:



		// 獲取鏈接
		JedisPool pool = JedisConnect.getPool();

		// 獲取jedis
		Jedis jedis = pool.getResource();

		// 密碼認證
		String flag = jedis.auth("luoxi611");

		System.out.println(flag);

		int count = -1;

		try {

			//獲得數量
			count = Integer.valueOf(jedis.get(tableName + inBean.getSubject()));

		} catch (NumberFormatException e) {
			count = -1;
		} finally {
			// 釋放
			jedis.close();
		}

		return count;

	

JDBC的Sql代碼塊執行之後返回結果前追加寫入操作,寫入的數據保留30秒:



		// 獲取鏈接
		JedisPool pool = JedisConnect.getPool();

		// 獲取jedis
		Jedis jedis = pool.getResource();

		// 密碼認證
		String flag = jedis.auth("luoxi611");

		System.out.println(flag);

		jedis.set(tableName + inBean.getSubject(), String.valueOf(count));

		// 過期
		jedis.expire("selonequestions" + inBean.getSubject(), 30);

		System.out.println("redis寫入");

		// 釋放
		jedis.close();
	

通過打斷點運行看看效果:

選擇“選擇題”,以及“Java”科目,如下圖:

在這裏插入圖片描述

查看斷點執行,由於剛剛啓動,Redis中沒有這個鍵,所以進入了寫入代碼段,如下圖:

在這裏插入圖片描述

然後我們迅速重新選擇,發現進入了讀出代碼段,直接return不再執行SQL,如下圖:

在這裏插入圖片描述

然後等半分鐘,我們繼續選一次,發現進入剛纔的值沒了,所以重新查庫再寫入緩存了:

在這裏插入圖片描述

3.總結

       這只是我的一個小例子,也不知道合不合理,因爲Redis很靈活,不適用於任何場景,在特定的情況下才有好效果。我的考慮就是`在這裏插入代碼片`一個用戶不停地進行試題切換的話,就需要不停地通過Mysql去查詢然後返回條數,那麼用戶多起來之後都不斷地選擇題型,那麼對於數據庫來說就需要頻繁的建立連接,編譯SQL等等操作,所以利用Redis讓短時間內的重複查詢操作跳過那些操作,給MySql減負。 如果大家有什麼意見建議請儘管評論出來或者私信,謝謝。

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