NoSql及Redis認識
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 持久化)和從機(主從連接)。
智能推薦
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...