NOSQL的Redis的基础
目錄
一.NoSQL概述
1. 數據庫類型
二. 部署Redis服務
1.安裝Redis
2.驗證服務
三. Redis數據類型及操作
1.字符串的概述
2.字符串操作命令
3.字符串實踐
4.散列類型的概述
5. 散列類型操作命令
6.散列類型實踐
7. 列表類型的概述
8.列表類型操作命令
9. 列表類型實踐
10.集合類型
11. 集合實踐
12.有序集合類型的概述
13.有序集合類型操作
14.有序集合類型實踐
四.Redis其他操作命令
1.數據操作命令
2.數據庫操作命令
3.修改Redis服務運行參數
一.NoSQL概述
1. 數據庫類型
?RDBMS
????????- 關系數據庫管理系統:Relational Database Management System
????????- 按照預先設置的組織結構,將數據存儲在物理介質上
????????- 數據之間可以做關聯操作
????????- 主流的RDBMS軟件
????????????????? - MySQL
????????????????? - MariaDB
????????????????? - Oracle
????????????????? - DB2
????????????????? - SQL Server
????????????????? - PostgreSQL
NoSQL:Not Only SQL
????????- 意為"不僅僅是SQL"
????????- 泛指非關系型數據庫
????????- 不需要預先定義數據存儲結構
????????- 每條記錄可以有不同的數據類型和字段個數
????????- 在一些數據庫結構經常變化,數據結構不定的系統中,就非常適合使用NoSQL來存儲。比如監控系統中的監控信息的存儲,可能每種類型的監控信息都不太一樣。這樣可以避免經常對MySQL進行表結構調整,增加字段帶來的性能問題。
????????- 這種架構的缺點就是數據直接存儲在NoSQL中,不能做關系數據庫的復雜查詢,如果由于需求變更,需要進行某些查詢,可能無法滿足,所以采用這種架構的時候需要確認未來是否會進行復雜關系查詢以及如何應對。
????????- 主流軟件
????????????????? - Redis
????????????????? - Memcached
????????????????? - MongoDB
????????????????? - CouchDB
????????????????? - Neo4j
????????????????? - FlockDB
二. 部署Redis服務
官網: Redis
1.安裝Redis
從源代碼
下載、解壓和編譯Redis:
?安裝編譯器
[root@redis1 ~]# yum install -y gcc [root@redis1 ~]# wget https://download.redis.io/releases/redis-4.0.8.tar.gz [root@redis1 ~]# tar xf redis-4.0.8.tar.gz [root@redis1 ~]# cd redis-4.0.8 # 修改安裝目錄為/usr/local/redis [root@redis1 redis-4.0.8]# vim +27 src/Makefile PREFIX?=/usr/local/redis # 編譯安裝 [root@redis1 redis-4.0.8]# make && make install # 將redis命令目錄添加至PATH環境變量 [root@redis1 redis-4.0.8]# vim /etc/bashrc # 尾部追加 export PATH=$PATH:/usr/local/redis/bin [root@redis1 redis-4.0.8]# source /etc/bashrc # 初始化redis服務 [root@redis1 redis-4.0.8]# ./utils/install_server.sh # 全部問題直接回車采用默認值 Welcome to the redis service installer This script will help you easily set up a running redis server Please select the redis port for this instance: [6379] Selecting default: 6379 Please select the redis config file name [/etc/redis/6379.conf] Selected default - /etc/redis/6379.conf Please select the redis log file name [/var/log/redis_6379.log] Selected default - /var/log/redis_6379.log Please select the data directory for this instance [/var/lib/redis/6379] Selected default - /var/lib/redis/6379 Please select the redis executable path [/usr/local/redis/bin/redis-server] Selected config: Port : 6379 Config file : /etc/redis/6379.conf Log file : /var/log/redis_6379.log Data dir : /var/lib/redis/6379 Executable : /usr/local/redis/bin/redis-server Cli Executable : /usr/local/redis/bin/redis-cli Is this ok? Then press ENTER to go on or Ctrl-C to abort. Copied /tmp/6379.conf => /etc/init.d/redis_6379 Installing service... Successfully added to chkconfig! Successfully added to runlevels 345! Starting Redis server... Installation successful!2.驗證服務
# 查看服務狀態 [root@redis1 ~]# /etc/init.d/redis_6379 status Redis is running (10023) # 也可以使用以下方式查看服務狀態 [root@redis1 ~]# service redis_6379 status Redis is running (10023)[root@redis1 ~]# ss -tlnp | grep :6379 LISTEN 0 128 127.0.0.1:6379 *:* users:(("redis-server",pid=10023,fd=6))# 關閉服務 [root@redis1 ~]# service redis_6379 stop Stopping ... Redis stopped # 也可以使用以下方式關閉服務 [root@redis1 ~]# /etc/init.d/redis_6379 stop# 啟動服務 [root@redis1 ~]# service redis_6379 start Starting Redis server... # 也可以使用以下方式啟動服務 [root@redis1 ~]# /etc/init.d/redis_6379 start# 重啟服務 [root@redis1 ~]# service redis_6379 restart Stopping ... Redis stopped Starting Redis server... # 也可以使用以下方式重啟服務 [root@redis1 ~]# /etc/init.d/redis_6379 restart# 連接redis [root@redis1 ~]# redis-cli 127.0.0.1:6379> ping # 測試服務,正常返回PONG PONG 127.0.0.1:6379> exit三. Redis數據類型及操作
1.字符串的概述
????????- 字符串類型是 Redis 中最基本的數據類型,它能存儲任何形式的字符串,包括二進制數據
????????- 可以用其存儲用戶的郵箱、JSON 化的對象甚至是一張圖片
????????- 一個字符串類型鍵允許存儲的數據的最大容量是512 MB
????????- 字符串類型是其他4種數據類型的基礎,其他數據類型和字符串類型的差別從某種角度來說只是組織字符串的形式不同
2.字符串操作命令
1)賦值命令
# 賦值 SET key value # 取值 GET key # 查看所有 keys *2)賦值命令示例
127.0.0.1:6379> SET username tom OK127.0.0.1:6379> GET username "tom"127.0.0.1:6379> GET password # 當鍵不存在時會返回空結果。 (nil)3) 遞增數字:字符串類型可以存儲任何形式的字符串,當存儲的字符串是整數形式時,Redis 提供了一個實用的命令 INCR,其作用是讓當前鍵值遞增,并返回遞增后的值。
# 當要操作的鍵不存在時會默認鍵值為0,所以第一次遞增后的結果是1。 127.0.0.1:6379> INCR num (integer) 1127.0.0.1:6379> INCR num (integer) 2127.0.0.1:6379> GET num "2"4)當鍵值不是整數時Redis會提示錯誤
127.0.0.1:6379> SET foo bar OK127.0.0.1:6379> INCR foo (error) ERR value is not an integer or out of range5) 增加指定的整數
127.0.0.1:6379> INCRBY num 2 (integer) 4127.0.0.1:6379> INCRBY num 2 (integer) 66)遞減數字
127.0.0.1:6379> DECR num (integer) 5127.0.0.1:6379> DECRBY num 2 (integer) 37)向尾部追加值
127.0.0.1:6379> SET hi Hello OK127.0.0.1:6379> APPEND hi " World" # 因為字符串包含空格,需要使用引號 (integer) 11 # 返回值為hi的總長度127.0.0.1:6379> GET hi "Hello World"8)獲取字符串長度
127.0.0.1:6379> STRLEN hi (integer) 119)中文字符返回字節數
127.0.0.1:6379> SET name 張三 OK127.0.0.1:6379> STRLEN name (integer) 6 # UTF-8編碼的中文,由于“張”和“三”兩個字的UTF-8編碼的長度都是3,所以此例中會返回6。 ```10) 同時獲得/設置多個鍵值
127.0.0.1:6379> MSET username tom password tedu.cn OK127.0.0.1:6379> MGET username password 1) "tom" 2) "tedu.cn"11)判斷字段是否存在
127.0.0.1:6379> EXISTS num (integer) 1127.0.0.1:6379> EXISTS number (integer) 012)字段不存在時賦值
127.0.0.1:6379> SETNX number 100 (integer) 1127.0.0.1:6379> GET number "100"13) 查看所有的key
127.0.0.1:6379> KEYS *14)刪除字段
127.0.0.1:6379> DEL number (integer) 1127.0.0.1:6379> DEL number (integer) 015)查看鍵的類型
127.0.0.1:6379> TYPE name string3.字符串實踐
????????- Redis 對于鍵的命名并沒有強制的要求,但比較好的實踐是用“對象類型:對象ID:對象屬性”來命名一個鍵,如使用鍵【`user:1:friends`】來存儲ID為1的用戶的好友列表。
????????- 例:如果你正在編寫一個博客網站,博客的一個常見的功能是統計文章的訪問量,我們可以為每篇文章使用一個名為【`post:文章ID:page.view`】的鍵來記錄文章的訪問量,每次訪問文章的時候使用INCR命令使相應的鍵值遞增。
4.散列類型的概述
????????- 散列類型(hash)的鍵值也是一種字典結構,其存儲了字段(field)和字段值的映射
????????- 字段值只能是字符串
????????- 散列類型適合存儲對象。使用對象類別和 ID 構成鍵名,使用字段表示對象的屬性,而字段值則存儲屬性值
5. 散列類型操作命令
1) 賦值與取值
# 設置單個字段 127.0.0.1:6379> HSET user1 name bob (integer) 1127.0.0.1:6379> HSET user1 gender male (integer) 1127.0.0.1:6379> HGET user1 name "bob"127.0.0.1:6379> HGET user1 gender "male"# 設置多個字段 127.0.0.1:6379> HMSET user1 email bob@tedu.cn phone 13412345678 OK 127.0.0.1:6379> HMGET user1 email phone 1) "bob@tedu.cn" 2) "13412345678"# 獲取所有字段 127.0.0.1:6379> HGETALL user1 1) "name" 2) "bob" 3) "gender" 4) "male" 5) "email" 6) "bob@tedu.cn" 7) "phone" 8) "13412345678"2) 判斷
# 判斷字段是否存在 127.0.0.1:6379> HEXISTS user1 address (integer) 0127.0.0.1:6379> HEXISTS user1 name (integer) 1# 當字段不存在時賦值 127.0.0.1:6379> HSETNX user1 address beijing (integer) 1127.0.0.1:6379> HSETNX user1 address beijing (integer) 03) 數字遞增
127.0.0.1:6379> HINCRBY user1 age 20 (integer) 20127.0.0.1:6379> HINCRBY user1 age 1 (integer) 214) 刪除字段
127.0.0.1:6379> HDEL user1 age (integer) 15) 只獲取字段名
127.0.0.1:6379> HKEYS user1 1) "name" 2) "gender" 3) "email" 4) "phone" 5) "address"6) 只獲取值
127.0.0.1:6379> HVALS user1 1) "bob" 2) "male" 3) "bob@tedu.cn" 4) "13412345678" 5) "beijing"7) 獲得字段數量
127.0.0.1:6379> HLEN user1 (integer) 5
?
6.散列類型實踐
- 例:將文章ID號為10的文章以散列類型存儲在Redis中
127.0.0.1:6379> HSET post:10 title 例解Python (integer) 1127.0.0.1:6379> HGETALL post:10 1) "title" 2) "\xe4\xbe\x8b\xe8\xa7\xa3Python"127.0.0.1:6379> HSET post:10 author ZhangZhiGang (integer) 1127.0.0.1:6379> HMSET post:10 date 2021-05-01 summary 'Python Programming' OK127.0.0.1:6379> HGETALL post:10 1) "title" 2) "\xe4\xbe\x8b\xe8\xa7\xa3Python" 3) "author" 4) "ZhangZhiGang" 5) "date" 6) "2021-05-01" 7) "summary" 8) "Python Programming"7. 列表類型的概述
????????- 列表類型(list)可以存儲一個有序的字符串列表
????????- 常用的操作是向列表兩端添加元素,或者獲得列表的某一個片段
????????- 列表類型內部是使用雙向鏈表(double linked list)實現的,獲取越接近兩端的元素速度就越快
????????- 使用鏈表的代價是通過索引訪問元素比較慢
????????- 這種特性使列表類型能非常快速地完成關系數據庫難以應付的場景:如社交網站的新鮮事,我們關心的只是最新的內容,使用列表類型存儲,即使新鮮事的總數達到幾千萬個,獲取其中最新的100條數據也是極快的
8.列表類型操作命令
1) LPUSH命令用來向列表左邊增加元素,返回值表示增加元素后列表的長度
127.0.0.1:6379> LPUSH numbers 1 (integer) 1127.0.0.1:6379> LPUSH numbers 2 3 (integer) 32) 取出列表所有元素
127.0.0.1:6379> LRANGE numbers 0 -1 # 起始下標為0,結束下標為-1 1) "3" 2) "2" 3) "1"3) RPUSH命令用來向列表右邊增加元素,返回值表示增加元素后列表的長度
127.0.0.1:6379> RPUSH numbers 0 -1 (integer) 5127.0.0.1:6379> LRANGE numbers 0 -1 1) "3" 2) "2" 3) "1" 4) "0" 5) "-1"4) 從列表兩端彈出元素
127.0.0.1:6379> LPOP numbers "3" 127.0.0.1:6379> LRANGE numbers 0 -1 1) "2" 2) "1" 3) "0" 4) "-1"127.0.0.1:6379> RPOP numbers "-1"127.0.0.1:6379> LRANGE numbers 0 -1 1) "2" 2) "1" 3) "0"5) 獲取列表中元素的個數
127.0.0.1:6379> LLEN numbers (integer) 36) 刪除列表中指定的值
????????# 語法
????????#LREM命令會刪除列表中前count個值為value的元素,返回值是實際刪除的元素個數。根據count值的不同,LREM命令的執行方式會略有差異。
????????#(1)當 count > 0時 LREM 命令會從列表左邊開始刪除前 count 個值為 value的元素。
????????#(2)當 count < 0時 LREM 命令會從列表右邊開始刪除前 count 個值為 value 的元素。
????????#(3)當 count = 0是 LREM命令會刪除所有值為 value的元素。
7) 獲得/設置指定索引的元素
# 獲取numbers列表中下標為0的值 127.0.0.1:6379> LINDEX numbers 0 "2"# 設置下標為1的值為10 127.0.0.1:6379> LSET numbers 1 10 OK127.0.0.1:6379> LRANGE numbers 0 -11) "2"2) "10"3) "2"4) "1"5) "2"6) "1"7) "2"8) "1"9) "2" 10) "1" 11) "2" 12) "1"8) 刪除指定范圍之外的所有元素
127.0.0.1:6379> LTRIM numbers 0 2 OK127.0.0.1:6379> LRANGE numbers 0 -1 1) "2" 2) "10" 3) "2"9) 插入元素
# 在2的前面插入20 127.0.0.1:6379> LINSERT numbers BEFORE 2 20 (integer) 4127.0.0.1:6379> LRANGE numbers 0 -1 1) "20" 2) "2" 3) "10" 4) "2"# 在2的后面插入30 127.0.0.1:6379> LINSERT numbers AFTER 2 30 (integer) 5 127.0.0.1:6379> LRANGE numbers 0 -1 1) "20" 2) "2" 3) "30" 4) "10" 5) "2"9. 列表類型實踐
- 例:記錄最新的10篇博文
573470543127.0.0.1:6379> LPUSH posts:list 11 12 13 (integer) 3127.0.0.1:6379> LRANGE posts:list 0 -1 1) "13" 2) "12" 3) "11"10.集合類型
????????- 集合中的每個元素都是不同的,且沒有順序
1)增加/刪除元素
127.0.0.1:6379> SADD letters a b c (integer) 3127.0.0.1:6379> SADD letters b c d (integer) 1127.0.0.1:6379> SMEMBERS letters 1) "d" 2) "b" 3) "a" 4) "c"127.0.0.1:6379> SREM letters a c (integer) 2127.0.0.1:6379> SMEMBERS letters 1) "d" 2) "b"2) 判斷元素是否在集合中
127.0.0.1:6379> SISMEMBER letters a (integer) 0127.0.0.1:6379> SISMEMBER letters b (integer) 13) 集合運算
127.0.0.1:6379> SADD s1 a b c (integer) 3127.0.0 573470543.1:6379> SADD s2 b c d (integer) 3127.0.0.1:6379> SINTER s1 s2 1) "b" 2) "c"127.0.0.1:6379> SUNION s1 s2 1) "a" 2) "c" 3) "b" 4) "d"127.0.0.1:6379> SDIFF s1 s2 1) "a"4)獲得集合中元素個數
127.0.0.1:6379> SCARD letters (integer) 25) 隨機獲得集合中的元素
# 在集合s1中隨機取出兩個不同元素。 127.0.0.1:6379> SRANDMEMBER s1 2 1) "b" 2) "c"# 在集合s1中隨機取出兩個有可能相同元素。 127.0.0.1:6379> SRANDMEMBER s1 -2 1) "c" 2) "c"127.0.0.1:6379> SRANDMEMBER s1 -2 1) "a" 2) "b"6) 集合中隨機彈出一個元素
127.0.0.1:6379> SPOP s1 "a"127.0.0.1:6379> SMEMBERS s1 1) "b" 2) "c"11. 集合實踐
- 例:為文章號為10的博客文章添加標簽
573470543127.0.0.1:6379> SADD post:10:tags python redis nginx (integer) 3127.0.0.1:6379> SMEMBERS post:10:tags 1) "python" 2) "nginx" 3) "redis"12.有序集合類型的概述
????????- 在集合類型的基礎上有序集合類型為集合中的每個元素都關聯了一個分數
????????- 這使得我們不僅可以完成插入、刪除和判斷元素是否存在等集合類型支持的操作,還能夠獲得分數最高(或最低)的前N個元素、獲得指定分數范圍內的元素等與分數有關的操作
????????- 雖然集合中每個元素都是不同的,但是它們的分數卻可以相同。
????????- 有序集合類型在某些方面和列表類型有些相似
????????? - 二者都是有序的
????????? - 二者都可以獲得某一范圍的元素
????????- 有序集合類型和列表也有著很大的區別,這使得它們的應用場景也是不同的
????????? - 列表類型是通過鏈表實現的,獲取靠近兩端的數據速度極快,而當元素增多后,訪問中間數據的速度會較慢,所以它更加適合實現如“新鮮事”或“日志”這樣很少訪問中間元素的應用
????????? - 有序集合類型是使用散列表和跳躍表(Skip list)實現的,所以即使讀取位于中間部分的數據速度也很快
????????? - 列表中不能簡單地調整某個元素的位置,但是有序集合可以(通過更改這個元素的分數)
????????? - 有序集合要比列表類型更耗費內存
13.有序集合類型操作
1) ZADD 命令用來向有序集合中加入一個元素和該元素的分數,如果該元素已經存在則會用新的分數替換原有的分數。ZADD命令的返回值是新加入到集合中的元素個數
127.0.0.1:6379> ZADD scores 88 tom 90 jerry 75 bob 92 alice (integer) 4127.0.0.1:6379> ZRANGE scores 0 -1 1) "bob" 2) "tom" 3) "jerry" 4) "alice"127.0.0.1:6379> ZRANGE scores 0 -1 WITHSCORES 1) "bob" 2) "75" 3) "tom" 4) "88" 5) "jerry" 6) "90" 7) "alice" 8) "92"127.0.0.1:6379> ZADD scores 85 jerry (integer) 0127.0.0.1:6379> ZRANGE scores 0 -1 WITHSCORES 1) "bob" 2) "75" 3) "jerry" 4) "85" 5) "tom" 6) "88" 7) "alice" 8) "92"2) 獲得元素的分數
127.0.0.1:6379> ZSCORE scores tom "88"3) 獲得指定分數范圍的元素
127.0.0.1:6379> ZRANGEBYSCORE scores 80 90 WITHSCORES 1) "jerry" 2) "85" 3) "tom" 4) "88"4) 增加某個元素的分數
127.0.0.1:6379> ZINCRBY scores 3 bob "78"127.0.0.1:6379> ZSCORE scores bob "78"5) 獲得集合中元素的數量
127.0.0.1:6379> ZCARD scores (integer) 46) 獲得指定分數范圍內的元素個數
127.0.0.1:6379> ZCOUNT scores 80 90 (integer) 27) 刪除元素
127.0.0.1:6379> ZREM scores bob (integer) 18) 獲得元素的排名
127.0.0.1:6379> ZRANK scores tom # 獲取tom的排名 (integer) 1 # 升序排列,從0開始計數127.0.0.1:6379> ZREVRANK scores alice # 獲取alice的排名 (integer) 0 # 降序排列,從0開始計數14.有序集合類型實踐
- 例:將博客文章按照點擊量排序
127.0.0.1:6379> ZADD posts:page.view 0 post:10:page.view (integer) 1127.0.0.1:6379> ZINCRBY posts:page.view 1 post:10:page.view "1"127.0.0.1:6379> ZRANGE posts:page.view 0 -1 WITHSCORES 1) "post:10:page.view" 2) "1"四.Redis其他操作命令
1.數據操作命令
1) 查看key過期時間
127.0.0.1:6379> TTL name (integer) -1 # -1 表示永不過期# 創建key的同時,設置它的過期時間。key是user1:login,value是235124,超時時間60秒 127.0.0.1:6379> SET user1:login 235124 ex 60 OK2) 設置key的過期時間(秒)
127.0.0.1:6379> EXPIRE password 20 (integer) 1127.0.0.1:6379> TTL password (integer) 15127.0.0.1:6379> TTL password (integer) -2 # -2表示已過期3)查看key是否存在
127.0.0.1:6379> EXISTS password (integer) 04) 存盤
127.0.0.1:6379> SAVE OK2.數據庫操作命令
1) 默認Redis有16個庫,將name移動到1號庫
127.0.0.1:6379> MOVE name 1 (integer) 12) 選擇庫
127.0.0.1:6379> SELECT 1 OK127.0.0.1:6379[1]> KEYS * 1) "name"3) 清除庫
# 清除當前庫 127.0.0.1:6379[1]> FLUSHDB OK127.0.0.1:6379[1]> KEYS * (empty list or set)# 清除所有庫 127.0.0.1:6379[1]> SELECT 0 OK127.0.0.1:6379> KEYS *1) "numbers"2) "2"3) "posts:list"4) "letters"5) "posts:page.view"6) "scores"7) "post:10:tags"8) "foo"9) "s1" 10) "s2" 11) "num" 12) "post:10" 13) "user1" 14) "username" 15) "hi" 16) "post:42:page.view"127.0.0.1:6379> SELECT 1 OK127.0.0.1:6379[1]> FLUSHALL OK127.0.0.1:6379[1]> SELECT 1 OK127.0.0.1:6379[1]> KEYS * (empty list or set)4)關閉Redis
127.0.0.1:6379> SHUTDOWN not connected> exit3.修改Redis服務運行參數
1) 常用參數
????????- 監聽地址:默認運行在127.0.0.1上
????????- 監聽端口:默認監聽6379端口(不用修改)
????????- 密碼
2) 修改啟動腳本
[root@redis1 ~]# vim +43 /etc/init.d/redis_6379 ... ...$CLIEXEC -p $REDISPORT -a tedu.cn shutdown ... ...3) 啟動服務并測試
[root@redis1 ~]# service redis_6379 start Starting Redis server...[root@redis1 ~]# redis-cli -h 192.168.1.11 -p 6379 -a tedu.cn 192.168.1.11:6379> PING PONG
?
更多Python操作參見:https://www.cnblogs.com/melonjiang/p/5342505.html
?
總結
以上是生活随笔為你收集整理的NOSQL的Redis的基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装Mysql与nginx结合的小型服务
- 下一篇: Redis主从复制的搭建与.哨兵.数据持