1. 程式人生 > 實用技巧 >python與selenium自動化基礎-呼叫js程式碼

python與selenium自動化基礎-呼叫js程式碼

redis簡介

redis官網

Redis是什麼

Redis 是一個開源(BSD許可)的,記憶體中的資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。 它支援多種型別的資料結構,如 字串(strings)雜湊(hashes)列表(lists)集合(sets)有序集合(sorted sets) 與範圍查詢, bitmapshyperloglogs地理空間(geospatial) 索引半徑查詢。 Redis 內建了 複製(replication)LUA指令碼(Lua scripting)LRU驅動事件(LRU eviction)事務(transactions)

和不同級別的 磁碟持久化(persistence), 並通過 Redis哨兵(Sentinel)和自動 分割槽(Cluster)提供高可用性(high availability)。

它是是一個開源的底層使用C語言編寫的key-value儲存資料庫。可用於快取、事件釋出訂閱、高速佇列等場景。而且支援豐富的資料型別:string(字串)、hash(雜湊)、list(列表)、set(無序集合)、zset(sorted set:有序集合)

Redis的效能極高,讀的速度是110000次/s,寫的速度是81000次/s,支援事務,支援備份,豐富的資料型別。

Redis速度快的原因

1、Redis是純記憶體操作,需要的時候需要我們手動持久化到硬碟中

2、Redis是單執行緒,從而避開了多執行緒中上下文頻繁切換的操作。

3、Redis資料結構簡單、對資料的操作也比較簡單

4、使用底層模型不同,它們之間底層實現方式以及與客戶端之間通訊的應用協議不一樣,Redis直接自己構建了VM 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求

5、使用多路I/O複用模型,非阻塞I/O

多路I/O複用:

I/O 多路複用技術是為了解決程序或執行緒阻塞到某個 I/O 系統呼叫而出現的技術,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒,就是這個檔案描述符進行讀寫操作之前),能夠通知程式進行相應的讀寫操作

為什麼使用redis

Redis是一種NoSQL資料庫,NoSQL資料庫在整個資料庫領域的江湖地位已經不言而喻。在大資料時代,雖然RDBMS(關係型資料庫管理系統)很優秀,但是面對快速增長的資料規模和日漸複雜的資料模型,RDBMS漸漸力不從心,無法應對很多資料庫處理任務。

NoSQL資料庫在整個資料庫領域的江湖地位已經不言而喻。在大資料時代,雖然RDBMS很優秀,但是面對快速增長的資料規模和日漸複雜的資料模型,RDBMS漸漸力不從心,無法應對很多資料庫處理任務,這時NoSQL憑藉易擴充套件、大資料量和高效能以及靈活的資料模型成功的在資料庫領域站穩了腳跟。

目前大家基本認同將NoSQL資料庫分為四大類:鍵值儲存資料庫,文件型資料庫,列儲存資料庫和圖形資料庫,其中每一種型別的資料庫都能夠解決關係型資料不能解決的問題。在實際應用中,NoSQL資料庫的分類界限其實沒有那麼明顯,往往會是多種型別的組合體。

Redis 是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。目前由VMware主持開發工作。

應用場景

1、快取

快取現在幾乎是所有中大型網站都在用的必殺技,合理的利用快取不僅能夠提升網站訪問速度,還能大大降低資料庫的壓力。Redis提供了鍵過期功能,也提供了靈活的鍵淘汰策略,所以,現在Redis用在快取的場合非常多。

2、排行榜

很多網站都有排行榜應用的,如京東的月度銷量榜單、商品按時間的上新排行榜等。Redis提供的有序集合資料類構能實現各種複雜的排行榜應用。

3、計數器

什麼是計數器,如電商網站商品的瀏覽量、視訊網站視訊的播放數等。為了保證資料實時效,每次瀏覽都得給+1,併發量高時如果每次都請求資料庫操作無疑是種挑戰和壓力。Redis提供的incr命令來實現計數器功能,記憶體操作,效能非常好,非常適用於這些計數場景。

4、分散式會話

叢集模式下,在應用不多的情況下一般使用容器自帶的session複製功能就能滿足,當應用增多相對複雜的系統中,一般都會搭建以Redis等記憶體資料庫為中心的session服務,session不再由容器管理,而是由session服務及記憶體資料庫管理。

5、分散式鎖

在很多網際網路公司中都使用了分散式技術,分散式技術帶來的技術挑戰是對同一個資源的併發訪問,如全域性ID、減庫存、秒殺等場景,併發量不大的場景可以使用資料庫的悲觀鎖、樂觀鎖來實現,但在併發量高的場合中,利用資料庫鎖來控制資源的併發訪問是不太理想的,大大影響了資料庫的效能。可以利用Redis的setnx功能來編寫分散式的鎖,如果設定返回1說明獲取鎖成功,否則獲取鎖失敗,實際應用中要考慮的細節要更多。

6、 社交網路

點贊、踩、關注/被關注、共同好友等是社交網站的基本功能,社交網站的訪問量通常來說比較大,而且傳統的關係資料庫型別不適合儲存這種型別的資料,Redis提供的雜湊、集合等資料結構能很方便的的實現這些功能。

7、最新列表

Redis列表結構,LPUSH可以在列表頭部插入一個內容ID作為關鍵字,LTRIM可用來限制列表的數量,這樣列表永遠為N個ID,無需查詢最新的列表,直接根據ID去到對應的內容頁即可。

8、訊息系統

訊息佇列是大型網站必用中介軟體,如ActiveMQ、RabbitMQ、Kafka等流行的訊息佇列中介軟體,主要用於業務解耦、流量削峰及非同步處理實時性低的業務。Redis提供了釋出/訂閱及阻塞佇列功能,能實現一個簡單的訊息佇列系統。另外,這個不能和專業的訊息中介軟體相比。

安裝redis

1.安裝

#安裝依賴
yum -y install centos-release-scl
[root@localhost ~]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

#臨時將此時的gcc版本改為9
[root@localhost ~]# scl enable devtoolset-9 bash
#或永久改變
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

#檢視gcc版本
[root@localhost ~]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-9/root/usr --mandir=/opt/rh/devtoolset-9/root/usr/share/man --infodir=/opt/rh/devtoolset-9/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --with-default-libstdcxx-abi=gcc4-compatible --enable-plugin --enable-initfini-array --with-isl=/builddir/build/BUILD/gcc-9.3.1-20200408/obj-x86_64-redhat-linux/isl-install --disable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC) 


#下載最新穩定版本
[root@localhost ~]# wget http://download.redis.io/releases/redis-6.0.6.tar.gz
[root@localhost ~]# tar xf redis-6.0.6.tar.gz -C /usr/local/
[root@localhost ~]# mv /usr/local/redis-6.0.6/ /usr/local/redis
[root@localhost ~]# cd /usr/local/redis/
[root@localhost redis]# make
[root@localhost redis]# make install

[root@localhost redis]# cp src/redis-server src/redis-cli /usr/bin/


2.配置開機自啟

#新建redis.service服務檔案
[root@localhost ~]# vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis Server Manager
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/src/redis-server /usr/local/redis/redis.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target


[root@localhost ~]# vim /usr/local/redis/redis.conf 
daemonize yes
……
supervised systemd



#重新整理systemctl
systemctl daemon-reload
#啟動redis
[root@localhost ~]# systemctl start redis
#設定redis開機自啟動
[root@localhost ~]# systemctl enable redis
[root@localhost ~]# systemctl status redis
● redis.service - Redis Server Manager
   Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
   Active: active (running) since 四 2020-08-13 18:47:00 CST; 10s ago
  Process: 1401 ExecStart=/usr/local/redis/src/redis-server /usr/local/redis/redis.conf (code=exited, status=0/SUCCESS)
 Main PID: 1402 (redis-server)
   CGroup: /system.slice/redis.service
           └─1402 /usr/local/redis/src/redis-server 127.0.0.1:6379

8月 13 18:47:00 localhost.localdomain systemd[1]: Starting Redis Server Manager...
8月 13 18:47:00 localhost.localdomain redis-server[1401]: 1401:C 13 Aug 2020 18:47:00.235 # oO0OoO0OoO0Oo Redis ...0Oo
8月 13 18:47:00 localhost.localdomain redis-server[1401]: 1401:C 13 Aug 2020 18:47:00.235 # Redis version=6.0.6,...ted
8月 13 18:47:00 localhost.localdomain redis-server[1401]: 1401:C 13 Aug 2020 18:47:00.235 # Configuration loaded
8月 13 18:47:00 localhost.localdomain redis-server[1401]: 1401:C 13 Aug 2020 18:47:00.235 # WARNING supervised b...it.
8月 13 18:47:00 localhost.localdomain redis-server[1401]: 1401:C 13 Aug 2020 18:47:00.235 # systemd supervision ...und
8月 13 18:47:00 localhost.localdomain systemd[1]: Started Redis Server Manager.
Hint: Some lines were ellipsized, use -l to show in full.

3.設定密碼

[root@localhost ~]# vim /usr/local/redis/redis.conf
requirepass 123456		//786行

[root@localhost ~]# systemctl restart redis
[root@localhost ~]# ss -tanl
State       Recv-Q Send-Q              Local Address:Port                             Peer Address:Port              
LISTEN      0      100                     127.0.0.1:25                                          *:*                  
LISTEN      0      128                     127.0.0.1:6379                                        *:*                  
LISTEN      0      128                             *:22                                          *:*                  
LISTEN      0      100                         [::1]:25                                       [::]:*                  
LISTEN      0      128                          [::]:22                                       [::]:*       


#登入認證
[root@localhost ~]# redis-cli 
127.0.0.1:6379> set foo bar
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"


#也可以-a選項登入
[root@localhost ~]# redis-cli -h 127.0.0.1 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set a 10
OK
127.0.0.1:6379> get a
"10"
#檢視密碼
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "123456"



//在Redis叢集中使用認證密碼
//如果Redis伺服器,使用了叢集。除了在master中配置密碼外,也需要在slave中進行相應配置。在slave的配置檔案中找到如下行,去掉註釋並修改與master相同的密碼即可:

# masterauth master-password

4.常用命令

EXISTS key [key ...]

返回值

integer-reply,如下的整數結果

  • 1 如果key存在
  • 0 如果key不存在

例:

127.0.0.1:6379> EXISTS foo
(integer) 1
127.0.0.1:6379> EXISTS abc
(integer) 0

#keys * 檢視所有key
127.0.0.1:6379> keys *
1) "a"
2) "foo"

EXISTS key [key ...]

key是否存在。

返回值

integer-reply,如下的整數結果

  • 1 如果key存在
  • 0 如果key不存在

例子

127.0.0.1:6379> set abc hello
OK
127.0.0.1:6379> EXISTS abc
(integer) 1
127.0.0.1:6379> EXISTS abcd
(integer) 0

APPEND key value

如果 key 已經存在,並且值為字串,那麼這個命令會把 value 追加到原來值(value)的結尾。 如果 key 不存在,那麼它將首先建立一個空字串的key,再執行追加操作,這種情況 APPEND 將類似於 SET 操作。

返回值

Integer reply:返回append後字串值(value)的長度。

例子

127.0.0.1:6379> EXISTS hello
(integer) 0
127.0.0.1:6379> APPEND hello "HELLO"
(integer) 5
127.0.0.1:6379> APPEND hello "WORLD"
(integer) 10
127.0.0.1:6379> GET hello
"HELLOWORLD"

DEL key [key ...]

刪除指定的一批keys,如果刪除中的某些key不存在,則直接忽略。

返回值

integer-reply: 被刪除的keys的數量

例子

127.0.0.1:6379> SET a 1
OK
127.0.0.1:6379> SET b 2
OK
127.0.0.1:6379> set c 3
OK
127.0.0.1:6379> DEL a b 
(integer) 2
127.0.0.1:6379> keys *
1) "hello"
2) "foo"
3) "c"
4) "abc"

redis持久化儲存

redis的資料儲存在記憶體中,所以當我們關掉軟體,或者拔掉電源時,記憶體中的資料就會丟失。針對此場景,這裡提出持久化的方案。它的核心就是將記憶體中的資料儲存到硬碟中進行持久化。

  • RDB: 基於快照的持久化,速度更快,一般用作備份。主從複製也是依賴於rdb持久化功能。
  • AOF:以追加的形式記錄redis操作日誌的檔案。可以最大程度保證redis資料安全,類似於mysql的binlog。

方案一:RDB持久化

這個是redis預設的持久化的方案,它的原理是在一定時間內檢測key的變化情況,然後持久化資料。它可以手動執行save來觸發持久化資料,也可以通過配置redis.conf檔案,執行定時執行。
RDB持久化產生的RDB檔案是一個經過壓縮的二進位制檔案,這個檔案儲存在硬碟中,redis可以通過這個檔案還原資料庫當時的狀態。涉及核心配置如下:

[root@k8s001 ~]# cat /etc/redis.conf
dbfilename  s17dump.rdb           # 指定rdb的資料檔案   
bind 0.0.0.0
requirepass redhat                # 指定redis的密碼   
save 900 1                        # 代表900秒內,有1個修改key的操作,就進行持久化      
save 300 10                       # 300秒內,有10個修改類的操作,就持久化
save 60  10000                    # 60秒內,有10000個修改類的操作,就持久化

優點:速度快,適合做備份,主從複製就是基於RDB持久化功能實現

方案二:AOF持久化

這裡不需要手動的save觸發持久化。
記錄伺服器執行的所有變更操作命令(例如set del等),並在伺服器啟動時,通過重新執行這些命令來還原資料集。AOF 檔案中的命令全部以redis協議的格式儲存,新命令追加到檔案末尾。
涉及核心配置如下:

[root@k8s001 ~]# cat /etc/redis.conf
appendonly yes            # 開啟aof持久化的引數
appendfsync everysec      # 每秒進行一次aof持久化

優點:最大程度保證資料不丟失。
缺點:日誌記錄非常大

RDB 優點:訪問效能最佳 缺點:資料不安全、fork消耗極大
AOF 優點:資料相對安全 缺點:訪問效能相對不在最佳