Redis數據庫 01概述| 五大數據類型

 

一、NoSQL數據庫簡介

解決應用服務器的CPU和內存壓力;解決數據庫服務的IO壓力;java

----->>> ① session存在緩存數據庫(徹底在內存裏),速度快且數據結構簡單;c++

打破了傳統關係型數據庫業務邏輯爲依據的存儲模式,而針對不一樣數據結構類型改成以性能爲最優先的存儲方式--非關係型數據庫K, Vredis

② 緩存數據庫:減小io的讀操做(緩存數據庫中有的直接從緩存數據庫裏邊去取,沒有再去數據庫裏邊查找,減小了IO的操做);sql

列式數據庫如Hbase文檔數據庫Mongodb;水平切分、垂直切分、讀寫分離;經過破壞必定的業務邏輯來換取性能數據庫

 

NoSQL(NoSQL = Not Only SQL ),意即「不只僅是SQL」,泛指非關係型的數據庫json

NoSQL 不依賴業務邏輯方式存儲,而以簡單的key-value模式存儲。所以大大的增長了數據庫的擴展能力。windows

不遵循SQL標準。不支持ACID。遠超於SQL的性能。NoSQL適用場景數組

 NoSQL適用場景:緩存

對數據高併發的讀寫;海量數據的讀寫;對數據高可擴展性的安全

NoSQL不適用場景:

須要事務支持;基於sql的結構化查詢存儲,處理複雜的關係,須要即席查詢

Memcached和Redis的區別:ms

Memcached

數據都在內存中,不支持久化

支持簡單的key-value模式

通常是做爲緩存數據庫輔助持久化的數據庫

③ 多線程+鎖(memcached)

Redis

幾乎覆蓋了Memcached的絕大部分功能

數據都在內存中,支持持久化,主要用做備份恢復

② 除了支持簡單的key-value模式,還支持多種數據結構的存儲,好比String、 listset、zset、hash五大數據類型

通常是做爲緩存數據庫輔助持久化的數據庫

③ 單線程+多路IO複用(Redis)

 

mongoDB

高性能、開源、模式自由(schema  free)文檔型數據庫

數據都在內存中, 若是內存不足,把不經常使用的數據保存到硬盤

雖然是key-value模式,可是對value(尤爲是json)提供了豐富的查詢功能

支持二進制數據及大型對象

能夠根據數據的特色替代RDBMS ,成爲獨立的數據庫。或者配合RDBMS,存儲特定的數據。

 

 行式存儲數據庫(即關係型數據庫),一行一行的存儲

第一個須要IO1次,行式存儲;第二個須要IO3次,id=1,id=2,id=3

列式存儲數據庫

查詢年齡(IO1次)的要快於查詢id=3的(IO4次);

行式存儲查詢快,統計慢;列式存儲查詢慢,統計快;

 

HBase--列式數據庫

HBase是Hadoop項目中的數據庫。它用於須要對大量的數據進行隨機、實時的讀寫操做的場景中。HBase的目標就是處理數據量很是龐大的表,能夠用普通的計算機處理超過10億行數據,還可處理有數百萬列元素的數據表。

Cassandra

Apache Cassandra是一款免費的開源NoSQL數據庫,其設計目的在於管理由大量商用服務器構建起來的龐大集羣上的海量數據集(數據量一般達到PB級別)。在衆多顯著特性當中,Cassandra最爲卓越的長處是對寫入及讀取操做進行規模調整,並且其不強調主集羣的設計思路可以以相對直觀的方式簡化各集羣的建立與擴展流程。

Noe4j

 

主要應用:社會關係,公共交通網絡,地圖及網絡拓譜

二、Redis

Redis是一個開源的key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,Redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是Redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。

  • 一、配合關係型數據庫作高速緩存
  • 高頻次,熱門訪問的數據,下降數據庫IO
  • 分佈式架構,作session共享
  • 二、因爲其擁有持久化能力,利用其多樣的數據結構存儲特定的數據。

 

三、Redis3.2.5 for Linux的安裝

  一、下載得到redis-3.2.5.tar.gz後將它放入咱們的Linux目錄/opt

     Alt+p彈出框, àsftp> pwd   cd /opt/ 而後把壓縮包拖到裏邊

  二、解壓命令:tar -zxvf redis-3.2.5.tar.gz

  三、解壓完成後進入目錄:cd redis-3.2.5

  四、在redis-3.2.5目錄下執行make命令

運行make命令時出現故障意出現的錯誤解析:gcc:命令未找到

  能上網:--->>

      yum install gcc

      yum install gcc-c++

  五、在redis-3.2.5目錄下再次執行make命令

    Jemalloc/jemalloc.h:沒有那個文件

    解決方案:運行make distclean以後再 make

  六、在redis-3.2.5目錄下再次執行make命令

 

  Redis Test(能夠不用執行)

  執行完make後,跳過Redis test 繼續執行make install

 

  查看默認安裝目錄:usr/local/bin      cd /usr/local/bin

 

[kris@hadoop local]$ cd /usr/local/bin [kris@hadoop bin]$ ll 總用量 26340 -rwxr-xr-x. 1 root root 5580327 1月 10 13:25 redis-benchmark 性能測試工具,能夠在本身本子運行,看看本身本子性能如何(服務啓動起來後執行) -rwxr-xr-x. 1 root root 22217 1月 10 13:25 redis-check-aof 修復有問題的AOF文件,rdb和aof後面講 -rwxr-xr-x. 1 root root 7826782 1月 10 13:25 redis-check-dump 修復有問題的dump.rdb文件 -rwxr-xr-x. 1 root root 5709036 1月 10 13:25 redis-cli      客戶端,操做入口 lrwxrwxrwx. 1 root root 12 1月 10 13:25 redis-sentinel -> redis-server Redis集羣使用 -rwxr-xr-x. 1 root root 7826782 1月 10 13:25 redis-server            Redis服務器啓動命令 [kris@hadoop bin]$ 

啓動:

一、備份redis.conf:拷貝一份redis.conf到其餘目錄

[root@kris bin]# ps -ef | grep redis   root 7901 3479 3 10:29 pts/0 00:00:00 grep redis 查看到redis進程已關 [root@kris bin]# cd /opt/redis-3.2.5 ll查看這個目錄下命令   mkdir /root/myredis   cp redis.conf /root/myredis 複製備份redis.conf文件

 

二、修改redis.conf文件將裏面的daemonize no 改爲 yes,讓服務在後臺啓動

cd myredis/ vi redis.conf

 

三、啓動命令:執行  redis-server   /myredis/redis.conf

redis-server redis.conf redis-cli

 

四、用客戶端訪問: redis-cli

 

   多個端口能夠 redis-cli  –p  6379

 

 五、測試驗證: ping

 

 

  單實例關閉:redis-cli shutdown  也是把redis服務器關了;

 

 

  也能夠進入終端後再關閉shutdown ;關閉服務器,而不是把客戶端給關閉了;關閉客戶端是ctrl+c,進程直接就關閉了!!

 

 

  多實例關閉,指定端口關閉:Redis-cli -p 6379 shutdown

概述:

  端口號6379來自於Alessia Merz

  默認16個數據庫,相似數組下標從0開始,初始默認使用0號庫

  使用命令 select   <dbid>  來切換數據庫。如: select 8

  統一密碼管理,全部庫都是一樣密碼,要麼都OK要麼一個也鏈接不上。

  Redis是單線程+多路IO複用技術

          多路複用是指使用一個線程來檢查多個文件描述符(Socket)的就緒狀態,好比調用select和poll函數,傳入多個文件描述符,若是有一個文件描述符就緒,則返回,不然阻塞直到超時。獲得就緒狀態後進行真正的操做能夠在同一個線程裏執行,也能夠啓動線程執行(好比使用線程池)。

  串行 vs 多線程+鎖(memcached) vs 單線程+多路IO複用(Redis)

 所有過來,一個個的進行服務,其餘的要等着即串行;所有過來,每一個人前面都有人給服務,鎖就是調酒師只能一個個來給他們調,沒輪到的就先鎖住了即多線程+鎖;

所有過來,一我的給他們服務,但服務人員效率快(多路IO複用技術),立刻就服務完了,充分利用了CPU即單線程+多路IO複用;

四、 Redis五大數據類型

 

  key

 keys * 查詢當前庫的全部鍵
exists <key> 判斷某個鍵是否存在 type
<key> 查看鍵的類型 del <key> 刪除某個鍵 expire <key> <seconds> 爲鍵值設置過時時間,單位秒。 ttl <key> 查看還有多少秒過時,-1表示永不過時,-2表示已過時 dbsize 查看當前數據庫的key的數量 flushdb 清空當前庫
[root@hadoop myredis]# redis-server redis.conf [root@hadoop myredis]# redis-cli 127.0.0.1:6379> 
127.0.0.1:6379> flushdb OK 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> expire k1 30 (integer) 1
127.0.0.1:6379> ttl k1 (integer) 26
127.0.0.1:6379> ttl k1 (integer) 5
127.0.0.1:6379> ttl k1 (integer) -2   表示已過時;過時以後k1就會被從數據庫中刪除掉;

 127.0.0.1:6379> keys *
 (empty list or set)

① String

  • String是Redis最基本的類型,你能夠理解成與Memcached如出一轍的類型,一個key對應一個value。
  • String類型是二進制安全的。意味着Redis的string能夠包含任何數據。好比jpg圖片或者序列化的對象 。
  • String類型是Redis最基本的數據類型,一個Redis中字符串value最多能夠是512M
get <key> 查詢對應鍵值 set <key> <value> 只能添加1對鍵值對 添加鍵值對 append <key> <value> 將給定的<value> 追加到原值的末尾 strlen <key> 得到值的長度 setnx <key> <value> 只有在 key 不存在時纔會設置key 的值; k v incr <key>key 中儲存的數字值增1 只能對數字值操做,若是爲空,新增值爲1 decr <key>key 中儲存的數字值減1 只能對數字值操做,若是爲空,新增值爲-1 incrby / decrby <key> <步長>key 中儲存的數字值增減。自定義步長。
127.0.0.1:6379> append k1 aaaaa (integer) 7
127.0.0.1:6379> get k1 "v1aaaaa"

127.0.0.1:6379> set k3 3
127.0.0.1:6379> type k2 string
127.0.0.1:6379> incr k3 (integer) 4
127.0.0.1:6379> get k3 "4"
127.0.0.1:6379> decr k3 (integer) 3
127.0.0.1:6379> get k3 "3"
127.0.0.1:6379> incrby k3 5 (integer) 8
127.0.0.1:6379> get k3 "8"

原子性

  • 所謂原子操做是指不會被線程調度機制打斷的操做;這種操做一旦開始,就一直運行到結束,中間不會有任何 context switch (切換到另外一個線程)。
  • (1) 在單線程中, 可以在單條指令中完成的操做均可以認爲是" 原子操做",由於中斷只能發生於指令之間。
  • (2)在多線程中,不能被其它進程(線程)打斷的操做就叫原子操做。
  • Redis單命令的原子性主要得益於Redis的單線程
mset <key1> <value1> <key2> <value2> ..... 同時設置一個或多個 key-value對 mget <key1> <key2> <key3> ..... 同時獲取一個或多個 value msetnx <key1> <value1> <key2> <value2> ..... 同時設置一個或多個 key-value 對,當且僅當全部給定 key 都不存在。 getrange <key> <起始位置> <結束位置> 得到值的範圍,相似java中的substring setrange <key> <起始位置> <value><value> 覆寫<key> 所儲存的字符串值,從<起始位置>開始。 setex <key> <過時時間> <value> 設置鍵值的同時,設置過時時間,單位秒。 getset <key> <value> 以新換舊,設置了新值同時得到舊值。

② List

  • 單鍵多值
  • Redis 列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
  • 它的底層實際是個雙向鏈表,對兩端的操做性能很高,經過索引下標的操做中間的節點性能會較差。
lpush/rpush <key> <value1> <value2> <value3> .... 從左邊/右邊插入一個或多個值。 lpop/rpop <key> 從左邊/右邊吐出一個值。 值在鍵在,值亡鍵亡。吐出來就從原來的刪除了 rpoplpush <key1> <key2><key1>列表右邊吐出一個值,插到<key2>列表左邊。 lrange <key> <start> <stop> 按照索引下標得到元素(從左到右) lindex <key> <index> 按照索引下標得到元素(從左到右) llen <key> 得到列表長度 linsert <key> before <value> <newvalue><value>的前面插入<newvalue> lrem <key> <n> <value> 從左邊刪除n個value(從左到右)

 

 ③ Redis set

  • Redis set對外提供的功能與list相似是一個列表的功能,特殊之處在於set是能夠自動排重的,當你須要存儲一個列表數據,又不但願出現重複數據時,set是一個很好的選擇,而且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。
  • Redis的Set是string類型的無序集合。它底層實際上是一個value爲null的hash表,因此添加,刪除,查找的複雜度都是O(1)。
sadd <key> <value1> <value2> ..... 將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。 smembers <key> 取出該集合的全部值。 sismember <key> <value> 判斷集合<key>是否爲含有該<value>值,有返回1,沒有返回0 scard <key> 返回該集合的元素個數。 srem <key> <value1> <value2> .... 刪除集合中的某個元素。 spop <key> [count] 隨機從該集合中吐出一個值。吐出就刪除掉了 srandmember <key> <n> 隨機從該集合中取出n個值。 不會從集合中刪除 sinter <key1> <key2> 返回兩個集合的交集元素。 sunion <key1> <key2> 返回兩個集合的並集元素。 sdiff <key1> <key2> 返回兩個集合的差集元素。

 

④ Redis hash

  • Redis  hash 是一個鍵值對集合。
  • Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
  • 相似Java裏面的Map<String,Object>
hset <key> <field> <value><key>集合中的 <field>鍵賦值<value> hget <key1> <field><key1>集合<field> 取出 value hmset <key1> <field1> <value1> <field2> <value2>... 批量設置hash的值 hexists key <field> 查看哈希表 key 中,給定域 field 是否存在。 hkeys <key> 列出該hash集合的全部field hvals <key> 列出該hash集合的全部value hincrby <key> <field> <increment> 爲哈希表 key 中的域 field 的值加上增量 increment hsetnx <key> <field> <value> 將哈希表 key 中的域 field 的值設置爲 value ,當且僅當域 field 不存在 .

 

⑤ Redis zset

       Redis有序集合zset與普通集合set很是類似,是一個沒有重複元素的字符串集合。不一樣之處是有序集合的全部成員都關聯了一個評分(score) ,這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是惟一的,可是評分能夠是重複了 。

       由於元素是有序的, 因此你也能夠很快的根據評分(score)或者次序(position)來獲取一個範圍的元素。訪問有序集合的中間元素也是很是快的,所以你可以使用有序集合做爲一個沒有重複成員的智能列表。

zadd <key> <score1> <value1> <score2> <value2>... 將一個或多個 member 元素及其 score 值加入到有序集 key 當中。 zrange <key> <start> <stop> [WITHSCORES] 返回有序集 key 中,下標在<start> <stop>之間的元素 帶WITHSCORES,可讓分數一塊兒和值返回到結果集。 zrangebyscore key min max [withscores] [limit offset count] 返回有序集 key 中,全部 score 值介於 minmax 之間(包括等於 minmax )的成員。有序集成員按 score 值遞增(從小到大)次序排列。 zrevrangebyscore key max min [withscores] [limit offset count] 同上,改成從大到小排列。 zincrby <key> <increment> <value> 爲元素的score加上增量 zrem <key> <value> 刪除該集合下,指定值的元素 zcount <key> <min> <max> 統計該集合,分數區間內的元素個數 zrank <key> <value> 返回該值在集合中的排名,從0開始。

 

五、 JAVA的Redis客戶端Jedis

 Jedis所需的jar包

  Commons-pool-1.6.jar
  Jedis-2.1.0.jar

windows中的Eclipse鏈接虛擬機的Redis的注意事項
  禁用Linux的防火牆:
  臨時禁用:service iptables stop
  關閉開機自啓:chkconfig iptables off
  redis.conf中註釋掉bind 127.0.0.1(61行) ,而後 protect-mode(80行)設置爲 no。

public class TestJedis { Jedis jedis = new Jedis("192.168.1.100", 6379); public void main(String[] args) { } //測試鏈接是否成功  @Test void test1() { System.out.println("Connection success:" + jedis.ping()); } }
相關文章
相關標籤/搜索