• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • NoSql及Redis認識

    一、NoSql

    1.1 概念

    • NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,它泛指非關系型的數據庫。
    • 隨著互聯網2003年之后web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高并發的交友類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題。
    • 而非關系型的數據庫則由于其本身的特點得到了非常迅速的發展。
    • 關系型數據庫:以關系(由行和列組成的二維表)模型為核心數據庫,有表的儲存系統。

    1.2 分類

    分類

    二、Redis

    2.1 概念

    • (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.它提供了Java,C/C++,C#,PHP,JavaScript等客戶端,使用很方便。

    • 5.Redis支持集群(主從同步)。數據可以主服務器向任意數量從的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。

    • 6.支持持久化,可以將數據保存在硬盤的文件中

    • 7.支持訂閱/發布(subscribe/publish)功能 QQ群

    2.3 Mysql、Memcached、Redis的比較

    mysql redis memcached
    類型 關系型 非關系型 非關系型
    存儲位置 磁盤 磁盤和內存 內存
    存儲過期 不支持 支持 支持
    讀寫性能 非常高 非常高
    存儲的結構 支持很多 list/set/array/string/map等 普通鍵值對key-value

    2.4 使用場景

    2.4.1 緩存

    • 經常查詢數據,放到讀速度很快的空間(內存),以便下次訪問減少時間。
    • 減輕數據庫壓力,減少訪問時間.而redis就是存放在內存中的。

    2.4.2 計數器應用

    • 網站通常需要統計注冊用戶數,網站總瀏覽次數等等

    • 新浪微博轉發數、點贊數

    2.4.3 實時攻防系統

    • 銀行網站 (登錄) 超過次數就限制
    • redis–支持斷電恢復 內存和磁盤

    2.4.4 有效期的應用

    • 設定一個數據,到一定時間失效
    • 如:道具 紅包 優惠券

    2.4.5 自動去重應用

    • 支持set

    2.4.6 隊列

    • 構建隊列系統 使用 list 可以構建隊列系統,使用 sorted set 甚至可以構建有優先級的隊列系統。
    • 秒殺:可以把名額放到內存隊列(redis),內存就能處理高并發訪問。

    2.4.7 消息訂閱系統

    • Pub/Sub 構建實時消息系統 Redis 的 Pub/Sub 系統可以構建實時的消息系統,比如很多用 Pub/Sub 構建的實時聊天系統 的例子。
    • redis(MQ消息隊列–高并發 秒殺 搶購 轉發 )

    2.5 安裝

    • 解壓即可—Redis-x64-3.2.100.zip
    • 下載 Redis-3.2.100
    • 提取碼 9uzr

    2.6 基于控制臺操作

    2.6.1 對字符串的操作

    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		//自減多少
    

    2.6.2 對key的常用操作

    keys *  		//獲取所有key列表
    del key  		//刪除key
    expire key xx	//設置key的過期時間(xx秒后過期)
    ttl key 		//查看key的過期時間
    flushall 		//清空整個redis服務器數據,所有的數據庫全部清空
    flushdb  		//清除當前庫,redis中默認有16個數據庫,名稱分別為0,1,2.。。15
    

    2.6.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 	//對一個列表進行修剪
    
    list控制同一邊進,同一邊出就是棧
    list控制一邊進,另一邊出就是隊列.
    

    2.6.4 對set集合的常用操作

    set集合是一個無序的不含重復值的隊列
    sadd  key member //將一個或多個 member 元素加入到集合 key 當中,已經存在于集合的 member 元素將被忽略
    srem key member  //移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略
    smembers key     //返回集合 key 中的所有成員。
    

    2.6.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 中,所有的鍵和值
    

    2.6.6 事務

    multi  //標記一個事務塊的開始。
    exec   //執行所有事務塊內的命令。
    弱事務 :日志
    強事務 :同時成功 同時失敗-- 金融數據
    discard //取消事務,放棄執行事務塊內的所有命令。
    Redis的事務在執行exec指令時,才批量執行操作,沒有回滾操作
    

    2.6.7 訂閱/發布

    SUBSCRIBE channel [channel ...] //訂閱給定的一個或多個頻道的信息。
    PUBLISH channel message 		//將信息 message 發送到指定的頻道 channel 。
    

    栗子

    2.6.8 設置密碼

    • ①通過命令動態調整密碼

      CONFIG SET 命令可以動態地調整 Redis 服務器的配置而無須重啟,重啟后失效
      CONFIG SET requirepass 123456 //將密碼設置為123456
      CONFIG SET requirepass "" //清除密碼
      AUTH 123456  //輸入密碼進行認證
      
    • ②通過配置文件設置密碼

    
    (1)在配置文件 redis.windows.conf -- 中添加 requirepass 123456(密碼)
    (2)在客服端(控制臺)啟動的時候  redis-server.exe redis.windows.conf
    (3)auth 123456
    

    2.6.9 對SortedSet(有序集合)的操作

    • 查看api
    • 下載 API
    • 提取碼 48xl

    2.7 java操作Redis

    • 導包
      commons-pool2-2.2.jar
      jedis-2.5.2.jar
    • 簡單配置
    @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();
    }
    

    2.7.1 key操作

    System.out.println(jedis.keys("*"));//查看所有的key
    

    2.7.2 String操作

    System.out.println(jedis.set("name","zhangsan"));//新增
    System.out.println(jedis.get("name"));//獲取
    System.out.println(jedis.set("name","zhangsan1"));//修改
    System.out.println(jedis.get("name"));//獲取
    System.out.println(jedis.del("name"));//刪除
    System.out.println(jedis.keys("*"));//查看所有的key
    

    2.7.3 List操作

    jedis.lpush("students1","1","2","3","5","6");
    System.out.println(jedis.lrange("students1", 0, 3));
    

    2.7.4 Set操作

    jedis.sadd("students2","a1","b1","c1","b1");
    System.out.println(jedis.smembers("students2"));
    

    2.7.5 Hash操作

    jedis.hset("students3","student","zhangsan");
    System.out.println(jedis.hget("students3", "student"));
    

    2.7.6 排序操作

    //對數字排序
    jedis.flushDB();
    jedis.lpush("nums","1","2","3","4","8","5","3","1");
    System.out.println(jedis.sort("nums"));
    SortingParams sortingParams1 = new SortingParams();
    sortingParams1.desc();
    System.out.println(jedis.sort("nums", sortingParams1));
    
    //對字母排序要用 SortingParams  
    jedis.lpush("langues","java","php","c++","test","ui");
    SortingParams sortingParams = new SortingParams();
    sortingParams.alpha();
    sortingParams.desc();
    
    System.out.println(jedis.sort("langues",sortingParams));
    

    2.8 持久化操作

    • 持久(持久層 dao層 mapper層): 就把數據保存到磁盤 這個過程就叫持久化
    • redis支持內存和磁盤存儲
    • redis磁盤存儲提供兩種方案:
      rdb方式
    RDB 持久化可以在指定的時間間隔內生成數據集的時間點快照,默認開啟該模式.
    如何關閉 rdb 模式:
    save ""
    # save 900 1        //至少在900秒的時間段內至少有一次改變存儲同步一次
    # save xxx
    # save 60 10000
    

    aof方式

    AOF 持久化記錄服務器執行的所有寫操作命令,并在服務器啟動時,通過重新執行這些命令來還原數據集,默認關閉該模式。
    如何開啟aof模式:
    appendonly yes         //yes 開啟,no 關閉
    # appendfsync always //每次有新命令時就執行一次fsync 
    #這里我們啟用 everysec
    appendfsync everysec //每秒 fsync 一次
    # appendfsync no      //從不fsync(交給操作系統來處理,可能很久才執行一次fsync)
    

    2.9 淘汰策略

    • 什么時候才淘汰數據: --》內存到一定極限的時候,這個時候,需要淘汰數據
    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 持久化)和從機(主從連接)。
    
    版權聲明:本文為qq_20252399原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_20252399/article/details/103620172

    智能推薦

    NoSQL之Redis集群

    文章目錄 案例概述 Redis集群介紹 Redis群集實驗 實驗環境 推薦步驟 案例概述 單節點Redis服務器帶來的問題 ●單點故障,服務不可用 ●無法處理大量的并發數據請求 ●數據丟失–大災難 解決方法 ●搭建Redis集群 Redis集群介紹 ●Redis集群是一個提供在多個Redis間節點間共享數據的程序集 ●Redis集群并不支持處理多個keys的命令,因為這需要在不同的節點...

    NoSQL之Redis群集

    文章目錄 發展背景 Redis集群介紹 Redis集群的優勢 Redis集群的實現方法 Redis-Cluster數據分片 Redis群集的數據分片 支持熱添加添加或者刪除節點 Redis-Cluster的主從復制模型 Redis群集配置示例 案例環境 案例配置 安裝Redis 主Redis配置 安裝ruby添加節點 從Redis配置 發展背景 單節點Redis服務器帶來的問題 單點故障,服務不可...

    NOSQL—1.redis

    1.了解NoSql  1.1 什么是Nosql  NoSQL,泛指非關系型的數據庫。隨著互聯網web2.0網站的興起,傳統的關系數據庫在處理web2.0網站,特別是超大規模和高并發的SNS類型的web2.0純動態網站已經顯得力不從心,出現了很多難以克服的問題,而非關系型的數據庫則由于其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是為了解決大規模數據集合,多重數據種類...

    1、Redis:Nosql概述

    文章目錄 1.1、為什么要用Nosql 1.1.1、單機MySQL的年代 1.1.2、Memcached(緩存)+Mysql + 垂直拆分(讀寫分離) 1.1.3、分庫分表 + 水平拆分 + Mysql集群 1.1.4、如今最近的年代 1.1.5、目前一個基本的互聯網項目 1.1.6、為什么要用NoSQL 1.2、什么是NoSQL 1.2.1、NoSQL 1.2.2、NoSQL特點 1.2.3、了...

    NoSQL搭建Redis集群

    摘要 redis是一個開源的key value存儲系統,受到了廣大互聯網公司的青睞。redis3.0版本之前只支持單例模式,在3.0版本及以后才支持集群,我這里用的是redis3.0.0版本; redis集群采用P2P模式,是完全去中心化的,不存在中心節點或者代理節點; redis集群是沒有統一的入口的,客戶端(client)連接集群的時候連接集群中的任意節點(node)即可,集群內部的節點是相互...

    猜你喜歡

    3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習

    3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 3D游戲編程與設計——游戲對象與圖形基礎章節作業與練習 自學資源 作業內容 1、基本操作演練【建議做】 天空盒的制作: 地圖的制作: 整體效果: 2、編程實踐 項目要求: 項目結構: 代碼詳解: Actions: ISSActionCallback.cs SSAction.cs SSAction...

    FlycoTabLayout 的使用

    FlycoTabLayout 一個Android TabLayout庫,目前有3個TabLayout SlidingTabLayout:參照PagerSlidingTabStrip進行大量修改. 新增部分屬性 新增支持多種Indicator顯示器 新增支持未讀消息顯示 新增方法for懶癌患者 CommonTabLayout:不同于SlidingTabLayout對ViewPager依賴,它是一個不...

    爬蟲項目實戰八:爬取天氣情況

    爬取天氣情況 目標 項目準備 接口分析 代碼實現 效果顯示 寫入本地 目標 根據天氣接口,爬取接下來一周的天氣情況。 項目準備 軟件:Pycharm 第三方庫:requests,BeautifulSoup,csv 接口地址:http://api.k780.com:88/?app=weather.future&weaid=城市名&appkey=10003&sign=b59bc...

    關于web項目的目錄問題

    先給段代碼: 上面這個代碼一直出錯,我不知道原因,后面不停的查找資料發現了問題:我的web項目輸出目錄有問題,因為我也是第一次用idea寫web項目,發現很多bug 其實都沒有太大問題,我們需要注意的是你必須在out這個輸出文件夾中擁有這個文件,out輸出文件夾會默認過濾這些文件...

    二叉搜索樹轉化為雙向鏈表

    題目描述: 輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的循環雙向鏈表。要求不能創建任何新的節點,只能調整樹中節點指針的指向。 為了讓您更好地理解問題,以下面的二叉搜索樹為例: 我們希望將這個二叉搜索樹轉化為雙向循環鏈表。鏈表中的每個節點都有一個前驅和后繼指針。對于雙向循環鏈表,第一個節點的前驅是最后一個節點,最后一個節點的后繼是第一個節點。 下圖展示了上面的二叉搜索樹轉化成的鏈表。&ldqu...

    精品国产乱码久久久久久蜜桃不卡