從零開始的Redis學習 | 2_Redis數據類型、配置文件

B站視頻傳送門

1. Redis 簡介

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

1.1 應用場景

1.1.1 配合關係型數據庫做高速緩存

  • 高頻次,熱門訪問的數據,降低數據庫IO
  • 分佈式架構,做 session 共享

1.1.2 由於其擁有持久化能力,利用其多樣的數據結構存儲特定的數據

安裝部分,虛擬機之前裝過,應該是被我刪掉了, 建議看下我之前寫的

Windows下Redies安裝並設置成本地服務。主要是阿里雲的yum源一直有問題。本地的也還可以,能用就行。

2. 相關知識

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

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

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

例子:

阻塞IO,給女神發一條短信,說我來找你了,然後就默默的一直等着女神下樓,這個期間除了等待你不會做其他事情,屬於備胎做法。

非阻塞IO,給女神發短信,如果不回,接着再發,一直髮到女神下樓,這個期間你除了發短信等待不會做其他事情,屬於專一做法。

IO多路複用,是找一個宿管大媽來幫你監視下樓的女生,這個期間你可以做些其他事情。IO複用又包括 select,poll,epoll 模式。

  • select 大媽,每一個女生下樓,select大媽都不知道這個是不是你的女神,她需要一個一個詢問,並且 select大媽能力還有限,最多一次幫你監視1024個妹子。
  • poll 大媽不限制等着女生的數量,只要是經過宿舍樓門口的女生,都會幫你去問是不是你女神。
  • epoll 大媽不限制盯着女生的數量,並且也不需要一個個去問,那麼如何做呢?epoll 大媽會爲每個進宿舍樓的女生臉上貼上一個大字條,上面寫上女生自己的名字,只要女生下樓了,epoll 大媽就知道這個是不是你女神了,然後大媽再通知你。

3. Redis 數據類型

基本指令

指令 功能
keys * 查看當前庫的所有鍵
exists <key> 判斷某個鍵是否存在
type <key> 查看鍵的類型
del <key> 刪除某個鍵
expire <key> <seconds> 爲鍵值設置過期時間,單位秒
ttl <key> 查看還有多少秒過期,-1 表示用不過期,-2 表示已過期
dbsize 查看當前數據庫的key的數量
Flushdb 清空當前庫
Flushall 通殺全部庫

3.1 String

String 是 Redis 最基本的類型,你可以理解成語 Memacched 一模一樣的類型,一個key對應一個value。

String 類型是二進制安全的。意味着Redis的String可以包含任何數據。比如jpg圖片或者序列化的對象。

String 類型是 Redis最基本的數據類型,一個Redis中字符串value最多可以是512M。

指令 功能
get <key> 查詢對應鍵值
set <key> <value> 添加鍵值對
append <key> <value> 將給定的<value>追加到原值的末尾
strlen <key> 獲得值的長度
setnx <key> <value> 只有在 key 不存在時,設置 key 的值
incr <key> - 將key中存儲的數字值增1;- 只能對數字值操作,如果爲空,新增值爲1(對存儲在指定 key的數值執行原子的加1操作。)
decr <key> - 將 key中儲存數值值減1;- 只能對數字值操作,如果爲空,新增值爲-1
incrby / decrby <key> <步長> 將 key 中儲存的數字值增減。自定義步長。
mset <key1> <value1> <key2> <value2> …… 同時設置一個或多個 key-value 對
mget <key1> <key2> <key3> ...... 同時獲取一個或多個 value
msetnx <key1> <value1> <key2> <value2> ...... 同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。
getrange <key> <起始位置> <結束位置> 獲得值的範圍,類似 java 中的 subsring
setrange <key> <起始位置> <value> 用 <value> 覆寫 <key> 所儲存的字符串值,從 <起始位置> 開始。
setex <key> <過期時間> <value> 設置鍵值的同時,設置過期時間,單位秒
getset <key> <value> 以新換舊,設置了新值同時獲得舊值

3.1.1 原子性

  • 所謂原子性操作是指不會被線程調度機制打斷的操作;這種操作一旦開始就一直運行到結束,中間不會有任何 context switch(切換到另一個線程)。

    (1)在單線程中,能夠在單條指令中完成的操作都可以認爲是"原子操作",因爲中斷只能發生於指令之間。

    (2)在多線程中,不能被其它進程(線程)打斷的操作就叫原子操作。

    Redis單命令的原子性主要得益於 Redis的單線程

3.2 List

單鍵多值

Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素導列表的頭部(左邊)或者尾部(右邊)。

它的底層實際是個 雙向鏈表,對兩端的操作性能很高,通過索引下標的操作中間的節點性能會較差。

指令 功能
Ipush/rpush <key> <value1> <value2> 從左邊/右邊插入一個或多個值
Inpop/rpop <key> 從左邊/右邊吐出一個值。值在鍵在,值光鍵忘
rpoplpush <key1> <key2> 從 <key1> 列表右邊吐出一個值,插到<key2>列表左邊
range <key> <start> <stop> 按照索引下標獲得元素(從左到右)
linde <key> <index> 按照索引下標獲得元素(從左到右)
llen <key> 獲得列表長度
linsert <key> after <value> <newvalue> 在 <value> 的後面插入 <newvalue> 插入值
lrem <key> <n> <value> 從左邊刪除n個value(從左到右)

3.3 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> 隨機從該集合中吐出一個值。會從集合中刪除。
srandmember <key> <n> 隨機從該集合中取出 n 個值。不會從集合中刪除。
sinter <key1> <key2> 返回兩個集合的交集元素。
sunion <key1> <key2> 返回兩個集合的並集元素。
sdiff <key1> <key2> 返回兩個集合的差集元素。

3.4 Hash

  • Redis hash 是一個鍵值對集合。
  • Redis hash 是一個 String 類型的 field 和 value 的映射表,hash特別適合用於存儲對象。
  • 類似 Java 裏面的 Map<String,String>
指令 功能
hset <key> <field> <value> 給 <key> 集合中的 <field> 鍵賦值 <value>
hget <key1> <field> 從 <key1> 集合 <field> 取出 value
hmset <key1> <field1> <value1> 批量設置 hash 的值
hexists key <field> 查看哈希表 key 中,給定域 field 是否存在。
hkey <key> 列出該 hash 集合的所有 field
hvals <key> 列出該 hash 集合的所有 value
hincrby <key> <field> <increment> 爲哈希表 key 中的域 field 的值加上增量 increment
hsetnx <key> <field> <value> 爲哈希表 key 中的域 field 的值設置爲 value,當且僅當域 field 不存在。
#中文亂碼解決方法
redis-cli.exe --raw

3.5 Zset(sorted set)

Redis 有序集合zset與普通集合set非常相似,是一個沒有重複元素的字符串集合。不同之處是有序集合的每個成員都關聯了一個評分(score),這個評分(score)被用來按照最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重複了。

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

指令 功能
zadd <key> <score1> <value1> 向有序集合添加一個或多個成員,或者更新已存在成員的分數
zcard key 獲取有序集合的成員數
zcount key min max 計算在有序集合中指定區間分數的成員數
zincrby key increment member 有序集合中對指定成員的分數加上增量 increment
zinterstore destination numkeys key [key...] 計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 destination 中
zlexcount key min max 在有序集合中計算指定字典區間內成員數量
zrange key start stop [withscores] 通過索引區間返回有序集合指定區間內的成員
zrangebyscore key min max [limit offset count] 通過字典區間返回有序集合的成員
zrangebyscore key min max [withscores] [limit] 通過分數返回有序集合指定區間內的成員
zrevrange key member 返回有序集合中指定成員的索引
zrem key member [member...] 移除有序集合中的一個或多個成員
zremrangebylex key min max 移除有序集合中給定的字典區間的所有成員
zremrangebyrank key strat stop 移除有序集合中給定的排名區間的所有成員
zremrangebyscore key min max 移除有序集合中給定的分數區間的所有成員
zrevrange key start stop [withscores] 返回有序集中指定區間內的成員,通過索引,分數從高到低
zrevrangebyscore key max min [withscores] 返回有序集中指定分數區間內的成員,分數從高到低排序
zrevrank key member 返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
zscore key member 返回有序集中,成員的分數值
zunionstore destination numkeys key [key...] 計算給定的一個或多個有序集的並集,並存儲在新的 key 中
zscan key cursor [match pattern] [count count] 迭代有序集合中的元素(包括元素成員和元素分值)

4. Redis 配置文件

Redis 的配置文件位於 Redis 安裝目錄下,文件名爲 redis.conf(Windows 名爲redis windows.conf)。

#通過命令查看或設置配置項
redis 127.0.0.1:6379> CONFIG GET *
#編輯配置
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel

1) "loglevel"
2) "notice"
配置項 說明
include /path/to/local.conf 指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件。
bind 127.0.0.1 綁定的主機地址。 默認情況下 bind=127.0.0.1 只能接受本機的訪問請求。 不寫的情況下,無限制接受任何 ip 地址的訪問。 生產環境肯定要寫你應用服務器的地址。 如果開啓了 protected-mode,那麼在沒有設定 bind ip 且沒有設密碼的情況下,Redis 只允許接受本機的響應。
tcp-backlog 可以理解是一個請求到達後至到接受進程處理前的隊列。backlog 隊列總和 = 未完成三次握手隊列 + 已完成三次握手隊列。 高併發環境 tcp-backlog 設置值跟超時時限內的 Redis 吞吐量決定。
timeout 300 當客戶端閒置多長秒後關閉連接,如果指定爲 0 ,表示關閉該功能。
TCP keepalive 對訪問客戶端的一種心跳檢測,每隔 n 秒檢測一次。 官方推薦設爲 60 秒。
daemonize no Redis 默認不是以守護進程的方式運行,可以通過該配置項修改,使用 yes 啓用守護進程(Windows 不支持守護線程的配置爲 no )
pidfile /var/run/redis.pid 當 Redis 以守護進程方式運行時,Redis 默認會把 pid 寫入 /var/run/redis.pid 文件,可以通過 pidfile 指定
loglevel notice 指定日誌記錄級別,Redis 總共支持四個級別:debug、verbose、notice、warning,默認爲 notice
logfile 日誌文件名稱
syslog 是否將Redis日誌輸送到Linux系統日誌服務中
syslog-ident 日誌的標誌
syslog-facility 輸出日誌的設備
database 設定庫的數量 默認16
maxclient 最大客戶端連接數
maxmemory <bytes> 指定 Redis 最大內存限制,Redis 在啓動時會把數據加載到內存中,達到最大內存後,Redis 會先嚐試清除已到期或即將到期的 Key,當此方法處理 後,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis 新的 vm 機制,會把 Key 存放內存,Value 會存放在 swap 區
maxmemory-policy (1)volatile-lru:使用LRU(最近少使用)算法移除key,只對設置了過期時間的鍵。 (2)allkeys-lru:使用LRU算法移除key。 (3)volatile-random:在過期集合中移除隨機的key,只對設置了過期時間的鍵。 (4)allkeys-random:移除隨機的key。 (5)volatile-ttl(即將過期):移除那些 TTL 值最小的 key,即那些最近要過期的key。 (6)noeviction:不進行移除。針對寫操作,只是返回錯誤信息。
maxmemory-samples 設置樣本數量,LRU算法和最小TTL算法都並非是精確的算法,而是估算值,所以你可以設置樣本的大小。 一般設置3~7的數字,數值越小樣本越不準確,但是性能消耗也越小。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章