1.redis安裝:下載壓縮包,解壓,然後cmd終端中進入redis安裝根路徑
1.1啟動redis伺服器:redis-server.exe 【redis.windowws.conf】--【】括弧內可以不加
1.2(需要另開啟一個cmd終端)redis用戶端連結上資料庫: redis-cli.exe -h 資料庫服務IP地址 -p 連接埠 【-a password】
執行個體:redis-cli.exe -h 127.0.0.1 -p 6379
redis服務啟動成功:
redis資料庫連結成功:
=================================題外話=================================
redis的配置:配置:config set 配置名 配置值 —— 查看配置:config get 配置名
舉例:
127.0.0.1:6379> config get loglevel1) "loglevel"2) "notice"
redis安全:設定密碼後,用戶端串連 redis 服務就要求輸入密碼驗證,否則無法執行命令。
config set requirepass "pass"
config set requirepass "pass"
驗證密碼:
AUTH "pass"
======================
其中Redis預設設定檔中提供了三個條件:
save 900 1 (表示900s(15分鐘)內有1個更改,redis伺服器就儲存到disk硬碟中)
save 300 10 (300s(5分鐘)內有10個更改,redis伺服器就儲存到disk硬碟中)
save 60 10000 (60s內有10000個更改,redis伺服器就儲存到disk硬碟中)
redis的儲存在記憶體中,所以讀寫很快。但卻資料不安全。。的,如果在執行過程中斷電,則記憶體中資料將會丟失。。
所以,redis配置save指令,指定時間內去儲存進disk硬碟中。同時redis根目錄下建立一個dump.rdb檔案
每執行一次save指令,就更新一次(本地硬碟中redis根目錄下的)dump.rdb檔案.
1.save: 服務端做的硬碟儲存
2.bgsave:該命令在後台用戶端執行,做硬碟儲存。
====>恢複資料 如果需要恢複資料,只需將備份檔案 (dump.rdb) 移動到 redis 安裝目錄並啟動服務即可。擷取 redis 目錄可以使用 CONFIG 命令,如下所示
===========================================================================
2.Redis 是完全開源免費的,遵守BSD協議,是一個高效能的key-value資料庫。
Redis支援五種資料類型:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。
string類型是Redis最基本的資料類型,一個key最大能儲存512MB。
增加<==>讀取 資料:
String類型: 增加一個:set Key名 value值 —— 取:get key名
增加多個:mset key1 value1 key2 value2 .............. —— 取:mget key1 key2 ...........
127.0.0.1:6379> mset "s1" "1" "s2" "2" "s3" "3"OK127.0.0.1:6379> mget s1 s2 s31) "1"2) "2"3) "3"
====>拓展指令:incr -- 加1操作
舉例:s1:0 —— incr s1 之後 ——>s1:1
127.0.0.1:6379> set s1 0OK127.0.0.1:6379> get s1"0"127.0.0.1:6379> incr s1(integer) 1127.0.0.1:6379> get s1"1"127.0.0.1:6379>
hash(雜湊)類型:增加一個:hset key名 value —— 取:hget key名
增加多個:hmset key名 (欄位 欄位值)value
—— 取一個:hget key名 欄位值,取全部:hgetall key名
刪除hash中某個欄位值:hdel key名 欄位名
給hash裡某一個欄位加上指定值:hincrby hash名 欄位名 指定值
-- 例:hincyby userinfo age 10 (在原來age上追加+10)
舉例:userInfo類的屬性有:name,age,sex
127.0.0.1:6379> hmset userinfo name "tom" age 12 sex "man"OK127.0.0.1:6379> hget userinfo name"tom"127.0.0.1:6379> hgetall userinfo1) "name"2) "tom"3) "age"4) "12"5) "sex"6) "man"
刪除hash中某一欄位值:
127.0.0.1:6379> hgetall userinfo1) "name"2) "tom"3) "age"4) "12"5) "sex"6) "man"127.0.0.1:6379> hdel userinfo sex(integer) 1127.0.0.1:6379>127.0.0.1:6379> hgetall userinfo1) "name"2) "tom"3) "age"4) "12"
list(列表)類型:(取出時,按照進入時的逆序排列)增加逆序:
lpush key名 value —— 取:lrange key名 下標起始index(0開始) 下標結束index
(取出時,按照進入時的正序排列)增加:
rpush key名 value —— 取:lrange key名 下標起始index(0開始) 下標結束index
127.0.0.1:6379> lpush list1 1(integer) 1127.0.0.1:6379> lpush list1 2(integer) 2127.0.0.1:6379> lpush list1 3(integer) 3127.0.0.1:6379> lrange list1 0 21) "3"2) "2"3) "1"127.0.0.1:6379>127.0.0.1:6379>127.0.0.1:6379> rpush list2 a(integer) 1127.0.0.1:6379> rpush list2 b(integer) 2127.0.0.1:6379> rpush list2 c(integer) 3127.0.0.1:6379> lrange list2 0 21) "a"2) "b"3) "c"127.0.0.1:6379>
set(列表)類型:無序
增加一個:sadd key名 member名 —— 取:smembers key名
增加多個:sadd key名 member1名 member2名 member3名 ........... —— 取:smembers key名
(注意:sadd set1 aa bb cc aa bb,成員有重複時,已添加過的aa,bb自動不再添加。。。)
舉例:
127.0.0.1:6379> sadd set1 aa bb cc dd aa bb(integer) 4127.0.0.1:6379>127.0.0.1:6379>127.0.0.1:6379> smembers set11) "aa"2) "bb"3) "cc"4) "dd"127.0.0.1:6379>
注意:以上執行個體中 aa,bb 添加了兩次,但根據集合內元素的唯一性,第二次插入的元素將被忽略。
zset(sorted set:有序集合)Redis zset 和 set 一樣也是string類型元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
zset的成員是唯一的,但分數(score)卻可以重複。
(比如一個學生的分數75分,這個學生不可能再有別的分數了,這個學生唯一的。
然而得75分的學生有好幾個。所以分數:75分是可以重複)
zadd 命令:
增加一個:zadd key名 score分 成員名 —— 取:smembers key名
增加多個:zadd key名 (score1分 成員1名) (score2分 成員2名) (score3分 成員3名) ...........
—— 第1種取:zrangebyscore stuscore 0 100 (這個理的0-100指的是分數score,50分,60分....)
—— 第2種取:zrange stuscore 0 2 【withscores--指結果帶上分數展示】(這個理的0-2指的是下標index,從0開始....)
注意:並且zset取出時是有排序的。
增加時:stu1 60分,stu2 50分,stu3 90分,取出時順序:stu2 50分,stu1 60分,stu3 90分
127.0.0.1:6379> zadd stuscore 60 stu1(integer) 1127.0.0.1:6379> zadd stuscore 50 stu2(integer) 1127.0.0.1:6379> zadd stuscore 90 stu3(integer) 1127.0.0.1:6379> zrangebyscore stuscore 0 1001) "stu2"2) "stu1"3) "stu3"127.0.0.1:6379> zrange stuscore 0 21) "stu2"2) "stu1"3) "stu3"127.0.0.1:6379> zrange stuscore 0 2 withscores1) "stu2"2) "50"3) "stu1"4) "60"5) "stu3"6) "90"127.0.0.1:6379> zadd stuscore 80 stu4 75 stu5 88 stu6(integer) 3
===========================================================================
指令集錦:
刪除key: del key名
驗證是否存在指定key:exists key名(返回:1--存在 0--不存在)
擷取當前所有的key名 :key * ,
擷取當前所有的good開頭的key名 :key good* ,
取hash中key 的所有欄位名/欄位值:hkeys key名 / hvals key名
127.0.0.1:6379> hkeys user1) "name"2) "age"127.0.0.1:6379> hvals user1) "tom"2) "12"
incr --- 加1操作(遞增1)
decr --- 減1操作(遞減1)
append key名 “字元b”-- 在key名的value後面拼接上字元b
move key 例子:1【0......16】 ---- 把key名的索引值對 移動到 1庫,2庫,3庫.....等(如移入的庫有同名key則不移動)
flushdb -- 清空當前庫裡所有索引值對。
=====================================
3.redis終端中指令學習參見:
http://www.runoob.com/redis/redis-keys.html
更多命令請參考:https://redis.io/commands
4.redis的事務執行(命令模板:1.multi開啟事務 2................一系列指令操作 3.exec開始執行該事務 )
以下是一個事務的例子, 它先以 MULTI 開始一個事務, 然後將多個命令入隊到事務中, 最後由 EXEC 命令觸發事務, 一併執行事務中的所有命令:
(收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行)
redis 127.0.0.1:6379> MULTIOKredis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"QUEUEDredis 127.0.0.1:6379> GET book-nameQUEUEDredis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"QUEUEDredis 127.0.0.1:6379> SMEMBERS tagQUEUEDredis 127.0.0.1:6379> EXEC1) OK2) "Mastering C++ in 21 days"3) (integer) 34) 1) "Mastering Series" 2) "C++" 3) "Programming"
注意:Redis 事務的執行並 不是原子性的。(要麼一起成功,要麼一起失敗 的操作叫 原子性操作。)
Redis 事務執行中,某條指令的失敗不會導致前面已做指令的復原,也不會造成後續的指令不做。
5.Java使用Redis:
package controller;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import java.util.TreeSet;import redis.clients.jedis.Jedis;public class TestConnetRedis {public static void main(String[] args) {//串連本地的 Redis服務//寫法一:Jedis jedis = new Jedis("localhost");//寫法二:Jedis jedis = new Jedis("127.0.0.1", 6379);//若設定了密碼,則需驗證密碼jedis.auth("pass"); System.out.println("串連成功"); //查看服務是否運行 System.out.println("服務正在運行: "+jedis.ping());//<=======================至此,java連結redis資料庫成功======================> System.out.println("<=============至此,java連結redis資料庫成功============>"); /** * 開始應用redis資料庫: */ //Java應用Redis的 String類型(字串) 執行個體 javaUseRedisByString(jedis); //Java應用Redis的 Hash類型(hash) 執行個體 javaUseRedisByHash(jedis); //Java應用Redis的 List(列表) 執行個體 javaUseRedisByList(jedis); //Java應用Redis的 Set類型(set) 執行個體 javaUseRedisBySet(jedis); //Java應用Redis的 all Keys 執行個體 javaUseRedisGetKeys(jedis); }/** * Java應用Redis的 String類型(字串) 執行個體 */public static void javaUseRedisByString(Jedis jedis) {//設定 redis 字串資料===>對應cmd終端中指令:set str1(key名) "111"(value名)jedis.set("str1", "111");jedis.set("str2", "222");jedis.set("str3", "333");//擷取儲存的資料並輸出===>對應cmd終端中指令:get str1(key名)System.out.println("redis 儲存的字串str1為: "+ jedis.get("str1"));System.out.println("redis 儲存的字串str2為: "+ jedis.get("str2"));System.out.println("redis 儲存的字串str3為: "+ jedis.get("str3"));}/** * Java應用Redis的 Hash類型(hash) 執行個體 */private static void javaUseRedisByHash(Jedis jedis) {//設定 redis hash資料===>對應cmd終端中指令:hset user(key名) "name" "tom"(value名)jedis.hset("user", "name", "tom");jedis.hset("user", "age","12");jedis.hset("user", "sex","boy");//擷取儲存的資料並輸出===>對應cmd終端中指令:hgetall user(key名) 或者:hget user(key名) name欄位名System.out.println("redis 儲存的hash資料全部得出hgetall:user為: "+ jedis.hgetAll("user"));/*列印:redis 儲存的hash資料全部得出hgetall:user為: {sex=boy, age=12, name=tom}*/System.out.println("redis 儲存的hash資料:user的name為: "+ jedis.hget("user", "name"));System.out.println("redis 儲存的hash資料:user的age為: "+ jedis.hget("user", "age"));System.out.println("redis 儲存的hash資料:user的sex為: "+ jedis.hget("user", "sex"));//====hmset一次增加多個欄位======================================>System.out.println("====hmset一次增加多個欄位======================================>");//設定 redis hash資料===>對應cmd終端中指令:hset user(key名) value:(name "tom" age 12 sex "boy")Map<String, String> hashmap = new HashMap<String, String>();hashmap.put("name","Lucy");hashmap.put("age","13");hashmap.put("sex","girl");jedis.hmset("user2", hashmap);//擷取儲存的資料並輸出===>對應cmd終端中指令:hgetall user(key名) 或者:hget user(key名) name欄位名System.out.println("redis 儲存的hash資料全部得出hgetall:user2為: "+ jedis.hgetAll("user2"));/*列印:redis 儲存的hash資料全部得出hgetall:user2為: {sex=girl, age=13, name=Lucy}*/List<String> rsmap = jedis.hmget("user", "name", "age", "sex");System.out.println("redis 儲存的hash資料全部得出hmget:user2為: "+rsmap); /*列印:redis 儲存的hash資料全部得出hmget:user2為: [tom, 12, boy]*/}/** * Java應用Redis的 List(列表) 執行個體 */public static void javaUseRedisByList(Jedis jedis) {System.out.println("====逆序(先進後出)排序:====================================>");//儲存資料到列表中===>對應cmd終端中指令:lpush llist1(key名) "1"(value名)jedis.lpush("llist1", "1");jedis.lpush("llist1", "2");jedis.lpush("llist1", "3");//擷取儲存的資料並輸出===>對應cmd終端中指令:lrange llist1(key名)List<String> llist1 = jedis.lrange("llist1", 0, 2);//index範圍:0,1,2全部取出for(int i = 0 ;i < llist1.size();i++){System.out.println("redis 清單項目llist1為: "+ llist1.get(i));}//====正序排序:====================================>System.out.println("====正序(先進先出)排序:====================================>");//儲存資料到列表中===>對應cmd終端中指令:rpush rlist2(key名) "1"(value名)jedis.rpush("rlist2", "a");jedis.rpush("rlist2", "b");jedis.rpush("rlist2", "c");//擷取儲存的資料並輸出===>對應cmd終端中指令:lrange rlist2(key名)List<String> rlist2 = jedis.lrange("rlist2", 0, 2);//index範圍:0,1,2全部取出for(int i = 0 ;i < rlist2.size();i++){System.out.println("redis 清單項目rlist2為: "+ rlist2.get(i));}}/** * Java應用Redis的 Set類型(set) 執行個體 */private static void javaUseRedisBySet(Jedis jedis) {//設定 redis set資料===>對應cmd終端中指令:sadd set1(key名) "s1"(value名)...."s3"(value3名)jedis.sadd("set1", "s1","s2","s3");//擷取儲存的資料並輸出===>對應cmd終端中指令:smembers set1(key名)System.out.println("redis 儲存的set1為: "+ jedis.smembers("set1"));/*列印無序:redis 儲存的set1為: [s3, s2, s1]*/}/** * Java應用Redis的 all Keys 執行個體 */public static void javaUseRedisGetKeys(Jedis jedis) {// 擷取資料並輸出 Set<String> keys = jedis.keys("*"); Iterator<String> it=keys.iterator() ; while(it.hasNext()){ String key = it.next(); System.out.println("redis key名為: "+key); }}}
更為詳盡的多種寫法參見:Java中使用Jedis操作Redis 6.Redis串連池:
package com.test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;public final class RedisUtil { //Redis伺服器IP private static String ADDR = "192.168.0.100"; //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, ADDR, PORT, TIMEOUT, AUTH); } 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); } }}