linux快取工具之redis

2020-08-14 11:06:39

1. Redis 簡介

redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(雜湊型別)。這些數據型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是快取在記憶體中。區別的是redis會週期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高效能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value儲存的不足,在部 分場合可以對關係數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等用戶端,使用很方便。 [1]
Redis支援主從同步。數據可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複製。存檔可以有意無意的對數據進行寫操作。由於完全實現了發佈/訂閱機制 機製,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主伺服器完整的訊息發佈記錄。同步對讀取操作的可延伸性和數據冗餘很有幫助。
redis的官網地址,非常好記,是redis.io。(域名後綴io屬於國家域名,是british Indian Ocean territory,即英屬印度洋領地),Vmware在資助着redis專案的開發和維護。

2. Redis的優勢和特點

Redis的特點:
記憶體數據庫,速度快,也支援數據的持久化,可以將記憶體中的數據儲存在磁碟中,重新啓動的時候可以再次載入進行使用。
Redis不僅僅支援簡單的key-value型別的數據,同時還提供list,set,zset,hash等數據結構的儲存。
Redis支援數據的備份,即master-slave模式的數據備份。
支援事務
Redis的優勢:
效能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
豐富的數據型別 – Redis支援二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據型別操作。
原子 – Redis的所有操作都是原子性的,同時Redis還支援對幾個操作合併後的原子性執行。(事務)
豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。
Redis與其他key-value儲存有什麼不同?
Redis有着更爲複雜的數據結構並且提供對他們的原子性操作,這是一個不同於其他數據庫的進化路徑。Redis的數據型別都是基於基本數據結構的同時對程式設計師透明,無需進行額外的抽象。
Redis執行在記憶體中但是可以持久化到磁碟,所以在對不同數據集進行高速讀寫時需要權衡記憶體,因爲數據量不能大於硬體記憶體。在記憶體數據庫方面的另一個優點是,相比在磁碟上相同的複雜的數據結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部複雜性很強的事情。同時,在磁碟格式方面他們是緊湊的以追加的方式產生的,因爲他們並不需要進行隨機存取。

3. Redis安裝及設定

[root@xian ~]# wget  http://download.redis.io/releases/redis-6.0.6.tar.gz
[root@xian ~]# tar xf redis-6.0.6.tar.gz 
[root@xian ~]# ls
[root@xian ~]# cd redis-6.0.6
[root@xian redis-6.0.6]# make
server.c:5209:176: error: ‘struct redisServer’ has no member named ‘maxmemory’
錯誤原因
gcc版本問題,新版本的。redis6.0以上

//檢視gcc版本
[root@xian ~]# gcc -v
gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
//解決辦法
//升級到 5.3及以上版本
[root@xian ~]# yum -y install centos-release-scl
[root@xian ~]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
 
[root@xian ~]# scl enable devtoolset-9 bash
 
//注意:scl命令啓用只是臨時的,推出xshell或者重新啓動就會恢復到原來的gcc版本。
#如果要長期生效的話,執行如下:
[root@xian ~]# echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile

[root@xian ~]# cd redis-6.0.6
[root@xian redis-6.0.6]# make
Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory `/root/redis-6.0.6/src'

//需要執行:

[root@xian redis-6.0.6]# sudo make distclean

[root@xian redis-6.0.6]# sudo make

[root@xian redis-6.0.6]# make test

[root@xian ~]# rm -rf redis-6.0.6
[root@xian ~]# tar xf redis-6.0.6.tar.gz 
[root@xian ~]# cd redis-6.0.6
[root@xian redis-6.0.6]# make
[root@xian redis-6.0.6]# cd src/
[root@xian src]# ls

redis-cli              redis-server
[root@xian ~]# cp redis-6.0.6/src/redis-server redis-6.0.6/src/redis-cli /usr/bin/
[root@xian ~]# which redis-cli
/usr/bin/redis-cli
[root@xian ~]# redis-server
2026:C 14 Aug 2020 09:39:27.537 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2026:C 14 Aug 2020 09:39:27.537 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=2026, just started
2026:C 14 Aug 2020 09:39:27.537 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
2026:M 14 Aug 2020 09:39:27.538 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.0.6 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 2026
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

2026:M 14 Aug 2020 09:39:27.538 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2026:M 14 Aug 2020 09:39:27.538 # Server initialized
2026:M 14 Aug 2020 09:39:27.538 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
2026:M 14 Aug 2020 09:39:27.538 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
2026:M 14 Aug 2020 09:39:27.538 * Ready to accept connections
[root@xian ~]# ss -antl|grep 6379
LISTEN     0      128          *:6379                     *:*                  
LISTEN     0      128         :::6379                    :::* 

4. redis基礎操作

//進入redis操作
[root@xian ~]# redis-cli
127.0.0.1:6379> set z 222
OK
127.0.0.1:6379> get z
"222"
127.0.0.1:6379> quit

//設定密碼
[root@xian ~]# cp redis-6.0.6/redis.conf /etc/
[root@xian ~]# vim /etc/redis.conf

requirepass 123456    //修改密碼

//重新啓動服務
[root@xian ~]# nohup redis-server /etc/redis.conf &
[1] 2117
[root@xian ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@xian ~]#
[root@xian ~]# redis-cli
127.0.0.1:6379> set df 15
(error) NOAUTH Authentication required.  
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set df 15
OK
//常用命令
//顯示擁有的key
127.0.0.1:6379> keys *
1) "ba"
2) "df"
3) "fd"
4) "z"
//導出key
127.0.0.1:6379> dump z
"\x00\xc1\xde\x00\t\x00\xc7\xdd\xbe<;\x1d\xc5^"
//刪除key
127.0.0.1:6379> del fd
(integer) 1
127.0.0.1:6379> keys *
1) "ba"
2) "df"
3) "z"
//查詢key是否存在
127.0.0.1:6379> exists a
(integer) 0
127.0.0.1:6379> exists z
(integer) 1