Linux(redis服務1(概述、下載安裝配置、性能測試、持久化(RDB、AOF)、基本數據類型、三種特殊數據))

Linux操作系統

Redis服務

(一)概述

1. 概述

Redis(Remote Dictionary Server ),即遠程字典服務,是由Salvatore Sanfilippo寫的key-value存儲系統,Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API;它通常被稱爲數據結構服務器,因爲值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets) 和有序集合(sorted sets)等類型。

2. 優點
  • 性能高:Redis能讀的速度是110000次/s,寫的速度是81000次/s ;
  • 數據類型豐富:Redis支持二進制案例的 Strings、Lists、Hashes、Sets 及 Ordered Sets 數據類型操作;
  • 原子操作:Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性;
  • 其他豐富的特性:Redis還支持 publish/subscribe通知、key過期等特性。

(二)下載安裝配置

  1. 下載地址
    中文官網:http://www.redis.cn/、英文官網:https://redis.io/
  2. 解壓安裝
    解壓:
    在這裏插入圖片描述
    安裝:makemake install(安裝前提是gcc環境!)
    安裝服務器:utils/install_server.sh
    在這裏插入圖片描述
  3. 開啓、停止服務
    開啓:/etc/init.d/redis_6379 start
    停止:/etc/init.d/redis_6379 stop
    查看狀態:/etc/init.d/redis_6379 status
    在這裏插入圖片描述

(三)基礎操作redis

redis官網的命令查詢中心:http://www.redis.cn/commands.html

1. 常用命令

redis-cli 啓動 redis 客戶端,該命令會連接本地的 redis 服務,redis-cli --raw 防止中文亂碼。

[root@server1 ~]# redis-cli
127.0.0.1:6379> ping                             返回PANG表示來連接成功
127.0.0.1:6379> INFO                             查看一些信息 
127.0.0.1:6379> CONFIG GET *                     查看所有的默認配置
127.0.0.1:6379> del name                         刪除名
127.0.0.1:6379> select (0、1、2、3...)          選擇數據庫 (redis默認有16個數據庫)
127.0.0.1:6379> dbsize                           查看數據庫裏面存儲的數量
127.0.0.1:6379[1]> set name xxx                  設置1號數據庫名
127.0.0.1:6379> flushdb                          清空當前數據庫
127.0.0.1:6379> flushall                         清空所有數據庫
127.0.0.1:6379> congif get requirepass           獲取redsi密碼(默認爲空)
127.0.0.1:6379> congif set requirepass "123456"  設置redis密碼(設置完後權限會限制需要auth + 密碼操作)
2. redis配置文件

設置redis的一些屬性就在配置文件中進行操作即可:cd /etc/redisvim 6379.conf

# redis配置文件對大小寫沒有要求
# units are case insensitive so 1GB 1Gb 1gB are all the same.
# INCLUDES 裏面可以導入一些其他文件
################################## INCLUDES ###################################
# include /path/to/local.conf
# include /path/to/other.conf
# 網絡配置
bind 0.0.0.0
port 6379
# 保護模式
protected-mode yes
# 守護線程(默認爲no)
daemonize yes
# 後臺運行指定的pid
pidfile /var/run/redis_6379.pid
# 日誌
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice
# 日誌的文件位置
logfile /var/log/redis_6379.log
# 數據庫16個
databases 16
# 是否顯示logo
always-show-logo yes
# 持久化操作
#   save ""
save 900 1            # 900s內,如果有1個key被修改,則執行持久化操作
save 300 10           # 300s內,如果有10個key被修改,則執行持久化操作
save 60 10000         # 60s內,如果有10000個key被修改,則執行持久化操作
# 持久化出錯是否繼續工作
stop-writes-on-bgsave-error yes
# 是否壓縮rdb文件
rdbcompression yes
# 持久化生成目錄
dir /
# aof默認關閉
appendonly no
# 指定本地數據庫文件名,默認值爲 appendonly.aof
appendfilename "appendonly.aof"
# 配置重寫觸發機制
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

重啓redis服務:/etc/init.d/redis_6379 restart

3. Redis 性能測試

100個併發連接,100000個請求:redis-benchmark -c 100 -n 100000
在這裏插入圖片描述

  • redis是單線程操作的,爲什麼單線程效率這麼高?
    因爲redis將數據全部存儲在內存中,多線程的操作存在上下文切換問題,耗時的操作,所以使用單線程效率高!
4. redis持久化的RDB操作
  1. 爲什麼需要持久化?
    因爲redis高效,將數據存儲在內存中,但內存存儲會隨着服務器退出而丟失數據,所以redis提供了持久化。
  2. RDB(Redis Database)
    RDB 是 Redis 默認的持久化方案。在指定的時間間隔內,執行指定次數的寫操作,則會將內存中的數據寫入到磁盤中,即Snapshot快照,在指定目錄下生成一個dump.rdb文件。Redis 重啓會通過加載dump.rdb文件恢復數據。適合大規模的數據恢復。
  3. 觸發RDB快照
  • 在指定的時間間隔內,執行指定次數的寫操作;
  • 執行save(阻塞, 只管保存快照,其他的等待) 或者是bgsave (異步)命令;
  • 執行flushall 命令,清空數據庫所有數據;
  • 執行shutdown 命令,保證服務器正常關閉且不丟失任何數據。
  1. RDB 的缺點
  • 數據的完整性和一致性不高,因爲RDB可能在最後一次備份時宕機了。
  • 備份時佔用內存,因爲Redis 在備份時會獨立創建一個子進程,將數據寫入到一個臨時文件(此時內存中的數據是原來的兩倍哦),最後再將臨時文件替換之前的備份文件。
5. redsi持久化的AOF操作
  1. AOF(Append Only File)
    Redis 默認不開啓。它的出現是爲了彌補RDB的不足(數據的不一致性),所以它採用日誌的形式來記錄每個寫操作,並追加到文件中。Redis 重啓的會根據日誌文件的內容將寫指令從前到後執行一次以完成數據的恢復工作。
  2. AOF 的優缺點
    優點:數據的完整性和一致性更高
    缺點:因爲AOF記錄的內容多,文件會越來越大,數據恢復也會越來越慢。

(四)Redis數據類型

1. key
127.0.0.1:6379> set key xxx              設置一個名爲key值爲xxx     
127.0.0.1:6379> get key                  查看key             
127.0.0.1:6379> keys *                   查看所有的key
127.0.0.1:6379> move key db              移動key到指定的數據庫
127.0.0.1:6379> del key                  刪除key
127.0.0.1:6379> rename oldkey newkey     key改名
127.0.0.1:6379> expire key seconds       設置key的過期時間
127.0.0.1:6379> exists key               判斷key是否存在
127.0.0.1:6379> persist key              持久化key
127.0.0.1:6379> TTL key                  以秒爲單位,返回給定 key 的剩餘生存時間
127.0.0.1:6379> type key                 查看key的類型
...

如果鍵命令執行後成功輸出 (integer) 1,否則將輸出 (integer) 0。

2. string

string 是 redis 最基本的類型,一個 key 對應一個 value,最大能存儲 512MB。

SET key value						設置指定 key 的值
GET key								獲取指定 key 的值。
GETRANGE key offset value           根據指定索引返回 key 中字符串的值(0是第一個字符,-1表示最後一個字符)
SETRANGE key offset value           用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始
GETSET key value                    將給定 key 的值設爲 value ,並返回 key 的舊值
MGET key1 [key2..]                  獲取所有(一個或多個)給定 key 的值
SETEX key seconds value             將值 value 關聯到 key ,並將 key 的過期時間設爲 seconds (單位:秒)
SETNX key value                     當key不存在時才設置,不會覆蓋原來的值
PSETEX key milliseconds value       以毫秒爲單位設置 key 的生存時間
STRLEN key                          返回 key 所儲存的字符串值的長度
MSET key value [key value ...]      同時設置一個或多個 key-value 對
MSETNX key value [key value ...]    同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在
INCR key                            將 key 中儲存的數字值增一
DECR key                            將 key 中儲存的數字值減一
INCRBY key increment                將 key 所儲存的值加上給定的增量值(increment) 
INCRBYFLOAT key increment           將 key 所儲存的值加上給定的浮點增量值(increment) 
DECRBY key decrement                key 所儲存的值減去給定的減量值(decrement) 
APPEND key value                    如果 key 已經存在並且是一個字符串, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾
# 設置對象屬性
127.0.0.1:6379> mset user:1:name  zhangsan user:1:age 20
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "20"
# getset    當key不存在時設置key、value;當key存在時,getset會先返回原來的值,再設置新的value
127.0.0.1:6379> getset mykey aaa
(nil)
127.0.0.1:6379> get mykey
"aaa"
127.0.0.1:6379> getset mykey bbb
"aaa"
127.0.0.1:6379> get mykey
"bbb"
3. list

LPUSH 命令可向 list 的左邊(頭部)添加一個新元素;
RPUSH命令可向 list 的右邊(尾部)添加一個新元素;

127.0.0.1:6379> rpush mylist 1
(integer) 1
127.0.0.1:6379> rpush mylist 2
(integer) 2
127.0.0.1:6379> lpush mylist 3
(integer) 3
127.0.0.1:6379> rpush mylist 4
(integer) 4

查詢元素:lrange mylist 0 -1 ,0索引表示第一個元素,-1表示最後一個元素,-2表示倒樹第二個…
在這裏插入圖片描述
移出並獲取列表的第一個元素:lpop list
移出並獲取列表的最後一個元素:rpop list
通過索引獲取列表中的元素:lindex list 1
獲得list的長度:llen list
移除list中指定數量的指定的值:lrem list count value
從 list 中取出一定範圍的元素:LRANGE list index1 index2
移除list最後一個元素到另一個list中:rpoplpush list1 list2
更新存在的list中的指定索引的元素:lset list index newvalue
在列表的某個元素前或者後插入元素:LINSERT key BEFORE|AFTER pivot value

  • 阻塞操作:
    BLPOP key1 [key2 ] timeout
    移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
    BRPOP key1 [key2 ] timeout
    移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
    BRPOPLPUSH source destination timeout
    從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
    RPOPLPUSH source destination
    移除列表的最後一個元素,並將該元素添加到另一個列表並返回。
4. hash

hash 是一個鍵值(key=>value)對集合,hash 適合用於存儲對象。

HSET key field value                                將哈希表 key 中的字段 field 的值設爲 value
HGET key field                                      獲取存儲在哈希表中指定字段的值
HMSET key field1 value1 [field2 value2 ]            將多個 field-value (域-值)對設置到哈希表 key 中
HMGET key field1 [field2]                           獲取所有給定字段的值
HGETALL key                                         獲取在哈希表中指定 key 的所有字段和值
HDEL key field1 [field2]                            刪除一個或多個哈希表字段,對應的value也就刪除了
HLEN key                                            獲取哈希表中字段的數量
HKEYS key                                           獲取所有哈希表中的字段
HVALS key                                           獲取哈希表中所有值
HSCAN key cursor [MATCH pattern] [COUNT count]      迭代哈希表中的鍵值對
HEXISTS key field                                   查看哈希表 key 中,指定的字段是否存在
HINCRBY key field increment                         爲哈希表 key 中的指定字段的整數值加上增量 increment 
HINCRBYFLOAT key field increment                    爲哈希表 key 中的指定字段的浮點數值加上增量 increment 
hsetnx key field value                              如果hash不存在創建成功,存在創建失敗
5. set

Redis 的 Set 是 String 類型的無序集合,集合成員是唯一的,即集合中不能出現重複的數據;Redis 中集合是通過哈希表實現的,集合中最大的成員數爲 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。添加一個 string 元素到 key 對應的 set 集合中,成功返回 1,如果元素已經在集合中返回 0。

SADD key member1 [member2]                向集合添加一個或多個成員
SCARD key                                 獲取集合的成員數
SMEMBERS key                              返回集合中的所有成員
SISMEMBER key member                      判斷 member 元素是否是集合 key 的成員
SREM key member1 [member2]                移除集合中一個或多個成員
SMOVE source destination member           將 member 元素從 source 集合移動到 destination 集合
SPOP key                                  移除並返回集合中的一個隨機元素
SRANDMEMBER key [count]                   返回集合中一個或指定count個隨機數
- 差集
SDIFF key1 [key2]                         返回以key1爲對照的集合的差集
SDIFFSTORE destination key1 [key2]        返回給定所有集合的差集並存儲在 destination 中
- 交集
SINTER key1 [key2]                        返回給定所有集合的交集
SINTERSTORE destination key1 [key2]       返回給定所有集合的交集並存儲在 destination 中
- 並集
SUNION key1 [key2]                        返回所有給定集合的並集
SUNIONSTORE destination key1 [key2]       所有給定集合的並集存儲在 destination 集合中

注意:

  • set返回的差集的結果都遵循:結果來自前面的key1,而不是後面的key2;如:
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SDIFF key1 key2 key3 = {b,d}
  • 迭代集合中的元素:SSCAN key cursor match 模糊匹配
    如:查找h開頭的
SADD myset1 "hello"
SADD myset1 "hahaha"
SADD myset1 "bar"
sscan myset1 0 match h*
結果:
1) "0"
2) 1) "hello"
   2) "hahaha"
6. sorted set

Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重複的成員;不同的是每個元素都會關聯一個double類型的分數。
添加成員的格式:ZADD key 分數1 成員1 分數2 成員2 ...,每個成員都有一個對應的分數,redis正是通過分數來爲集合中的成員進行從小到大的排序。有序集合的成員是唯一的,但分數(score)卻可以重複。

ZADD key 分數1 成員1 分數2 成員2 ...           添加元素
ZRANGE key 0 -1                              獲取元素
ZCARD key                                    獲取有序集合的成員數
ZSCORE key member                            返回有序集中,成員的分數值
ZCOUNT key min max                           計算在有序集合中指定區間分數的成員數
ZRANK key member                             返回有序集合中指定成員的索引
- 排序
ZRANGEBYSCORE salary -inf +inf               顯示整個有序集從低到高排序
ZREVRANGE key start stop [WITHSCORES]        返回有序集中指定索引區間內的成員,分數從高到低
RANGEBYSCORE salary -inf +inf WITHSCORES     顯示整個有序集及成員的 score 值
ZRANGEBYSCORE salary -inf 5000 WITHSCORES    顯示工資 <=5000 的所有成員
ZRANGEBYSCORE salary (5000 400000            顯示工資大於 5000 小於等於 400000 的成員
- 刪除
ZREM key member [member ...]                 移除有序集合中的一個或多個成員
ZREMRANGEBYRANK key start stop               移除有序集合中給定的排名區間的所有成員
ZREMRANGEBYSCORE key min max                 移除有序集合中給定的分數區間的所有成員
ZREMRANGEBYLEX key min max                   移除有序集合中給定的字典區間的所有成員
ZREMRANGEBYRANK key start stop               移除有序集合中給定的排名區間的所有成員
ZREMRANGEBYSCORE key min max                 移除有序集合中給定的分數區間的所有成員
7. 三種特殊數據
  • Geospatial地理位置
    推算位置信息,如兩地的距離、方圓幾裏的人…
  1. GEOADD命令
    將指定的地理空間位置(緯度、經度、名稱)添加到指定的key中。
    要求:有效的經度從-180度到180度;有效的緯度從-85.05112878度到85.05112878度,當座標位置超出上述指定範圍時,該命令將會返回一個錯誤。
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
  1. GEOPOS命令
    從key裏返回所有給定位置元素的位置(經度和緯度)。
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city shanghai
1) 1) "121.47000163793563843"
   2) "31.22999903975783553"
  1. GEODIST命令
    返回兩個給定位置之間的距離,如果兩個位置之間的其中一個不存在, 那麼命令返回空值。
  • 指定單位的參數 unit 必須是以下單位的其中一個:
    m 表示單位爲米。
    km 表示單位爲千米。
    mi 表示單位爲英里。
    ft 表示單位爲英尺。
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.3788"
  1. GEORADIUS命令
    以給定的經緯度爲中心, 返回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。(比如:附近的人)
  • 範圍可以使用以下其中一個單位:
    m 表示單位爲米。
    km 表示單位爲千米。
    mi 表示單位爲英里。
    ft 表示單位爲英尺。
  • 在給定以下可選項時, 命令會返回額外的信息:
    WITHDIST: 在返回位置元素的同時, 將位置元素與中心之間的距離也一併返回。 距離的單位和用戶給定的範圍單位保持一致。
    WITHCOORD: 將位置元素的經度和維度也一併返回。
    WITHHASH: 以 52 位有符號整數的形式, 返回位置元素經過原始 geohash 編碼的有序集合分值。 這個選項主要用於底層應用或者調試, 實際中的作用並不大。
    COUNT:選項去獲取前 N 個匹配元素。
# 以120 50爲中心,2000km爲半徑搜索
127.0.0.1:6379> GEORADIUS china:city 120 50 2000 km withdist withcoord count 1
1) 1) "beijing"
   2) "1158.2127"
   3) 1) "116.39999896287918091"
      2) "39.90000009167092543"
  1. GEORADIUSBYMEMBER命令
    這個命令和 GEORADIUS 命令一樣, 都可以找出位於指定範圍內的元素, 但是GEORADIUSBYMEMBER 的中心點是由給定的位置元素決定的, 而不是像 GEORADIUS 那樣, 使用輸入的經度和緯度來決定中心點。
# 以beijing爲中心,2000km爲半徑搜索
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 2000 km
1) "shanghai"
2) "beijing"
  • GEOHASH命令
    該命令將返回11個字符的Geohash字符串,將二維的經緯度轉換爲一維的字符串。
# 兩個字符串越接近,距離越近
127.0.0.1:6379> geohash china:city beijing shanghai 
1) "wx4fbxxfke0"
2) "wtw3sj5zbj0"
  • Hyperloglog基數統計
    是一種概率數據結構,用於對唯一事物進行計數(從技術上講,這是指估計集合的基數)。
    使用場景:網站的UV(獨立訪客),使用set會存儲大量的用戶id佔用過多的內存,我們只是爲了簡單的計數,所以Hyperloglog具有以下優點:
    不再需要使用與計數的項目數量成比例的內存量,而是可以使用恆定數量的內存,最多爲12k字節的內存。
# 在hll中存儲8個值
127.0.0.1:6379> pfadd hll a b c d e f g h
(integer) 1
# 獲取hll值的個數
127.0.0.1:6379> pfcount hll
(integer) 8
# 在hll2中存儲8個值
127.0.0.1:6379> pfadd hll2 a b c n m o p q
(integer) 1
# 合併hll hll2到hll3中
127.0.0.1:6379> pfmerge hll3 hll hll2
OK
# 由於hll和hll2有(a、b、c)重複所以hll3只有(16-3)個值
127.0.0.1:6379> pfcount hll3
(integer) 13
  • Bitmap位圖場景
    不是實際的數據類型,而是在String類型上定義的一組面向的操作,將一個位設置爲1或0用來表示某種狀態,由於字符串是二進制安全Blob,並且最大長度爲512 MB,因此它們適合設置多達2 ^ 32個不同的位。
    最大的優點是:在存儲信息時通常可以節省大量空間。
# 比如:記錄一週七天的打卡狀態,已打卡爲1,未打卡爲0。
127.0.0.1:6379> setbit week 0 1           # 週一已打卡
(integer) 0
127.0.0.1:6379> setbit week 1 1
(integer) 0
127.0.0.1:6379> setbit week 2 0           # 週三未打卡
(integer) 0
127.0.0.1:6379> setbit week 3 0
(integer) 0
127.0.0.1:6379> setbit week 4 1
(integer) 0
127.0.0.1:6379> setbit week 5 1
(integer) 0
127.0.0.1:6379> setbit week 6 1
(integer) 0
127.0.0.1:6379> getbit week 1            # 查看週二是否打卡
(integer) 1
127.0.0.1:6379> getbit week 3            # 查看週四是否打卡
(integer) 0
127.0.0.1:6379> bitcount week            # 查看周打卡的次數
(integer) 5

//下篇再見…謝謝
在這裏插入圖片描述

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