Redis資料庫學習簡記

來源:互聯網
上載者:User

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);        }    }}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.