Redis基礎知識、命令以及java操做Redis

1 nosql的概念

sql:操做(關係型)數據庫的標準查詢語言php

關係型數據庫(rdbms):以關係(由行和列組成的二維表)模型爲核心數據庫,有表的儲存系統。(mysql、oracle、sqlserver...)java

nosql:針對非關係型數據庫的語言,彌補關係型數據庫的一些缺點,主要用到大的數據量或者高併發的場景下。mysql

非關係型數據庫分類:c++

2 Redis

2.1 Redis是什麼

(1) Redis 是一個高性能的 開源的、C語言寫的Nosql(非關係型數據庫),數據保存能夠存儲在內存中或者磁盤中。redis

(2) Redis 是以key-value形式存儲,和傳統的關係型數據庫不同。不必定遵循傳統數據庫的一些基本要求,spring

好比說,不遵循sql標準,事務,表結構等等,redis嚴格上不是一種數據庫,應該是一種數據結構化存儲方sql

法的集合。(數據結構:數組,list,set,map等)數據庫

redis提供了一下操做方法,咱們使用這些方法就能夠對存入字符串,組織成各類類型數據庫結構數組

(string,list,set,map等)緩存

小結:

(1) redis開源 高性能nosql數據庫,數據能夠存儲在內存或磁盤上面

(2) Redis 主要key-value結構形式存儲,redis底層支持各類類型的數據存儲結構

包括 list set map string等。

2.2 特色(優點)

1. 數據保存在內存,存取速度快,併發能力強。

2. 它支持存儲的value類型相對更多,包括string(字符串)list(鏈表)set(集合) zset(sorted set --有序集合)

hash(哈希類型)。

3. redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部分場合能夠對關係數據庫(如MySQL)起到很好的補充做用。

4. 它提供了JavaC/C++C#PHPJavaScript等客戶端,使用很方便。

5. Redis支持集羣(主從同步)。數據能夠主服務器向任意數量從的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。

6. 支持持久化,能夠將數據保存在硬盤的文件中。

7. 支持訂閱/發佈(subscribe/publish)功能 QQ

總結:

  1.  數據存儲:存放在內存,還支持持久化.-存取速度快,併發能力強,數據安全性高

  2. 支持value

  3. 支持多個語言客戶端

  4. 還支持集羣(支持高併發,海量數據)

2.3 Redis的使用場景

(1) 最多,就是緩存(cache 使用空間換取時間) --redis

(2) 計數器應用 -- 微博 熱點新聞 -- 轉載 點贊(高併發)

(3) 實時防攻擊系統 -- 銀行網站 (登陸) --計數 (ip 同一個ip + 5)

redis--支持斷電恢復 內存和磁盤

(4) 有效期的應用 -- 道具 紅包 優惠券 ...

(5) 支持無序的場景 -- set特效

(6) 隊列 -->quene -->秒殺 搶購 --redis

(7) 消息系統訂閱發佈 -->redis(MQ消息隊列--高併發 秒殺 搶購 轉發 )

2.4 Mysql、Memcached和Redis的區別

 

 

mysql

redis

memcached

類型

關係型

非關係型

非關係型

存儲位置

磁盤

磁盤和內存

內存

存儲過時

不支持

支持

支持

讀寫性能

很是高

很是高

3 使用redis-cli客戶端操做Redis

3.1 對字符串操做

對value爲string類型的經常使用操做:

  set key value //將字符串值value關聯到key

  get key //返回key關聯的字符串值

  mset //同時設置一個或多個key-value對

  mget //返回全部(一個或多個)給定key的值

  incr key // key 中儲存的數字值增1(key不存在,則初始化爲0,再加1)

  decr key // key 中儲存的數字值減1(key不存在,則初始化爲0,再減1)

  incrBy key //自增多少

  decrBy key //自減多少

 3.2 對key的經常使用操做

  keys *  //獲取全部key列表

  del key  //刪除key

  expire key xx //設置key的過時時間(xx秒後過時)

  ttl key //查看key的過時時間

  flushall //清空整個redis服務器數據,全部的數據庫所有清空

  flushdb  //清除當前庫,redis中默認有16個數據庫,名稱分別爲0,1,2.。。15

  select index --select 0

3.3 對list集合的經常使用操做

  list集合能夠當作是一個左右排列的隊列(列表)

  lpush key value //將一個或多個值 value 插入到列表 key 的表頭(最左邊)

  rpush key value //將一個或多個值 value 插入到列表 key 的表尾(最右邊)

  lpop key //移除並返回列表 key 的頭(最左邊)元素。

  rpop key //移除並返回列表 key 的尾(最右邊)元素。

  lrange key start stop//返回列表 key 中指定區間內的元素,查詢全部的stop-1便可

  lrem key count value//根據count值移除列表key中與參數 value 相等的元素count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量爲 count count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量爲 count 的絕對值。count = 0 : 移除表中全部與 value 相等的值。

  lindex key index //返回列表 key 中,下標爲 index 的元素

ltrim key start stop //對一個列表進行修剪

存放都是字符串,redis組織成各類數據結構,Redis怎麼實現(FILO)隊列(FIFO)?

   list控制同一邊進同一邊出就是棧

   list控制一邊進另外一邊出就是隊列

3.4 對set集合的經常使用操做

  set集合是一個無序的不含重複值的隊列

  sadd  key member //將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略

  srem key member//移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略

  smembers key    //返回集合 key 中的全部成員。

3.5 對hash類型的經常使用操做

hash類型相似於php的數組

  hset key name value//添加一個name=>value鍵值對到key這個hash類型

  hget key name //獲取hash類型的name鍵對應的值

  hmset key name1 key1 name2 key2 //批量添加name=>value鍵值對到key這個hash類型

  hmget key name1 name2//批量獲取hash類型的鍵對應的值

  hkeys //返回哈希表 key 中的全部鍵

  hvals //返回哈希表 key 中的全部值      

  hgetall //返回哈希表 key 中,全部的鍵和值

3.6 事務(弱事務,不多用)

  multi  //標記一個事務塊的開始。

exec   //執行全部事務塊內的命令。

  弱事務 : 日誌

  強事務 :同時成功 同時失敗-- 金融數據

  discard //取消事務,放棄執行事務塊內的全部命令。

  Redis的事務在執行exec指令時,才批量執行操做,沒有回滾操做

3.7 設置密碼

(1)經過命令動態調整密碼

CONFIG SET 命令能夠動態地調整 Redis 服務器的配置而無須重啓,重啓後失效

CONFIG SET requirepass 123456 //將密碼設置爲123456

CONFIG SET requirepass "" //清除密碼

AUTH 123456  //輸入密碼進行認證

 (2)經過配置文件設置密碼

在配置文件redis.widows.conf中增長一行代碼

requirepass 123456

將密碼123456設置到配置文件中,redis啓動時加載該文件,便可啓用密碼

4 經過java操做Redis

4.1 選擇java客戶端

 原來mysql須要使用jdbc,如今須要redis的一個java客戶端jedis

 jedis是客戶端,而reids是服務器。使用jedis這個java客戶端操做redis數據庫。

4.2 jedis簡單操做

4.2.1 簡單配置

使用jedis客戶端,完成jedis簡單操做

@Test
public void test()throws Exception{
    //建立鏈接
    String host ="127.0.0.1";
    int port = 6379;
    int timeout = 1000;//超時時間,1秒超時
    Jedis jedis = new Jedis(host,port,timeout);
    jedis.auth("admin");
    //執行操做
    jedis.set("yhptest","yhptest dbl!");
    System.out.println(jedis.get("yhptest"));
    //關閉鏈接
    jedis.close();
}

4.2.2 配置鏈接池

經過jedis鏈接池,簡單操做redis數據庫

 

// 思想:若是建立一個對象後須要爲他設置不少值,還不如先建立它配置對象並作完配置,而後再經過配置對象建立它
//1 建立jedispool配置對象
//2 作配置-四個
//3 建立jedispool
//4 經過jedispool獲取鏈接
//5 執行操做
// 6 釋放鏈接
// 7 摧毀鏈接池-若是是真正項目中它應該是一個受spring管理的單例
@Test
public void test()throws Exception{
    //1 建立jedispool配置對象
    JedisPoolConfig config = new JedisPoolConfig();
    //2 作配置-四個
    config.setMaxIdle(2);
    config.setMaxTotal(10);
    config.setMaxWaitMillis(1*1000); //建立鏈接超時
    config.setTestOnBorrow(true);//獲取鏈接是測試鏈接是否暢通
    //3 建立jedispool
    //1*1000 獲取鏈接超時時間
    JedisPool pool = new JedisPool(config,
            "127.0.0.1",6379,1*1000,"admin");
    //4 經過jedispool獲取鏈接
    Jedis jedis = pool.getResource();
    //5 執行操做
    jedis.set("jedispooltest","dbldblddzt.....");
    System.out.println(jedis.get("jedispooltest"));
    // 6 釋放鏈接
    jedis.close(); //底層作了兼容,若是是鏈接池操做就是釋放,若是是鏈接操做就是關閉
    // 7 摧毀鏈接池-若是是真正項目中它應該是一個受spring管理的單例
    pool.destroy();
}

4.3 jedis數據結構操做

@Test
public void testRedis() throws Exception {
    Jedis jedis = new Jedis("127.0.0.1", 6379, 1000 * 10);
    jedis.auth("123456");
    jedis.set("name", "龍傲天");
    System.out.println(jedis.get("name"));
    jedis.close();
}

@Test
public void testRedisPool() throws Exception {
    //鏈接池
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxIdle(2);
    config.setMaxTotal(10);
    JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 1000 * 10, "123456");
    Jedis jedis = jedisPool.getResource();
    jedis.flushDB();
    //字符串操做
    jedis.set("name", "趙日天");
    jedis.set("age", "18");
    System.out.println(jedis.get("name"));
    System.out.println(jedis.get("age"));
    System.out.println(jedis.keys("*"));
    System.out.println("========================================");
    //list集合操做
    jedis.lpush("students","五五開","蕪湖神","王慕霸","古手羽","蕪湖神");
    System.out.println(jedis.lrange("students", 0, -1));
    jedis.lrem("students", 1, "蕪湖神");
    System.out.println(jedis.lrange("students", 0, -1));
    System.out.println("========================================");
    //set集合操做
    jedis.sadd("users","古天樂","劉德華","梁朝偉","黎明","張學友","劉德華");
    System.out.println(jedis.smembers("users"));
    jedis.srem("users","張學友");
    System.out.println(jedis.smembers("users"));
    System.out.println("========================================");
    //hash操做
    jedis.hset("players", "name","James");
    System.out.println(jedis.hget("players", "name"));
    System.out.println("========================================");
    //排序
    jedis.lpush("nums","3","6","2","9","1");
    System.out.println(jedis.lrange("nums", 0, -1));
    System.out.println(jedis.sort("nums",new SortingParams().desc()));
    jedis.lpush("language","php","c++","java","h5","test","ui");
    System.out.println(jedis.lrange("language", 0, -1));
    SortingParams sortingParams = new SortingParams().desc().alpha();
    System.out.println(jedis.sort("language", sortingParams));
    jedis.flushDB();
    jedis.close();
    jedisPool.destroy();
}

事務操做

@Test
public void testTransaction() throws Exception {
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxIdle(2);
    config.setMaxTotal(10);
    JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 1000 * 10, "123456");
    Jedis jedis = jedisPool.getResource();
    jedis.flushDB();
    jedis.set("name", "XXX");
    jedis.set("age", "18");
    Transaction transaction = jedis.multi();
    transaction.incr("name");
    transaction.incr("age");
    List<Object> exec = transaction.exec();
    System.out.println(exec);
    jedis.close();
    jedisPool.destroy();
}

5 Redis持久化

持久化(持久層,dao層,mapper層):把數據保存到磁盤的過程就叫持久化

Redis支持內存和磁盤存儲,磁盤存儲提供兩種方案:

 rdb方式:save 1 1 最快的保存方法,1s中發生一次變化,若是保存數據在1s內完成,容易形成數據丟失,丟失1s數據。

 aof方式:開啓 appendonly yes ,在操做的時候,把數據寫到日誌文件,在啓動的時候 ,恢復日誌文件(日誌方式)。

6 Redis的淘汰策略

何時才淘汰數據: --》內存到必定極限的時候,這個時候,須要淘汰數據

淘汰一些數據,達到redis數據都是有效的。選擇合適的淘汰策略進行淘汰。

volatile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰

volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰

 

volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰

allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰

allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰

no-enviction(驅逐):禁止驅逐數據

 

redis 肯定驅逐某個鍵值對後,會刪除這個數據並,並將這個數據變動消息發佈到本地(AOF 持久化)和從機(主從鏈接)。

lru: 最近最少使用 -- 經常使用 (統計次數)

ttl: 將要過時中淘汰 --也能夠 (統計時間)

random:隨機數據 --這個數據就沒有那麼重要 (隨機)

相關文章
相關標籤/搜索