redis入門

1.1 歷史

    1. 訪問量的上升,MySQL架構網站性能降低html

    2. 數據量的總大小 一個機器放不下時mysql

    3.數據的索引(B+ Tree)一個機器的內存放不下時web

    4. 訪問量(讀寫混合)一個實例不能承受redis

1.1.1 MySQL的擴展性瓶頸

Mysql數據庫也常常存儲一些打文本字段,致使數據庫很是的大,在作數據恢復的時候就致使很是的滿,算法

雖然關係型數據庫很強大但它並不能很好的應對全部應用場景下大數據下的IO,表結構更改困難正式當前使用MYsql開發人員面臨的問題sql

1.2 NoSQL的優勢

    1. 數據之間無關係,這樣就很是容易擴展。也無形之間,在架構的層面上帶來了可擴展的能力。

           注意 : 架構指的是(水平擴展是集羣,垂直擴展是硬件)數據庫

     2.大數據量高性能windows

            通常MySQL使用Query Cache,每次表的更新Cache就失效,是一種大粒度的Cache,緩存

            而NoSQL的Cache是記錄級的,是一種細粒度的Cache,因此NoSQL在這個層面上來講就要性能高不少了安全

        3.多樣靈活的數據模型

              NoSQL無需事先爲要存儲的數據創建字段,隨時能夠存儲自定義的數據格式

   1.2.1 Redis的優勢

        Redis支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。

        Redis不只僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。

        Redis支持數據的備份,即master-slave模式的數據備份。

         基於內存

         結構稀疏

         弱化事務

         豐富的數據類型

     Redis的缺點:

      redisACID處理很是簡單)沒法作到太複雜的關係數據庫模型

 1. 3 傳統的ACID分別是什麼?

關係型數據庫遵循ACID規則

事務在英文中是transaction,和現實世界中的交易很相似,它有以下四個特性: 

一、A (Atomicity) 原子性

原子性很容易理解,也就是說事務裏的全部操做要麼所有作完,要麼都不作,事務成功的條件是事務裏的全部操做都成功,只要有一個操做失敗,整個事務就失敗,須要回滾。好比銀行轉帳,從A帳戶轉100元至B帳戶,分爲兩個步驟:1)從A帳戶取100元;2)存入100元至B帳戶。這兩步要麼一塊兒完成,要麼一塊兒不完成,若是隻完成第一步,第二步失敗,錢會莫名其妙少了100元。

 

二、C (Consistency) 一致性

一致性也比較容易理解,也就是說數據庫要一直處於一致的狀態,事務的運行不會改變數據庫本來的一致性約束。

 

三、I (Isolation) 獨立性

所謂的獨立性是指併發的事務之間不會互相影響,若是一個事務要訪問的數據正在被另一個事務修改,只要另一個事務未提交,它所訪問的數據就不受未提交事務的影響。好比現有有個交易是從A帳戶轉100元至B帳戶,在這個交易還未完成的狀況下,若是此時B查詢本身的帳戶,是看不到新增長的100元的

四、D (Durability) 持久性

持久性是指一旦事務提交後,它所作的修改將會永久的保存在數據庫上,即便出現宕機也不會丟失。

1.4 CAP的內容

C:Consistency(強一致性)

A:Availability(可用性)

P:Partition tolerance(分區容錯性)

CAP的3進2 

CAP理論就是說在分佈式存儲系統中,最多隻能實現上面的兩點。而因爲當前的網絡硬件確定會出現延遲丟包等問題,因此分區容忍性是咱們必須須要實現的。

因此咱們只能在一致性和可用性之間進行權衡,沒有NoSQL系統能同時保證這三點。

=======================================================================================================================

C:強一致性 A:高可用性 P:分佈式容忍性

 

 CA :傳統Oracle數據庫        一致性  高可用

 AP: 大多數網站架構的選擇    可用性,分區容錯性

 CP: Redis、Mongodb           一致性 分區容錯性

 

 注意:分佈式架構的時候必須作出取捨。

一致性和可用性之間取一個平衡。多餘大多數web應用,其實並不須要強一致性。

所以犧牲C換取P,這是目前分佈式數據庫產品的方向

=======================================================================================================================

致性與可用性的決擇

對於web2.0網站來講,關係數據庫的不少主要特性卻每每無用武之地

數據庫事務一致性需求 

  不少web實時系統並不要求嚴格的數據庫事務,對讀一致性的要求很低, 有些場合對寫一致性要求並不高。容許實現最終一致性。

數據庫的寫實時性和讀實時性需求

  對關係數據庫來講,插入一條數據以後馬上查詢,是確定能夠讀出來這條數據的,可是對於不少web應用來講,並不要求這麼高的實時性,比方說發一條消息之 後,過幾秒乃至十幾秒以後,個人訂閱者纔看到這條動態是徹底能夠接受的。  

對複雜的SQL查詢,特別是多表關聯查詢的需求 

      任何大數據量的web系統,都很是忌諱多個大表的關聯查詢,以及複雜的數據分析類型的報表查詢,特別是SNS類型的網站,從需求以及產品設計角 度,就避免了這種狀況的產生。每每更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能被極大的弱化了。

 CAP理論的核心是:一個分佈式系統不可能同時很好的知足一致性,可用性和分區容錯性這三個需求,最多隻能同時較好的知足兩個。

所以,根據 CAP 原理將 NoSQL 數據庫分紅了知足 CA 原則、知足 CP 原則和知足 AP 原則三 大類:

CA - 單點集羣,知足一致性,可用性的系統,一般在可擴展性上不太強大。

CP - 知足一致性,分區容忍必的系統,一般性能不是特別高。

AP - 知足可用性,分區容忍性的系統,一般可能對一致性要求低一些。

BASE

BASE就是爲了解決關係數據庫強一致性引發的問題而引發的可用性下降而提出的解決方案。

BASE實際上是下面三個術語的縮寫:

    基本可用(Basically Available)

    軟狀態(Soft state)

    最終一致(Eventually consistent)

它的思想是經過讓系統放鬆對某一時刻數據一致性的要求來換取系統總體伸縮性和性能上改觀

分佈式+集羣

分佈式:側重於進程之間提供的服務      集羣:多臺服務器提供的服務                                  

Redis:

REmote DIctionary Server(遠程字典服務器)

是徹底開源免費的,用C語言編寫的,遵照BSD協議,是一個高性能的(key/value)分佈式內存數據庫,基於內存運行並支持持久化的NoSQL數據庫,是當前最熱門的NoSql數據庫之一,也被人們稱爲數據結構服務器

redis 的安裝與設置開機自啓http://www.javashuo.com/article/p-cefrjtml-dc.html

 service  start redis

 service stop redis

 

Redis啓動後雜項基礎知識講解

redis的數據庫個數是能夠配置的,默認爲16個,見redis.windows.conf/redis.conf的databases 16。
對應數據庫的索引值爲0 - (databases -1),即16個數據庫,索引值爲0-15。默認存儲的數據庫爲0。

登錄redis,默認選擇了數據庫0,若是須要切換到其它數據庫使用select 索引值,如select 1表示切換到索引值爲1的數據庫。

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> 

切換以後就會一直在操做的是新數據庫,直到下次切換生效。

dbsize查看當前數據庫的key的數量

127.0.0.1:6379> dbsize
(integer) 12

flushdb:清空當前庫

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> dbsize
(integer) 0

Flushall;通殺所有庫

刪除全部數據庫的全部key

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

Redis索引都是從零開始

爲何默認端口是6379

6379在是手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字。MERZ長期以來被antirez及其朋友看成愚蠢的代名詞。Redis做者antirez同窗在twitter上說將在下一篇博文中向你們解釋爲何他選擇6379做爲默認端口號。而如今這篇博文出爐,在解釋了Redis的LRU機制以後,向你們解釋了採用6379做爲默認端口的緣由。

Redis的五大數據類型 (有個詳細的鏈接https://www.cnblogs.com/ysocean/p/9102811.html)

  

哪裏去得到redis常見數據類型操做命令

http://redisdoc.com/

Redis 鍵(key)

先放進去幾個例子

 type key 查看你的key是什麼類型

127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> lpush list1 v1 v2 v3
(integer) 3

127.0.0.1:6379> type key1
string
127.0.0.1:6379> type list1
list

 exists key的名字,判斷某個key是否存在

127.0.0.1:6379> exists key1
(integer) 1

key*

127.0.0.1:6379>  keys *
1) "list1"
2) "key1"

 move key db   --->當前庫就沒有了,被移除了

Redis MOVE 命令用於將當前數據庫的 key 移動到給定的數據庫 db 當中。

語法

redis Move 命令基本語法以下:

    1. redis 127.0.0.1:6379> MOVE KEY_NAME DESTINATION_DATABASE

移動成功返回 1 ,失敗則返回 0 。

實例

# key 存在於當前數據庫
 
redis> SELECT 0 # redis默認使用數據庫 0,爲了清晰起見,這裏再顯式指定一次。
OK
 
redis> SET song "secret base - Zone"
OK
 
redis> MOVE song 1 # 將 song 移動到數據庫 1
(integer) 1
 
redis> EXISTS song # song 已經被移走
(integer) 0
 
redis> SELECT 1 # 使用數據庫 1
OK
 
redis:1> EXISTS song # 證明 song 被移到了數據庫 1 (注意命令提示符變成了"redis:1",代表正在使用數據庫 1)
(integer) 1
 
 
# 當 key 不存在的時候
 
redis:1> EXISTS fake_key
(integer) 0
 
redis:1> MOVE fake_key 0 # 試圖從數據庫 1 移動一個不存在的 key 到數據庫 0,失敗
(integer) 0
 
redis:1> select 0 # 使用數據庫0
OK
 
redis> EXISTS fake_key # 證明 fake_key 不存在
(integer) 0
 
 
# 當源數據庫和目標數據庫有相同的 key 時
 
redis> SELECT 0 # 使用數據庫0
OK
redis> SET favorite_fruit "banana"
OK
 
redis> SELECT 1 # 使用數據庫1
OK
redis:1> SET favorite_fruit "apple"
OK
 
redis:1> SELECT 0 # 使用數據庫0,並試圖將 favorite_fruit 移動到數據庫 1
OK
 
redis> MOVE favorite_fruit 1 # 由於兩個數據庫有相同的 key,MOVE 失敗
(integer) 0
 
redis> GET favorite_fruit # 數據庫 0 的 favorite_fruit 沒變
"banana"
 
redis> SELECT 1
OK
 
redis:1> GET favorite_fruit # 數據庫 1 的 favorite_fruit 也是
"apple"
127.0.0.1:6379> keys *
1) "list1"
2) "key1"
127.0.0.1:6379> move key1 1
(integer) 1
127.0.0.1:6379> exists key1
(integer) 0

 expire key 秒鐘:爲給定的key設置過時時間

設置成功返回 1 。 當 key 不存在或者不能爲 key 設置過時時間時(好比在低於 2.1.3 版本的 Redis 中你嘗試更新 key 的過時時間)返回 0 

實例
首先建立一個 key 並賦值:

redis 127.0.0.1:6379> SET w3ckey redis
OK
爲 key 設置過時時間:

redis 127.0.0.1:6379> EXPIREAT w3ckey 1293840000
(integer) 1
EXISTS w3ckey
(integer) 0
redis> SET mykey "Hello"
OK

redis> EXPIRE mykey 10  # 爲 key 設置生存時間
(integer) 1

redis> TTL mykey
(integer) 10

redis> PERSIST mykey    # 移除 key 的生存時間  
(integer) 1

redis> TTL mykey  以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)。
(integer) -1

 ttl key 查看還有多少秒過時,-1表示永不過時,-2表示已過時

下面來分析5大數據類型

String

經常使用操做

 set / get / del /append /strlen

增刪改查,長度

127.0.0.1:6379> set key1 hello
OK
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> strlen key1
(integer) 5
127.0.0.1:6379> append key1 xiaoming
(integer) 12
127.0.0.1:6379> get key1
"helloxiaoming"

Incr/decr/incrby/decrby,必定要是數字才能進行加減

Redis Incr 命令將 key 中儲存的數字值增一。

若是 key 不存在,那麼 key 的值會先被初始化爲 0 ,而後再執行 INCR 操做。

若是值包含錯誤的類型,或字符串類型的值不能表示爲數字,那麼返回一個錯誤。

本操做的值限制在 64 位(bit)有符號數字表示以內。

redis> SET page_view 20
OK

redis> INCR page_view
(integer) 21

redis> GET page_view    # 數字值在 Redis 中以字符串的形式保存
"21"

Redis Incrby 命令將 key 中儲存的數字加上指定的增量值。

若是 key 不存在,那麼 key 的值會先被初始化爲 0 ,而後再執行 INCRBY 命令。

若是值包含錯誤的類型,或字符串類型的值不能表示爲數字,那麼返回一個錯誤。

本操做的值限制在 64 位(bit)有符號數字表示以內。

# key 存在且是數字值

redis> SET rank 50
OK

redis> INCRBY rank 20
(integer) 70

redis> GET rank
"70"


# key 不存在時

redis> EXISTS counter
(integer) 0

redis> INCRBY counter 30
(integer) 30

redis> GET counter
"30"


# key 不是數字值時

redis> SET book "long long ago..."
OK

redis> INCRBY book 200
(error) ERR value is not an integer or out of range

Redis Hdel 命令用於刪除哈希表 key 中的一個或多個指定字段,不存在的字段將被忽略。

redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HDEL myhash field1
(integer) 1
redis 127.0.0.1:6379> HDEL myhash field2
(integer) 0

Redis Hexists 命令用於查看哈希表的指定字段是否存在。

若是哈希表含有給定字段,返回 1 。 若是哈希表不含有給定字段,或 key 不存在,返回 0 。

redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HEXISTS myhash field1
(integer) 1
redis 127.0.0.1:6379> HEXISTS myhash field2
(integer) 0

Redis Hget 命令用於返回哈希表中指定字段的值。

複製代碼
# 字段存在

redis> HSET site redis redis.com
(integer) 1

redis> HGET site redis
"redis.com"


# 字段不存在

redis> HGET site mysql
(nil)
複製代碼

 

複製代碼
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"
redis> 
複製代碼

Redis Hincrby 命令用於爲哈希表中的字段值加上指定增量值。

增量也能夠爲負數,至關於對指定字段進行減法操做。

若是哈希表的 key 不存在,一個新的哈希表被建立並執行 HINCRBY 命令。

若是指定的字段不存在,那麼在執行命令前,字段的值被初始化爲 0 。

對一個儲存字符串值的字段執行 HINCRBY 命令將形成一個錯誤。

本操做的值被限制在 64 位(bit)有符號數字表示以內。

複製代碼
redis> HSET myhash field 5
(integer) 1
redis> HINCRBY myhash field 1
(integer) 6
redis> HINCRBY myhash field -1
(integer) 5
redis> HINCRBY myhash field -10
(integer) -5
redis> 
複製代碼

Redis Hkeys 命令用於獲取哈希表中的全部域(field)。

複製代碼
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HKEYS myhash
1) "field1"
2) "field2"
複製代碼

Redis Hmset 命令用於同時將多個 field-value (字段-值)對設置到哈希表中。

此命令會覆蓋哈希表中已存在的字段。

若是哈希表不存在,會建立一個空哈希表,並執行 HMSET 操做。

複製代碼
redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
OK
redis 127.0.0.1:6379> HGET myhash field1
"Hello"
redis 127.0.0.1:6379> HGET myhash field2
"World"
複製代碼

Redis Hlen 命令用於獲取哈希表中字段的數量。

哈希表中字段的數量。 當 key 不存在時,返回 0 。
複製代碼
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HLEN myhash
(integer) 2
複製代碼

Redis Hmget 命令用於返回哈希表中,一個或多個給定字段的值。

若是指定的字段不存在於哈希表,那麼返回一個 nil 值。

一個包含多個給定字段關聯值的表,表值的排列順序和指定字段的請求順序同樣。

複製代碼
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HMGET myhash field1 field2 nofield
1) "foo"
2) "bar"
3) (nil)
複製代碼

Redis Hmset 命令用於同時將多個 field-value (字段-值)對設置到哈希表中。

此命令會覆蓋哈希表中已存在的字段。

若是哈希表不存在,會建立一個空哈希表,並執行 HMSET 操做。

若是命令執行成功,返回 OK 。

複製代碼
redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
OK
redis 127.0.0.1:6379> HGET myhash field1
"Hello"
redis 127.0.0.1:6379> HGET myhash field2
"World"
複製代碼

Redis 的 Set 是 String 類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。

Redis 中集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是 O(1)。

集合中最大的成員數爲 232 - 1 (4294967295, 每一個集合可存儲40多億個成員)。

複製代碼
127.0.0.1:6379> sadd l1 k1
(integer) 1
127.0.0.1:6379> sadd l1 k2
(integer) 1
127.0.0.1:6379> sadd l1 k3
(integer) 1
127.0.0.1:6379> sget l1
(error) ERR unknown command `sget`, with args beginning with: `l1`, 
127.0.0.1:6379> smembers l1
1) "k3"
2) "k1"
3) "k2"
複製代碼

 

Redis 有序集合和集合同樣也是string類型元素的集合,且不容許重複的成員。

不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。

有序集合的成員是惟一的,但分數(score)卻能夠重複。

集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。 集合中最大的成員數爲 232 - 1 (4294967295, 每一個集合可存儲40多億個成員)。

Redis Zadd 命令用於將一個或多個成員元素及其分數值加入到有序集當中。

若是某個成員已是有序集的成員,那麼更新這個成員的分數值,並經過從新插入這個成員元素,來保證該成員在正確的位置上。

分數值能夠是整數值或雙精度浮點數。

若是有序集合 key 不存在,則建立一個空的有序集並執行 ZADD 操做。

當 key 存在但不是有序集類型時,返回一個錯誤。

127.0.0.1:6379> zadd myzset 1 one
(integer) 1
127.0.0.1:6379> zadd myzset 1 two
(integer) 1
127.0.0.1:6379> zadd  myzset 2 three 3 four
複製代碼
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "1"
5) "three"
6) "2"
7) "four"
8) "3"
複製代碼
127.0.0.1:6379> zcard myzset
(integer) 4

Redis Zcard 命令用於計算集合中元素的數量。

Redis Zcount 命令用於計算有序集合中指定分數區間的成員數量。

分數值在 min 和 max 之間的成員的數量。

127.0.0.1:6379> zcount myzset 1 3
(integer) 4

Redis Zincrby 命令對有序集合中指定成員的分數加上增量 increment

能夠經過傳遞一個負數值 increment ,讓分數減去相應的值,好比 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。

當 key 不存在,或分數不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member 。

當 key 不是有序集類型時,返回一個錯誤。

分數值能夠是整數值或雙精度浮點數。

複製代碼
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "1"
5) "three"
6) "2"
7) "four"
8) "3"
127.0.0.1:6379> zincrby myzset 3 one
"4"
複製代碼

Redis Zinterstore 命令計算給定的一個或多個有序集的交集,其中給定 key 的數量必須以 numkeys 參數指定,並將該交集(結果集)儲存到 destination 。

默認狀況下,結果集中某個成員的分數值是全部給定集下該成員分數值之和。

返回值

保存到目標結果集的的成員數量

複製代碼
# 有序集 mid_test
redis 127.0.0.1:6379> ZADD mid_test 70 "Li Lei"
(integer) 1
redis 127.0.0.1:6379> ZADD mid_test 70 "Han Meimei"
(integer) 1
redis 127.0.0.1:6379> ZADD mid_test 99.5 "Tom"
(integer) 1

# 另外一個有序集 fin_test
redis 127.0.0.1:6379> ZADD fin_test 88 "Li Lei"
(integer) 1
redis 127.0.0.1:6379> ZADD fin_test 75 "Han Meimei"
(integer) 1
redis 127.0.0.1:6379> ZADD fin_test 99.5 "Tom"
(integer) 1

# 交集
redis 127.0.0.1:6379> ZINTERSTORE sum_point 2 mid_test fin_test
(integer) 3

# 顯示有序集內全部成員及其分數值
redis 127.0.0.1:6379> ZRANGE sum_point 0 -1 WITHSCORES     
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"
複製代碼

Redis Zrangebylex 經過字典區間返回有序集合的成員。

返回值

指定區間內的元素列表。

複製代碼
(integer) 7
redis 127.0.0.1:6379> ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
redis 127.0.0.1:6379> ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
redis 127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"
redis> 
複製代碼

Redis Zrangebyscore 返回有序集合中指定分數區間的成員列表。有序集成員按分數值遞增(從小到大)次序排列。

具備相同分數值的成員按字典序來排列(該屬性是有序集提供的,不須要額外的計算)。

默認狀況下,區間的取值使用閉區間 (小於等於或大於等於),你也能夠經過給參數前增長 ( 符號來使用可選的開區間 (小於或大於)。

舉個例子:

ZRANGEBYSCORE zset (1 5

返回全部符合條件 1 < score <= 5 的成員,而

ZRANGEBYSCORE zset (5 (10

則返回全部符合條件 5 < score < 10 的成員。

複製代碼
redis 127.0.0.1:6379> ZADD salary 2500 jack                        # 測試數據
(integer) 0
redis 127.0.0.1:6379> ZADD salary 5000 tom
(integer) 0
redis 127.0.0.1:6379> ZADD salary 12000 peter
(integer) 0

redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf               # 顯示整個有序集
1) "jack"
2) "tom"
3) "peter"

redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf WITHSCORES    # 顯示整個有序集及成員的 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"

redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 WITHSCORES    # 顯示工資 <=5000 的全部成員
1) "jack"
2) "2500"
3) "tom"
4) "5000"

redis 127.0.0.1:6379> ZRANGEBYSCORE salary (5000 400000            # 顯示工資大於 5000 小於等於 400000 的成員
1) "peter"
複製代碼

Redis Zrank 返回有序集中指定成員的排名。其中有序集成員按分數值遞增(從小到大)順序排列。

返回值

若是成員是有序集 key 的成員,返回 member 的排名。 若是成員不是有序集 key 的成員,返回 nil 。

複製代碼
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES        # 顯示全部成員及其 score 值
1) "peter"
2) "3500"
3) "tom"
4) "4000"
5) "jack"
6) "5000"

redis 127.0.0.1:6379> ZRANK salary tom                     # 顯示 tom 的薪水排名,第二
(integer) 1
複製代碼

 

複製代碼
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES    # 測試數據
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"

redis 127.0.0.1:6379> ZSCORE salary peter 
複製代碼
    •  

在遠程服務上執行命令

若是須要在遠程 redis 服務上執行命令,一樣咱們使用的也是 redis-cli 命令。

語法

$ redis-cli -h host -p port -a password

實例

如下實例演示瞭如何鏈接到主機爲 127.0.0.1,端口爲 6379 ,密碼爲 mypass 的 redis 服務上。

$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING

PONG

有時候會有中文亂碼。

要在 redis-cli 後面加上 --raw

redis-cli --raw

 

參數說明
redis.conf 配置項說明以下:

1. Redis默認不是以守護進程的方式運行,能夠經過該配置項修改,使用yes啓用守護進程
  daemonize no

守護進程daemonize,是指沒有控制終端,運行在後臺的進程,一般伴隨着系統啓動產生,系統關機結束。可使用命令ps -axj查看系統的守護進程,
2. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,能夠經過pidfile指定
  pidfile /var/run/redis.pid
3. 指定Redis監聽端口,默認端口爲6379,做者在本身的一篇博文中解釋了爲何選用6379做爲默認端口,由於6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字
  port 6379
4. 綁定的主機地址
  bind 127.0.0.1
5.當 客戶端閒置多長時間後關閉鏈接,若是指定爲0,表示關閉該功能
  timeout 300
6. 指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose
  loglevel verbose
7. 日誌記錄方式,默認爲標準輸出,若是配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null
  logfile stdout
8. 設置數據庫的數量,默認數據庫爲0,可使用SELECT <dbid>命令在鏈接上指定數據庫id
  databases 16
9. 指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合
  save <seconds> <changes>
  Redis默認配置文件中提供了三個條件:
  save 900 1
  save 300 10
  save 60 10000
  分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
 
10. 指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,若是爲了節省CPU時間,能夠關閉該選項,但會致使數據庫文件變的巨大
  rdbcompression yes
11. 指定本地數據庫文件名,默認值爲dump.rdb
  dbfilename dump.rdb
12. 指定本地數據庫存放目錄
  dir ./
13. 設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步
  slaveof <masterip> <masterport>
14. 當master服務設置了密碼保護時,slav服務鏈接master的密碼
  masterauth <master-password>
15. 設置Redis鏈接密碼,若是配置了鏈接密碼,客戶端在鏈接Redis時須要經過AUTH <password>命令提供密碼,默認關閉
  requirepass foobared
16. 設置同一時間最大客戶端鏈接數,默認無限制,Redis能夠同時打開的客戶端鏈接數爲Redis進程能夠打開的最大文件描述符數,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis會關閉新的鏈接並向客戶端返回max number of clients reached錯誤信息
  maxclients 128
17. 指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。Redis新的vm機制,會把Key存放內存,Value會存放在swap區
  maxmemory <bytes>
18. 指定是否在每次更新操做後進行日誌記錄,Redis在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於 redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認爲no
  appendonly no
19. 指定更新日誌文件名,默認爲appendonly.aof
   appendfilename appendonly.aof
20. 指定更新日誌條件,共有3個可選值: 
  no:表示等操做系統進行數據緩存同步到磁盤(快) 
  always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全) 
  everysec:表示每秒同步一次(折衷,默認值)
  appendfsync everysec
 
21. 指定是否啓用虛擬內存機制,默認值爲no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析Redis的VM機制)
   vm-enabled no
22. 虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享
   vm-swap-file /tmp/redis.swap
23. 將全部大於vm-max-memory的數據存入虛擬內存,不管vm-max-memory設置多小,全部索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置爲0的時候,實際上是全部value都存在於磁盤。默認值爲0
   vm-max-memory 0
24. Redis swap文件分紅了不少的page,一個對象能夠保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,做者建議若是存儲不少小對象,page大小最好設置爲32或者64bytes;若是存儲很大大對象,則可使用更大的page,若是不 肯定,就使用默認值
   vm-page-size 32
25. 設置swap文件中的page數量,因爲頁表(一種表示頁面空閒或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。
   vm-pages 134217728
26. 設置訪問swap文件的線程數,最好不要超過機器的核數,若是設置爲0,那麼全部對swap文件的操做都是串行的,可能會形成比較長時間的延遲。默認值爲4
   vm-max-threads 4
27. 設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓
  glueoutputbuf yes
28. 指定在超過必定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法
  hash-max-zipmap-entries 64
  hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默認爲開啓(後面在介紹Redis的哈希算法時具體介紹)
  activerehashing yes
30. 指定包含其它的配置文件,能夠在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有本身的特定配置文件
  include /path/to/local.conf

 

 redis 鏈接idea出現的錯誤

一直被拒絕鏈接  網上查找的全部方法,幾乎全失敗

方法一:失敗

1.查看是否啓動進程

lsof -i :6379

結果以下,證實開啓

COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

redis-ser 11560 root    4u  IPv4  69938      0t0  TCP *:6379 (LISTEN)

查找配置文件

查看是否將默認只能本地訪問redis改成全部IP都可以訪問

bind 127.0.0.1 改成 bind 0.0.0.0 

查看端口號是否爲6379

service iptables stop

 https://blog.csdn.net/DragonFreedom/article/details/79512686  (失敗)

注意:redis.conf每次修改完以後都要從新啓動redis,進入redis的安裝目錄,好比個人是 /usr/local/redis/bin 關閉和啓動redis的命令以下

./redis-cli shutdown
./redis-server redis.conf

 筆記作到了這裏真是費了九牛二虎之力才搞定redis 跟idea鏈接在一塊兒,原來沒有設置密碼是不讓鏈接的

相關文章
相關標籤/搜索