Redis-入門筆記-15min帶你一覽redis

来源:http://www.cnblogs.com/xinysu/archive/2017/08/16/7366142.html
-Advertisement-
Play Games

如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿蔔 所有。望各位支持! 少年入門筆記,整理出來一起入坑!入門的視屏來自imooc的:http://www.imooc.com/learn/839 如果轉載,請註明博文來源: www.cnblogs. ...


 

      如果轉載,請註明博文來源: www.cnblogs.com/xinysu/   ,版權歸 博客園 蘇家小蘿蔔 所有。望各位支持!   

      少年入門筆記,整理出來一起入坑!入門的視屏來自imooc的:http://www.imooc.com/learn/839

1 NOSQL概述

  • 什麼是noSQL
    • not only sql
    • 非關係型資料庫
  • 為什麼需要NoSQL
    • web2.0大規模動態網站的興起
    • high performance ,高併發讀寫,動態頁面展示與交互,比如微博點贊評論等操作,實時統計線上人數排行榜等
    • huge storage,海量數據的高效存儲和訪問,大型網站的用戶登錄系統
    • high scalability && high availability,高可擴展性和高可用性
  • 主流NOSQL產品
    • redis,mongodb,couchdb
  • NoSQL的特點
    • 易擴展
    • 靈活數據模型
    • 大數據量,高性能
    • 高可用
  • NoSQL資料庫的四大分類
    • 鍵值存儲,redis
      • 優勢,快速查詢
      • 劣勢,存儲數據缺少結構化
    • 列存儲,hbase
      • 優勢,快速查詢
      • 劣勢,功能局限
    • 文檔資料庫,mongodb
      • 優勢,數據結構要求不嚴格
      • 劣勢,查詢性能並非特別高,缺少統一查詢的語法
    • 圖形資料庫,infogate
      • 優勢,社交網路,利用圖結構的相關演算法
      • 劣勢,需要對整個圖做演算法分析,不利於分散式方案
 

2 redis概述

    C語言編寫的高性能鍵值對數據,支持的鍵值數據類型:
  • 字元串類型
  • 列表類型
  • 有序集合類型
  • 散列
  • 集合類型
    Redis的應用場景:
  • 緩存
  • 網站訪問統計
  • 任務隊列
  • 數據過期處理
  • 應用排行榜
  • 分散式集群架構中的session分離

3 redis安裝和使用

3.1 redis安裝

  • 依賴環境
    • gcc-c++
1 環境準備
#官網下載 redis 3.2.5版本 wget http://download.redis.io/releases/redis-4.0.1.tar.gz   #安裝 C 編譯環境     yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc gcc-c++   2 安裝     解壓安裝包後,進入文件目錄編譯,編譯結束時,會提示 Hint: It's a good idea to run 'make test'  ,建議在安裝前先測試預安裝下,make test預安裝後,遇到錯誤:You need tcl 8.5 or newer in order to run the Redis test ,缺失安裝包tcl,所以需要先安裝這個 安裝包後再次運行 make test,正常後再進行redis安裝。     詳細步驟如下:   #解壓二進位包 tar -zvxf /opt/redis-3.2.5   #進入到文件目錄 cd redis-3.2.5   #編譯 make   #測試安裝(稍微耗費點時間) make test   #可能會提醒需要安裝最新版的tcl #yum install tcl    #指定路徑安裝 make PREFIX=/usr/local/redis install 
    安裝結束後,進入到安裝路徑中, [root@bogon bin]# ls -lh /usr/local/redis/bin/ total 22M -rwxr-xr-x. 1 root root 2.4M Aug 13 18:40 redis-benchmark -rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-check-aof -rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-check-rdb -rwxr-xr-x. 1 root root 2.5M Aug 13 18:40 redis-cli lrwxrwxrwx. 1 root root   12 Aug 13 18:40 redis-sentinel -> redis-server -rwxr-xr-x. 1 root root 5.5M Aug 13 18:40 redis-server       這幾個指令用途分別是:
  • redis-benchmark
    • 性能測試工具
  • redis-check-aof
    • aof文件修複工具
  • redis-check-rdb
    • rdb文件檢查工具
  • redis-cli
  • redis客戶端
  • redis-server
    • redis伺服器啟動命令
  • redis-sentinel

3.2 配置文件修改

 1 #拷貝conf文件到/etc目錄
 2 cp /opt/redis/redis-4.0.1/redis.conf /etc/redis.conf
 3  
 4  
 5 #redis.conf 參數說明
 6  
 7 ################################## NETWORK #####################################
 8  
 9 #綁定的主機地址
10 bind 127.0.0.1
11  
12 #保護模式,是否允許 沒有認證配置的主機或介面連接redis,預設是啟動保護模式,則不允許這種情況
13 protected-mode yes
14  
15 #指定redis的監聽埠,預設埠是6379,作者在自己的一篇博文中解釋了為什麼選用6379作為預設埠,因為6379在手機按鍵上MERZ對應的號碼,而MERZ取自義大利歌女Alessia Merz的名字,嗯,你開發的,你說了算。
16 port 6379
17  
18 # In high requests-per-second environments you need an high backlog in order
19 # to avoid slow clients connections issues. Note that the Linux kernel
20 # will silently truncate it to the value of /proc/sys/net/core/somaxconn so
21 # make sure to raise both the value of somaxconn and tcp_max_syn_backlog
22 # in order to get the desired effect.
23  
24 tcp-backlog 511
25  
26 #客戶端鏈接多長時間後關閉鏈接,單位是秒,指定為0,則表示關閉該功能
27 timeout 0
28  
29 # A reasonable value for this option is 300 seconds, which is the new
30 # Redis default starting with Redis 3.2.1.
31 tcp-keepalive 300
32  
33 ################################# GENERAL #####################################
34  
35 #Redis預設不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程
36 daemonize yes
37  
38 # If you run Redis from upstart or systemd, Redis can interact with your
39 # supervision tree. Options:
40 #   supervised no      - no supervision interaction
41 #   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
42 #   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
43 #   supervised auto    - detect upstart or systemd method based on
44 #                        UPSTART_JOB or NOTIFY_SOCKET environment variables
45 # Note: these supervision methods only signal "process is ready."
46 #       They do not enable continuous liveness pings back to your supervisor.
47 supervised no
48  

3.3 服務啟動與關閉 

 1 #服務端啟動
 2 [root@bogon redis-4.0.1]# cd /usr/local/redis/
 3 [root@bogon redis]# ./bin/redis-server /etc/redis.conf
 4 74537:C 13 Aug 18:53:30.774 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
 5 74537:C 13 Aug 18:53:30.774 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=74537, just started
 6 74537:C 13 Aug 18:53:30.774 # Configuration loaded
 7 [root@bogon redis]# ps axu | grep redis
 8 root      74538  0.6  0.2 145248  2168 ?        Ssl  18:53   0:00 ./bin/redis-server 127.0.0.1:6379
 9 root      74665  0.0  0.0 112648   968 pts/4    S+   18:53   0:00 grep --color=auto redis
10  
11 #客戶端啟動
12 redis-cli [-h 127.0.0.1] [-p 6379]
13 127.0.0.1:6379> ping
14 PONG
15  
16 #存儲鍵值對
17 127.0.0.1:6379> set name imooc
18 OK
19  
20 #獲取name對應的value
21 127.0.0.1:6379> get name
22 "imooc"
23  
24 #獲取所有keys
25 127.0.0.1:6379> keys *
26 1) "name"
27  
28 #刪除keys
29 127.0.0.1:6379> del name
30 (integer) 1
31 127.0.0.1:6379> get name
32 (nil)
33  
34 #關閉服務端
35 redis-cli shutdow

4 redis-py的入門

    redis有支持非常多種語言編寫的客戶端,可以從官網查看  https://redis.io/clients ,redis-py是redis官方網站首選的python客戶端開發包,本人只會點點python,所以從這個入門。     redis-py的github地址:https://github.com/andymccurdy/redis-py

 5 redis數據類型

  鍵值對種key的註意事項:
  • 不要過長
    • 最好不要超過1024個位元組
    • 不僅消耗記憶體,也影響查找效率
  • 不要過短
    • 比如設置為a,沒有實際意義,可能會降低key的可讀性
  • 統一命名規範

5.1字元串 string

string中的一個key對應一個value,values最長可達512Mb。   string常用命令:
  • 賦值
    • set key value
  • 取值
    • get key
  • 取值後賦值
    • getset key value
  • 數值增減
    • 自增1
      • 如果該key不存在,則創建該key,並賦值為0,0自增後為1,等同於增加 【key,1】鍵值對
      • 如果該key存在,則value自增加1
      • incr key
    • 自減1
      • 如果該key不存在,則創建該key,並賦值為0,0自減後為-1,等同於增加 【key,-1】鍵值對
      • 如果該key存在,則value自減1
      • decr key
    • 自增指定值
      • 如果該key不存在,則創建該key,並賦值為0,0自增numbers,等同於增加 【key,numbers】鍵值對
      • 如果該key存在,則value自增numbers
      • incrby key numbers
    • 自減指定值
      • 如果該key不存在,則創建該key,並賦值為0,0自減numbers,等同於增加 【key,-numbers】鍵值對
      • 如果該key存在,則value自減numbers
      • decrby key numbers
  • 刪除
    • del key
  • 擴展
    • value追加string內容
    • append key string

5.2 哈希 hash

    hash可以存儲多個鍵值對之間的映射,它就像是一個迷你型的redis。
  • 賦值
    • hset key field value
    • hmset key field value [field value ... ]
  • 取值
    • hget key field
    • hmget key field [field ...]
    • hgetall key
  • 增加數字
    • hincrby key field number
  • 刪除
    • hdel key field
    • del key
  • 自學命令
    • hexists key field
    • hlen key
    • hkeys key
    • hvals key

5.3 字元串列表 list

    lish的順序是按照插入的順序,可以在頭部跟尾部插入數據,如果是在list的兩頭進行操作,那麼效率是很高的,但是如果在list中,則會耗費一定時間。     list的類型:
  • arraylist使用數組方式
    • 根據索引查詢速度是非常快的
    • 但是新增跟刪除操作涉及到位移操作,則會比較慢
  • linkedlist使用雙向鏈接方式
    • 每個元素都記錄了前後元素的指針,刪除跟新增只需要修改前後指針,數據操作較快
    list常用的命令:
  • 兩端添加
    • lpush key value [value ...]
    • rpush key value [value ...]
  • 查看列表
    • lrange key start stop
  • 指定位置push
    • lset key index value
      • 列表中第幾個位置插入value,註意位置從0開始
  • 指定value插入值
    • linsert key before|after pivot value
    • 在列表中,從左到右,第一個等於pivot這個值的前面或者後面,插入valuse
  • 兩端彈出
    • lpop key
      • 刪除列表最左邊的value
    • rpop key
      • 刪除列表最右邊的value
    • rpoplpush source distination
      • 從source列表右邊刪除一個value,並把這個value存儲進入distination列表中
      • 適用於消息發佈過程中的備份操作
  • 獲取列表元素個數
    • llen key
      • 獲取列表的長度
  • 擴展命令
    • lpushx key value
      • 如果列表存在,則從左端插入push valuse進入列表中,否則返回0
    • rpushx key value
      • 如果列表存在,則從右端插入push valuse進入列表中,否則返回0
    • lrem key count value 
      • count>0,從列表的左端開始刪除 值等於 value,一共刪除count個
      • count<0,從列表的右端開始刪除 值等於 value,一共刪除count個
      • count=0,刪除 整個列表中所有 值等於 value

5.4 字元串集合 set

    和list類型不同的是,set集合中不允許出現重覆的元素,set最大可以包含的元素是 4294967295 。註意,set中是沒有順序的。      用於維護用戶對象的唯一性,以及處理數據對象之間的關聯關係,可以進行並集交集差集運算。比如購買A產品的用戶ID,放在一個set中,購買另外一個B產品的用戶ID,放在另外一個set中,這樣就很方便計算同時購買兩個產品的用戶等。       list常用指令:
  • 添加刪除元素
    • sadd key member [member ...]
    • srem key member [member ...]
    • del key
  • 獲取集合中的元素
    • smembers key
  • 差集運算
    • sdiff key1 [key ...]
      • 求集合key1與其他集合的差集
    • sdiffstore destination key1 [key ...]
      • 求集合key1與其他集合的差集,並把結果存儲在destination集合中
  • 交集運算
    • sinter key [key...]
      • 求多個集合的交集
    • sinterstore destination key [key...]
      • 求多個集合的交集,並把結果存儲在destination集合中
  • 並集運算
    • sunion key [key...]
      • 求多個集合的並集
    • sunionstore destination key [key...]
      • 求多個集合的並集,並把結果存儲在destination集合中
  • 擴展命令
    • sismember key member
      • 查看member在key中是否存在
    • srandmember key [count]
      • 集合key中隨機放回 count 個元素
    • scard key
      • 查看集合個數

5.5 有序字元串集合 sorted set

    sorted set跟set是比較類似的,集合中不允許出現重覆的元素,那麼有啥區別呢?sorted set有順序,從小到大排序,更新操作非常快,訪問數據也非常高效。     應用場景:游戲排名、微博熱點       常用命令:
  • 獲得元素
    • zscore key member
      • 獲取有序集合中的某個元素的score值
    • zrange key start stop [withscores]
    • zrangebyscore key mim max [withscores] [limit offset count]
  • 添加元素
    • zadd key score member [score member ...]
  • 刪除元素
    • zrem key member [member...]
    • zremrangebyscore key min max 
  • 擴展查詢
    • zincrby key increment member
    • zscore key member
    • zcount key min max

6 keys的通用操作

  • keys *
    • 查看所有keys
  • del key [key...]
    • 刪除多個key
  • exists key
    • 判斷某個key是否存在,存在返回1,不存在返回0
  • rename key newkey
    • 重命名某個key
  • expire key seconds
    • 設置某個key的生命期,過了這個時間就是過期數據
  • ttl key
    • 查看該key的生命還剩下多少秒
  • type key
    • 查看key的類型

7 redis的特性

7.1 多資料庫

redis最多支持16個數據,下標0-15表示第幾個資料庫。預設是在0號數據。切換資料庫可以通過select dbnumber 來切換,也可以通過move 來移動key從當前數據到指定的資料庫。

7.2 事務

    事務的指令:multi、exec、discard。redis中,如果某個命令執行失敗,後面的命令還會繼續執行。multi,開啟事務,這個指令後的指令預設為在同一個事務內,exec等同於提交,discard等同於回滾。  

8 redis的持久化

    redis的高性能是因為數據都在記憶體中,如果資料庫重啟,則所有數據都會丟失,那麼如何進行數據持久化呢?
  • RDB持久化
    • 預設支持,在指定的時間內,把記憶體的數據寫入磁碟
  • AOF持久化
    • 以日誌的形式記錄每一個操作,啟動的時候,重新執行所有log
  • 無持久化
    • 不進行持久化,則認為redis的作用為緩存,無需持久化數據
  • RDB與AOF同時使用

8.1 RDB持久化

  • 優勢
    • redis資料庫僅包含一個文件,對於文件備份是非常方便的,如果系統出現災難時,較容易恢復
    • 災難恢復時,備份文件較為容易單獨轉移到其他存儲介質
    • 數據量很大的時候,啟動速度快
  • 劣勢
    • 不能夠保證數據無丟失,數據丟失時間 = 當前時間-最近備份時間
    • 子進程完成持久化工作,如果數據集很大的時候,可能會造成短時間內redis所在伺服器停止對外服務
  • 配置
    • RDB預設配置文件中就有,可以查看redis.conf文件中關於save的設置
        • save 900 1       :900秒內至少有1個數據變化,則進行持久化
        • save 300 10     :300秒內至少有10個數據發生變化,則進行持久化
        • save 60 10000 : 60秒內至少有1w個數據發生變化,則進行持久化

        • dbfilename 則是命名當前持久文件的名字
        • dir,則是定義當前持久化文件的存放路徑

8.2 AOF持久化

  • 優勢
    • 更高的數據安全性
      • 每秒同步,最高丟失1s數據
      • 每操作數同步,每次發生數據的變化都會立即記錄到磁碟中,性能最低
    • append追加文件備份
      • 備份過程中出現問題,不會破壞之前的日誌備份
      • 如果寫入了一半數據,然後出現系奔潰的問題,在redis下一次啟動之前,可以通過redis_check_aof工具解決數據一致性問題
    • 如果日誌備份過大
      • redis會自動啟動日誌重寫機制,append過程中,會把備份數據寫入到老的備份文件中,並且會用一個新文件,記錄此期間的修改數據語句
    • AOF包含一個格式清晰的數據修改操作語句的日誌文件
  • 劣勢
    • 相同數量的數據集文件,比RDB的要打
    • AOF效率低於RDB
    • 需要人員配置,非預設配置
  • 配置
    • 在redis.conf文件中,配置一下內容
      • appendonly yes:啟動appendonly,開啟AOF備份
      • appendfilename "appendonly.aof" :AOF備份的文件名
      • appendfsync always   :每個修改操作同步備份一次
      • appendfsync everysec:1s同步備份一次
      • appendfsync no          :不同步
    • 測試配置
      • 簡單測試案例
        • redis中配置AOF,選擇每操作一次就備份的機制,增刪改數據後,執行flushall,然後通過備份文件來恢複數據到flushall之前
      • 步驟
        • 啟動AOF,選擇每操作一次就備份
          • appendonly yes
          • appendfsync always
        • 重啟redis
          • /usr/local/redis/bin/redis-cli shutdown
          • /usr/local/redis/bin/redis-server /etc/redis.conf
        • 造數據
        • 執行flushall
        • 處理備份文件
          • vim /usr/local/redis/appendonly.aof
          • 刪除flushall的操作記錄
        • 重啟資料庫
          • /usr/local/redis/bin/redis-cli shutdown
          • /usr/local/redis/bin/redis-server /etc/redis.conf
        • 檢查數據
          •  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在之前介紹過數據倉庫中的歷史拉鏈表《極限存儲–歷史拉鏈表》, 使用這種方式即可以記錄歷史,而且最大程度的節省存儲。這裡簡單介紹一下這種歷史拉鏈表的更新方法。 本文中假設: CREATE TABLE orders ( orderid INT, createtime STRING, modifiedti ...
  • 由於之前使用插件類型的方式來進行了mysql的審計,一是有兩例mysql的實例崩潰,二是對性能影響比較大,故在尋求其他的解決方案。後來發現elk beats項目,便拿來試了下,後上線了200個實例,運行了2個月,沒有出現問題,故和大家簡單分享一下,如需詳細瞭解的話,可以查看官方文檔。 packetb ...
  • 在數據倉庫的數據模型設計過程中,經常會遇到這樣的需求: 1. 數據量比較大;2. 表中的部分欄位會被update,如用戶的地址,產品的描述信息,訂單的狀態等等;3. 需要查看某一個時間點或者時間段的歷史快照信息,比如,查看某一個訂單在歷史某一個時間點的狀態, 比如,查看某一個用戶在過去某一段時間內, ...
  • 註意: 1.使用phpMyAdmin創建存儲過程時定界符要改成‘//’。 2.只能在資料庫管理工具創建存儲過程,不能用php動態創建,php只能調用存儲過程,連接時後面要加上參數 存儲過程 存儲過程簡單來說,就是為以後的使用而保存的一條或多條MySQL語句的集合。可將其視為批件,雖然它們的作用不僅限 ...
  • 討人喜歡的 MySQL replace into 用法(insert into 的增強版) 在向表中插入數據的時候,經常遇到這樣的情況:1. 首先判斷數據是否存在; 2. 如果不存在,則插入;3.如果存在,則更新。 在 SQL Server 中可以這樣處理: if not exists (selec ...
  • - 在芝加哥工作的人中,誰的工資最高select * from(select e.ename from emp e join dept d on(e.deptno = d.deptno)where d.loc='CHICAGO' order by sal desc) where rownum=1; ...
  • MySQL Database on Azure 是 Azure 平臺上推出的 MySQL 雲資料庫服務,通過全面相容 MySQL 協議,為用戶提供了一個全托管的性能穩定、可快速部署、高可用、高安全性的資料庫服務。客戶可以使用常見的支持 MySQL 的平臺與技術進行開發與集成。本文演示瞭如何使用 My ...
  • 事務用於處理數據的一致性,事務的定義是,處於同一個事務中的操作是一個工作單元,要麼全部執行成功,要麼全部執行失敗。把事務的概念應用到在實際的SSIS Package場景中,如何在Package中實現事務,事務的行為是什麼樣的,你真的瞭解嗎? SSIS預設支持Task組件級別的事務,在預設情況下,單個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...