1. 程式人生 > >學習Redis(五)

學習Redis(五)

 

Redis介紹

Redis 是完全開源免費的,遵守BSD協議,是一個高效能的key-value資料庫。

Redis 與其他 key - value 快取產品有以下三個特點:

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可以做很多內部複雜性很強的事情。 同時,在磁碟格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。

 

 Remote Dictionary Server(Redis)是一個基於 key-value 鍵值對的持久化資料庫儲存系統。redis 和 Memcached 快取服務很像,但它支援儲存的 value 型別相對更多,包括 string (字串)、list (

連結串列)、set (集合)、zset (sorted set --有序集合)和 hash(雜湊型別)。這些資料型別都 支援 push/pop、add/remove 及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis 支援各種不同方式的排序。與 memcached 一樣,為了保證效率,資料都是快取在記憶體中。區別的是 redis 會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了 master-slave (主從)同步。

redis 的出現,再一定程度上彌補了 Memcached 這類 key-value 記憶體換乘服務的不足,在部分場合可以對關係資料庫起到很好的補充作用。redis 提供了 Python,Ruby,Erlang,PHP 客戶端,使用方便。官方文件: https://redis.io/documentation

Redis 在新浪微博中的應用

http://www.cnblogs.com/me115/p/3482783.html

 

Redis 安裝和使用例項

複製程式碼
環境:
[[email protected] /]# uname -r
2.6.32-504.el6.x86_64
[[email protected] /]# ifconfig eth0|awk -F '[ :]+' 'NR==2{print $4}'
192.168.179.161
[[email protected] /]# cat /etc/redhat-release 
CentOS release 6.6 (Final)
[[email protected] /]# /etc/init.d/iptables status
iptables:未執行防火牆。
[[email protected] /]# getenforce
Permissive
#3.0版本原始碼安裝也一樣
wget -q http://download.redis.io/releases/redis-2.8.9.tar.gz   
tar xf redis-2.8.9.tar.gz
cd redis-2.8.9
#less README
make MALLOC=jemalloc
make PREFIX=/application/redis-2.8.9 install
ln -s /application/redis-2.8.9/ /application/redis

tree /application/redis
/application/redis
`-- bin
    |-- redis-benchmark     # Redis效能測試工具,測試Redis在系統及你的配置下的讀寫效能。
    |-- redis-check-aof     # 更新日誌檢查。
    |-- redis-check-dump    # 用於本地資料庫檢查。
    |-- redis-cli           # Redis命令列操作工具。也可以telnet根據其純文字協議操作
    `-- redis-server        # Redis伺服器的daemon啟動程式。
1 directory, 5 files
配置環境變數
[[email protected] redis-2.8.9]# echo 'export PATH=/application/redis/bin/:$PATH' >>/etc/profile
[[email protected] redis-2.8.9]# 
[[email protected] redis-2.8.9]# tail -1 /etc/profile
export PATH=/application/redis/bin/:$PATH
[[email protected] redis-2.8.9]# . /etc/profile
[[email protected] redis-2.8.9]# which redis-server
/application/redis/bin/redis-server
拷貝生成配置檔案
[[email protected] redis-2.8.9]#  mkdir /application/redis/conf
[[email protected] redis-2.8.9]# pwd
 [[email protected] redis-2.8.9]# cp redis.conf /application/redis/conf/
啟動redis
redis-server /application/redis/conf/redis.conf &
[20222] 29 Nov 20:43:48.571 # 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.
[20222] 29 Nov 20:43:48.571 * The server is now ready to accept connections on port 6379
檢查埠
lsof -i :6379
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
redis-ser 20222 root    4u  IPv6 1523437      0t0  TCP *:6379 (LISTEN)
redis-ser 20222 root    5u  IPv4 1523439      0t0  TCP *:6379 (LISTEN)

去掉上面的警告資訊
sysctl vm.overcommit_memory=1
echo 'vm.overcommit_memory=1' >>/etc/sysctl.conf
sysctl -p
關閉redis操作的命令
redis-cli shutdown save
複製程式碼

 

常見操作

複製程式碼
[[email protected] redis-2.8.9]# redis-cli
127.0.0.1:6379> set id 001  #插入資料:設定一個key-value對
OK
127.0.0.1:6379> get id   #查詢資料:取出key所對應的value
"001"
127.0.0.1:6379> del id #刪除鍵值
(integer) 1
127.0.0.1:6379> get id  #查詢資料
(nil)
127.0.0.1:6379> exists id   #驗證是否存在,1代表存在,0代表不存在
(integer) 0

127.0.0.1:6379> set user001 oldboy
OK
127.0.0.1:6379> set user002 zsq
OK
127.0.0.1:6379> set user003 test
OK
127.0.0.1:6379> get user001
"oldboy"
127.0.0.1:6379> keys *   #取出所有
1) "user003"
2) "user002"
3) "user001"

select可以切換庫從0到15  ,在第一個庫建立的內容其它庫是不可見的
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> set name oldboy
OK
127.0.0.1:6379[1]> get name
"oldboy"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "user003"
2) "user002"
3) "user001"
127.0.0.1:6379> select 16
(error) ERR invalid DB index
127.0.0.1:6379[16]> select 15
OK
複製程式碼

其它連線方式

複製程式碼
redis-cli -h 192.168.179.162 -p 6379
非互動式
[[email protected] redis-2.8.9]# redis-cli -h 192.168.179.162 -p 6379 set k v
OK
[[email protected] redis-2.8.9]# redis-cli -h 192.168.179.162 -p 6379 get k
"v"
telnet 加IP 加埠也可以
[[email protected] redis-2.8.9]# telnet 192.168.179.162 6379
Trying 192.168.179.162...
Connected to 192.168.179.162.
Escape character is '^]'.
set a b
+OK
get a
$1
B
nc的方式
[[email protected] redis-2.8.9]# echo "set no004 zsq"|nc 127.0.0.1 6379
+OK
[[email protected] redis-2.8.9]# echo "get no004 "|nc 127.0.0.1 6379
$3
zsq
複製程式碼

redis的幫助

複製程式碼
redis-cli  --help
192.168.179.162:6379> help
redis-cli 2.8.9
Type: "help @<group>" to get a list of commands in <group>
      "help <command>" for help on <command>
      "help <tab>" to get a list of possible help topics
      "quit" to exit
複製程式碼

redis的安全賬戶密碼及授權許可權

複製程式碼
vim /application/redis/conf/redis.conf
335 # Warning: since Redis is pretty fast an outside user can try up to
336 # 150k passwords per second against a good box. This means that you should
337 # use a very strong password otherwise it will be very easy to break.、
339行設定密碼
339 requirepass zsq
重啟生效
redis-cli shutdown
 redis-server /application/redis/conf/redis.conf &

[[email protected] redis-2.8.9]# redis-cli
127.0.0.1:6379> set k v
(error) NOAUTH Authentication required. #提示許可權不夠
127.0.0.1:6379> auth zsq  #用auth加密碼
OK
127.0.0.1:6379> set k v
OK
非互動式 –a指定密碼
[[email protected] redis-2.8.9]# redis-cli -a zsq
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> get k2
"v2"
停止redis
redis-cli -a zsq shutdown
可以遮蔽跟改名
# It is possible to change the name of dangerous commands in a shared
# environment. For instance the CONFIG command may be renamed into something
# hard to guess so that it will still be available for internal-use tools
# but not available for general clients.
#
# Example:
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command set ""  #比如遮蔽這個set

[[email protected] redis-2.8.9]# redis-cli shutdown  
(error) NOAUTH Authentication required.#關閉都沒許可權
[[email protected] redis-2.8.9]# redis-cli -a zsq shutdown #指定密碼關閉
[[email protected] redis-2.8.9]# redis-server /application/redis/conf/redis.conf & #啟動
[[email protected] redis-2.8.9]# redis-cli  
127.0.0.1:6379> set k v #執行set
(error) ERR unknown command 'set'   #提示找不到這個命令
127.0.0.1:6379>
複製程式碼

在php環境中安裝redis的客戶端擴充套件

複製程式碼
# 1、下載安裝
wget https://github.com/phpredis/phpredis/archive/master.zip

unzip phpredis-master.zip
cd phpredis-master
/application/php/bin/phpize
./configure --with-php-config=/application/php/bin/php-config
make
make install

cd/application/php-5.6.8/lib/php/extensions/no-debug-non-zts-20131226/
ls
memcache.so  opcache.a  opcache.so  redis.so


# 2、修改php.ini設定,重啟php
在php.ini追加一條記錄
echo "extension = redis.so" >> /application/php/lib/php.ini

#重啟 php-fpm
killall php-fpm
/application/php/sbin/php-fpm

#網頁測試
複製程式碼

php程式實戰操作redis服務

複製程式碼
必須要有php環境
cat /application/php/bin/php 1.php
<?php
     $redis = new Redis();
     $redis ->connect('192.168.179.162',6379);
     $redis ->auth('zsq');
     $redis ->set('name','zsq');
     $var = $redis ->get('name');
     echo "$var\n";
?>
複製程式碼

Python操作Redis

複製程式碼
pip install redis
or
sudo easy_install redis
or
sudo python setup.py install

詳見:
https://github.com/WoLpH/redis-py
https://pypi.python.org/pypi/redis
https://redislabs.com/python-redis
複製程式碼

逐條解讀redis服務的配置檔案

複製程式碼
[[email protected] redis-2.8.9]# grep -vE "#|^$" /application/redis/conf/redis.conf 
daemonize no    #在後臺執行
pidfile /var/run/redis.pid  #pid file
port 6379 #預設埠
tcp-backlog 511 #tcp的佇列
# bind 192.168.1.100 10.0.0.1  #預設監聽所有,如果有外網的環境需要監聽內網的
# bind 127.0.0.1
timeout 0  #客戶端的超時,0表示不超時
tcp-keepalive 0 #tcp的會話保持
loglevel notice #日誌級別
logfile "" #可以把日誌記到log檔案,不輸出到螢幕
# syslog-facility local0  #日誌裝置,日誌集中收集可以把註釋去掉
databases 16 #設定資料庫的數量,類似mysql的資料庫
save 900 1
save 300 10
save 60 10000
#以上三項是快照
stop-writes-on-bgsave-error yes #如果bgsave出錯是否停止寫
rdbcompression yes #在dump的時候要不要壓縮,壓縮會消耗cpu
rdbchecksum yes #rdb的檢查
dbfilename dump.rdb #dump的磁碟檔案
dir ./ #控制上邊選項的路徑的,當前路徑
slave-serve-stale-data yes #主從同步
slave-read-only yes 
repl-disable-tcp-nodelay no
slave-priority 100
requirepass zsq  #安全選項,授權密碼
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100 #自動保持rewrite
auto-aof-rewrite-min-size 64mb 
lua-time-limit 5000 #lua指令碼實現更多生產場景
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512 #hash優化引數
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
複製程式碼

引數說明

複製程式碼
redis.conf 配置項說明如下:
1. Redis預設不是以守護程序的方式執行,可以通過該配置項修改,使用yes啟用守護程序
    daemonize no
2. 當Redis以守護程序方式執行時,Redis預設會把pid寫入/var/run/redis.pid檔案,可以通過pidfile指定
    pidfile /var/run/redis.pid
3. 指定Redis監聽埠,預設埠為6379,作者在自己的一篇博文中解釋了為什麼選用6379作為預設埠,因為6379在手機按鍵上MERZ對應的號碼,而MERZ取自義大利歌女Alessia Merz的名字
    port 6379
4. 繫結的主機地址
    bind 127.0.0.1
5.當 客戶端閒置多長時間後關閉連線,如果指定為0,表示關閉該功能
    timeout 300
6. 指定日誌記錄級別,Redis總共支援四個級別:debug、verbose、notice、warning,預設為verbose
    loglevel verbose
7. 日誌記錄方式,預設為標準輸出,如果配置Redis為守護程序方式執行,而這裡又配置為日誌記錄方式為標準輸出,則日誌將會發送給/dev/null
    logfile stdout
8. 設定資料庫的數量,預設資料庫為0,可以使用SELECT <dbid>命令在連線上指定資料庫id
    databases 16
9. 指定在多長時間內,有多少次更新操作,就將資料同步到資料檔案,可以多個條件配合
    save <seconds> <changes>
    Redis預設配置檔案中提供了三個條件:
    save 900 1
    save 300 10
    save 60 10000
    分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
 
10. 指定儲存至本地資料庫時是否壓縮資料,預設為yes,Redis採用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致資料庫檔案變的巨大
    rdbcompression yes
11. 指定本地資料庫檔名,預設值為dump.rdb
    dbfilename dump.rdb
12. 指定本地資料庫存放目錄
    dir ./
13. 設定當本機為slav服務時,設定master服務的IP地址及埠,在Redis啟動時,它會自動從master進行資料同步
    slaveof <masterip> <masterport>
14. 當master服務設定了密碼保護時,slav服務連線master的密碼
    masterauth <master-password>
15. 設定Redis連線密碼,如果配置了連線密碼,客戶端在連線Redis時需要通過AUTH <password>命令提供密碼,預設關閉
    requirepass foobared
16. 設定同一時間最大客戶端連線數,預設無限制,Redis可以同時開啟的客戶端連線數為Redis程序可以開啟的最大檔案描述符數,如果設定 maxclients 0,表示不作限制。當客戶端連線數到達限制時,Redis會關閉新的連線並向客戶端返回max number of clients reached錯誤資訊
    maxclients 128
17. 指定Redis最大記憶體限制,Redis在啟動時會把資料載入到記憶體中,達到最大記憶體後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大記憶體設定,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放記憶體,Value會存放在swap區
    maxmemory <bytes>
18. 指定是否在每次更新操作後進行日誌記錄,Redis在預設情況下是非同步的把資料寫入磁碟,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為 redis本身同步資料檔案是按上面save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設為no
    appendonly no
19. 指定更新日誌檔名,預設為appendonly.aof
     appendfilename appendonly.aof
20. 指定更新日誌條件,共有3個可選值:     no:表示等作業系統進行資料快取同步到磁碟(快)     always:表示每次更新操作後手動呼叫fsync()將資料寫到磁碟(慢,安全)     everysec:表示每秒同步一次(折衷,預設值)
    appendfsync everysec
 
21. 指定是否啟用虛擬記憶體機制,預設值為no,簡單的介紹一下,VM機制將資料分頁存放,由Redis將訪問量較少的頁即冷資料swap到磁碟上,訪問多的頁面由磁碟自動換出到記憶體中(在後面的文章我會仔細分析Redis的VM機制)
     vm-enabled no
22. 虛擬記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis例項共享
     vm-swap-file /tmp/redis.swap
23. 將所有大於vm-max-memory的資料存入虛擬記憶體,無論vm-max-memory設定多小,所有索引資料都是記憶體儲存的(Redis的索引資料 就是keys),也就是說,當vm-max-memory設定為0的時候,其實是所有value都存在於磁碟。預設值為0
     vm-max-memory 0
24. Redis swap檔案分成了很多的page,一個物件可以儲存在多個page上面,但一個page上不能被多個物件共享,vm-page-size是要根據儲存的 資料大小來設定的,作者建議如果儲存很多小物件,page大小最好設定為32或者64bytes;如果儲存很大大物件,則可以使用更大的page,如果不 確定,就使用預設值
     vm-page-size 32
25. 設定swap檔案中的page數量,由於頁表(一種表示頁面空閒或使用的bitmap)是在放在記憶體中的,,在磁碟上每8個pages將消耗1byte的記憶體。
     vm-pages 134217728
26. 設定訪問swap檔案的執行緒數,最好不要超過機器的核數,如果設定為0,那麼所有對swap檔案的操作都是序列的,可能會造成比較長時間的延遲。預設值為4
     vm-max-threads 4
27. 設定在向客戶端應答時,是否把較小的包合併為一個包傳送,預設為開啟
    glueoutputbuf yes
28. 指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的雜湊演算法
    hash-max-zipmap-entries 64
    hash-max-zipmap-value 512
29. 指定是否啟用重置雜湊,預設為開啟(後面在介紹Redis的雜湊演算法時具體介紹)
    activerehashing yes
30. 指定包含其它的配置檔案,可以在同一主機上多個Redis例項之間使用同一份配置檔案,而同時各個例項又擁有自己的特定配置檔案
    include /path/to/local.conf
複製程式碼

Redis 資料型別

Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。

String(字串)

string是redis最基本的型別,你可以理解成與Memcached一模一樣的型別,一個key對應一個value。

string型別是二進位制安全的。意思是redis的string可以包含任何資料。比如jpg圖片或者序列化的物件 。

string型別是Redis最基本的資料型別,一個鍵最大能儲存512MB。

[[email protected] redis-2.8.9]# redis-cli
127.0.0.1:6379> set name "redis.net.cn"
OK
127.0.0.1:6379> get name
"redis.net.cn"

在以上例項中我們使用了 Redis 的 SETGET 命令。鍵為 name,對應的值為redis.net.cn。

注意:一個鍵最大能儲存512MB。

Hash(雜湊)

Redis hash 是一個鍵值對集合。

Redis hash是一個string型別的field和value的對映表,hash特別適合用於儲存物件。

例項

複製程式碼
redis 127.0.0.1:6379> HMSET user:1 username redis.net.cn password redis.net.cn points 200
OK
redis 127.0.0.1:6379> HGETALL user:1
1) "username"
2) "redis.net.cn"
3) "password"
4) "redis.net.cn"
5) "points"
6) "200"
redis 127.0.0.1:6379>
複製程式碼

List(列表)

Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素導列表的頭部(左邊)或者尾部(右邊)。
複製程式碼
127.0.0.1:6379> lpush students liubing
(integer) 1
127.0.0.1:6379> lpush students zhangjie zsq
(integer) 3
127.0.0.1:6379> lpush students siqing
(integer) 4
127.0.0.1:6379> llen students
(integer) 4
127.0.0.1:6379> lrange students 0 3
1) "siqing"
2) "zsq"
3) "zhangjie"
4) "liubing"
複製程式碼

列表最多可儲存 232 - 1 元素 (4294967295, 每個列表可儲存40多億)。

Set(集合)

Redis的Set是string型別的無序集合。

集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)。

sadd 命令

新增一個string元素到,key對應的set集合中,成功返回1,如果元素以及在集合中返回0,key對應的set不存在返回錯誤。

複製程式碼
sadd key member
例項
redis 127.0.0.1:6379> sadd redis.net.cn redis
(integer) 1
redis 127.0.0.1:6379> sadd redis.net.cn mongodb
(integer) 1
redis 127.0.0.1:6379> sadd redis.net.cn rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd redis.net.cn rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers redis.net.cn
 
1) "rabitmq"
2) "mongodb"
3) "redis"
複製程式碼

注意:以上例項中 rabitmq 添加了兩次,但根據集合內元素的唯一性,第二次插入的元素將被忽略。

集合中最大的成員數為 232 - 1 (4294967295, 每個集合可儲存40多億個成員)。

zset(sorted set:有序集合)

Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。

不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重複。

zadd 命令

新增元素到集合,元素在集合中存在則更新對應score

zadd key score member 

例項

複製程式碼
redis 127.0.0.1:6379> zadd redis.net.cn 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd redis.net.cn 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE redis.net.cn 0 1000
 
1) "redis"
2) "mongodb"
3) "rabitmq"
複製程式碼

 ####################################################################################

redis多例項介紹

接上一篇redis、建立資料存放的目錄

vim redis.conf +187
dir /application/data/

重新啟動

mkdir /application/data/
redis-cli shutdown
redis-server /application/redis/conf/redis.conf &
複製程式碼
[[email protected] conf]# redis-cli
127.0.0.1:6379> auth zsq
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set names sisi
OK
127.0.0.1:6379> get sisi
(nil)
127.0.0.1:6379> save
[34960] 03 Dec 20:29:54.318 * DB saved on disk
OK
127.0.0.1:6379> quit
[[email protected] conf]# ll /application/data/
總用量 4
-rw-r--r-- 1 root root 32 12月  3 20:29 dump.rdb
複製程式碼

Redis AUTH命令是用來向伺服器驗證給定的密碼。 如果密碼與在配置檔案中的口令相匹配,則伺服器會返回OK狀態碼,並開始接受命令。否則,將返回一個錯誤,並且客戶需要嘗試新的密碼。

在配置檔案中指定的密碼

requirepass zsq

建立例項

複製程式碼
[[email protected] conf]# mkdir /data/6380/data -p
[[email protected] conf]# mkdir /data/6381/data -p
[[email protected] conf]# cp redis.conf /data/6380/
[[email protected] conf]# cp redis.conf /data/6381/
[[email protected] conf]# cd /data/6380
[[email protected] 6380]# ll
總用量 36
drwxr-xr-x 2 root root  4096 12月  3 20:35 data
-rw-r--r-- 1 root root 31236 12月  3 20:35 redis.conf
複製程式碼

跟原始檔對比,兩個例項修改以下對應的幾項

複製程式碼
[[email protected] 6380]# diff redis.conf /application/redis/conf/redis.conf 
41c41
< pidfile /data/6380/redis.pid
---
> pidfile /var/run/redis.pid
45c45
< port 6380
---
> port 6379
187c187
< dir /data/6380/data/
---
> dir /application/data/
449c449
< appendonly yes  #開啟這項是記錄持久化日誌
---
> appendonly no   
複製程式碼

開啟6380

[[email protected] 6380]# redis-server /data/6380/redis.conf &
[[email protected] 6380]# lsof -i :6380
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
redis-ser 35011 root    4u  IPv6 2604853      0t0  TCP *:6380 (LISTEN)
redis-ser 35011 root    5u  IPv4 2604855      0t0  TCP *:6380 (LISTEN)

測試

複製程式碼
[[email protected] 6380]# redis-cli -p 6380
127.0.0.1:6380> auth zsq
OK
127.0.0.1:6380> set name oldgirl
OK
127.0.0.1:6380> get name
"oldgirl"
127.0.0.1:6380> save
[35011] 03 Dec 20:51:25.324 * DB saved on disk
OK
127.0.0.1:6380> quit
[[email protected] 6380]# ll data/
總用量 8
-rw-r--r-- 1 root root 109 12月  3 20:51 appendonly.aof  
-rw-r--r-- 1 root root  34 12月  3 20:51 dump.rdb  #要save才有這個檔案
appendonly.aof 檔案記錄的操作記錄
[[email protected] 6380]# cat data/appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
Set
複製程式碼

開啟6381

redis-server /data/6381/redis.conf &
[[email protected] 6380]# lsof -i :6381
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
redis-ser 35034 root    4u  IPv6 2609259      0t0  TCP *:6381 (LISTEN)
redis-ser 35034 root    5u  IPv4 2609261      0t0  TCP *:6381 (LISTEN)

 redis複製

        複製

Redis複製很簡單易用,它通過配置允許slave Redis Servers或者Master Servers的複製品。接下來有幾個關於redis複製的非常重要特性:

一個Master可以有多個Slaves。

Slaves能接受其他slave的連結,除了可以接受同一個master下面slaves的連結以外,還可以接受同一個結構圖中的其他slaves的連結。

redis複製是在master段是非阻塞的,這就意味著master在同一個或多個slave端執行同步的時候還可以接受查詢。

複製在slave端也是非阻塞的,假設你在redis.conf中配置redis這個功能,當slave在執行的新的同步時,它仍可以用舊的資料資訊來提供查詢,否則,你可以配置當redis slaves去master失去聯絡是,slave會給客戶端傳送一個錯誤。

為了有多個slaves可以做只讀查詢,複製可以重複2次,甚至多次,具有可擴充套件性(例如:slaves對話與重複的排序操作,有多份資料冗餘就相對簡單了)。

通過複製可以避免master全量寫硬碟的消耗:只要配置 master 的配置檔案redis.conf來“避免儲存”(註釋掉所有”save”命令),然後連線一個用來持久化資料的slave即可。但是這樣要確保masters 不會自動重啟(更多內容請閱讀下段)

redis複製是怎麼進行工作

如果設定了一個slave,不管是在第一次連結還是重新連結master的時候,slave會發送一個同步命令 sync,然後master開始後臺儲存,收集所有對修改資料的命令。當後臺儲存完成,master會將這個資料檔案傳送到slave,然後儲存在磁碟,載入到記憶體中;master接著傳送收集到的所有的修改資料的命令,這好比一個流命令,是redis協議本身來實現的。

你可以自己通過遠端登入來進行嘗試,當伺服器在做一些工作併發送同步命令的時候連結到redis埠,你將會看到大量的資料傳輸,然後收到的每個命令會顯示在遠端登入的會話中。

當master和slave因一些故障當機時,slaves會自動的重鏈,如果master收到多個slave的同步請求,master會執行一個後臺儲存,以確保所有的slaves都是正常的。

當master和slave能夠維持連結,就會有一個完整的同步進行。

redis主從同步實戰

開啟兩個例項,指定埠,有密碼的指定密碼

cd /data/6380

配置檔案redis.conf搜尋REPLICATION關鍵字

slaveof 192.168.179.161 6379
masterauth zsq

重新啟動

redis-cli -p 6380 -a zsq shutdown

啟動的時候會有同步資訊輸出,如master的IP,埠等資訊

主庫也有資訊輸出

從庫對主庫也有個ping的操作過程,每隔10秒傳送一個PING,確認是否OK

monitor類似tcpdump,可以監控其操作

在主庫操作

從庫可以看到其輸出資訊

檢視從庫的資料同步情況

Slave的幾個引數

Slave是不能寫資料的

預設檢測是10秒

如果連不上的時候,主庫是通過backlog來實現slave庫的增量同步,以下引數是其大小

Backlog的生成期,當主庫和slave連線斷開的時候,backlog在記憶體裡多長時間釋放

優先順序,給不同的slave優先順序,主庫宕機把哪個slave提升為主

檢視redis的狀態資訊

同步狀態資訊

CPU狀態資訊

info是檢視全部的狀態 ,記憶體,客戶端連線等等

服務端master的資訊,主從,cpu等

 

 

Redis介紹

Redis 是完全開源免費的,遵守BSD協議,是一個高效能的key-value資料庫。

Redis 與其他 key - value 快取產品有以下三個特點:

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可以做很多內部複雜性很強的事情。 同時,在磁碟格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。

 

 Remote Dictionary Server(Redis)是一個基於 key-value 鍵值對的持久化資料庫儲存系統。redis 和 Memcached 快取服務很像,但它支援儲存的 value 型別相對更多,包括 string (字串)、list (連結串列)、set (集合)、zset (sorted set --有序集合)和 hash(雜湊型別)。這些資料型別都 支援 push/pop、add/remove 及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis 支援各種不同方式的排序。與 memcached 一樣,為了保證效率,資料都是快取在記憶體中。區別的是 redis 會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了 master-slave (主從)同步。

redis 的出現,再一定程度上彌補了 Memcached 這類 key-value 記憶體換乘服務的不足,在部分場合可以對關係資料庫起到很好的補充作用。redis 提供了 Python,Ruby,Erlang,PHP 客戶端,使用方便。官方文件: https://redis.io/documentation

Redis 在新浪微博中的應用

http://www.cnblogs.com/me115/p/3482783.html

 

Redis 安裝和使用例項

複製程式碼
環境:
[[email protected] /]# uname -r
2.6.32-504.el6.x86_64
[[email protected] /]# ifconfig eth0|awk -F '[ :]+' 'NR==2{print $4}'
192.168.179.161
[[email protected] /]# cat /etc/redhat-release 
CentOS release 6.6 (Final)
[[email protected] /]# /etc/init.d/iptables status
iptables:未執行防火牆。
[[email protected] /]# getenforce
Permissive
#3.0版本原始碼安裝也一樣
wget -q http://download.redis.io/releases/redis-2.8.9.tar.gz   
tar xf redis-2.8.9.tar.gz
cd redis-2.8.9
#less README
make MALLOC=jemalloc
make PREFIX=/application/redis-2.8.9 install
ln -s /application/redis-2.8.9/ /application/redis

tree /application/redis
/application/redis
`-- bin
    |-- redis-benchmark     # Redis效能測試工具,測試Redis在系統及你的配置下的讀寫效能。
    |-- redis-check-aof     # 更新日誌檢查。
    |-- redis-check-dump    # 用於本地資料庫檢查。
    |-- redis-cli           # Redis命令列操作工具。也可以telnet根據其純文字協議操作
    `-- redis-server        # Redis伺服器的daemon啟動程式。
1 directory, 5 files
配置環境變數
[[email protected] redis-2.8.9]# echo 'export PATH=/application/redis/bin/:$PATH' >>/etc/profile
[[email protected] redis-2.8.9]# 
[[email protected] redis-2.8.9]# tail -1 /etc/profile
export PATH=/application/redis/bin/:$PATH
[[email protected] redis-2.8.9]# . /etc/profile
[[email protected] redis-2.8.9]# which redis-server
/application/redis/bin/redis-server
拷貝生成配置檔案
[[email protected] redis-2.8.9]#  mkdir /application/redis/conf
[[email protected] redis-2.8.9]# pwd
 [[email protected] redis-2.8.9]# cp redis.conf /application/redis/conf/
啟動redis
redis-server /application/redis/conf/redis.conf &
[20222] 29 Nov 20:43:48.571 # 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.
[20222] 29 Nov 20:43:48.571 * The server is now ready to accept connections on port 6379
檢查埠
lsof -i :6379
COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
redis-ser 20222 root    4u  IPv6 1523437      0t0  TCP *:6379 (LISTEN)
redis-ser 20222 root    5u  IPv4 1523439      0t0  TCP *:6379 (LISTEN)

去掉上面的警告資訊
sysctl vm.overcommit_memory=1
echo 'vm.overcommit_memory=1' >>/etc/sysctl.conf
sysctl -p
關閉redis操作的命令
redis-cli shutdown save
複製程式碼

 

常見操作

複製程式碼
[[email protected] redis-2.8.9]# redis-cli
127.0.0.1:6379> set id 001  #插入資料:設定一個key-value對
OK
127.0.0.1:6379> get id   #查詢資料:取出key所對應的value
"001"
127.0.0.1:6379> del id #刪除鍵值
(integer) 1
127.0.0.1:6379> get id  #查詢資料
(nil)
127.0.0.1:6379> exists id   #驗證是否存在,1代表存在,0代表不存在
(integer) 0

127.0.0.1:6379> set user001 oldboy
OK
127.0.0.1:6379> set user002 zsq
OK
127.0.0.1:6379> set user003 test
OK
127.0.0.1:6379> get user001
"oldboy"
127.0.0.1:6379> keys *   #取出所有
1) "user003"
2) "user002"
3) "user001"

select可以切換庫從0到15  ,在第一個庫建立的內容其它庫是不可見的
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> set name oldboy
OK
127.0.0.1:6379[1]> get name
"oldboy"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "user003"
2) "user002"
3) "user001"
127.0.0.1:6379> select 16
(error) ERR invalid DB index
127.0.0.1:6379[16]> select 15
OK
複製程式碼

其它連線方式

複製程式碼

相關推薦

學習Redis

  Redis介紹 Redis 是完全開源免費的,遵守BSD協議,是一個高效能的key-value資料庫。 Redis 與其他 key - value 快取產品有以下三個特點: Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。

nginx 學習筆記nginx_lua 如何連線redis

安裝redis 下載 wget http://download.redis.io/releases/ redis-5.0-rc4.tar.gz  解壓安裝配置 make, sudo make install 執行redis 配置檔案:redis.conf可以編輯相關

Redis學習筆記jedis(JedisCluster)操作Redis叢集 redis-cluster

redis系列文章目錄 版本說明 jedis2.9.0 redis3.2.5 參考資料:redis命令參考。 不過這個稍微有一點點老 java(JedisCluster)操作redis叢集 這裡只是幾個簡單的demo,直接

Redis學習筆記--分散式資料庫CAP原理

傳統資料庫的ACID Atomicity 原子性 事務裡面的所有操作要麼全部做完,要麼都不做,事務成功的條件是事務裡的所有操作都成功,只要有一個操作失敗,整個事務就失敗,需要回滾。 Consistency 一致性 資料庫要一直處於一致的狀態

從零開始學習html與瀏覽者交互,表單標簽——下

定位 開始 系統 isp ctr 程序 顯示 text 輸入 六、使用下拉列表框進行多選 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-T

數據結構學習筆記 樹的創建和遍歷

一個 後序遍歷 for -1 堆棧 nor ext cnblogs 復制 創建(先序創建和根據先序和中序進行創建)和遍歷(先序遍歷、中序遍歷、後序遍歷、非遞歸堆棧遍歷、層次遍歷):    package tree; public class XianCreateTree

最優化學習筆記牛頓法及擬牛頓法

div size -a article fonts alt water src jsb 最優化學習筆記(五)牛頓法及擬牛頓法

javascript學習筆記:異常捕獲和事件處理

log 類型 按鈕 輸入 button lan yellow logs 代碼 異常捕獲 Try{   發生異常的代碼塊 }catch(err){   異常信息處理 } 1 <!DOCTYPE html> 2 <html> 3 <head

redis--集群搭建

nbsp image 搭建 alt 關閉 重新 技術 edi cnblogs 這裏沒有六臺虛擬機,在一臺上模擬 cluster nodes 查看當前是否是集群 集群環境關閉只能一臺臺關閉,重新創建集群環境首先把nodes-700*.com刪掉去創建r

從零開始學習MXnetMXnet的黑科技之顯存節省大法

無法 返回 deep logs all 筆記 linear call data   寫完發現名字有點拗口。。- -#   大家在做deep learning的時候,應該都遇到過顯存不夠用,然後不得不去痛苦的減去batchszie,或者砍自己的網絡結構呢? 最後跑出來的效果不

設計模式學習總結創建者模式(Builder)

lose etl bfc .get splay hid 定義 string ogr   創建者模式,主要針對某些產品有類似的生產步驟,且有需要有先後順序的進行各個部件的生成。   一、示例展示:   通過學習及總結,以下是我完成的創建者模式的示例:   1.創建產品類:La

BigData 學習記錄

merge 而且 seq 運行時間 big 存儲位置 完成 setup 其中 MR(MapReduce)運行過程 client程序--》提交job至JobTracker--》分配job ID--》JobTracker檢查輸入文件存在,輸出文件不存在--》進行輸入分片--

Spring 學習筆記—— Bean之間的關系、作用域、自動裝配

mar byname pps etc 有時 sysman 對象實例 構造 encoding 繼承   Spring提供了配置信息的繼承機制,可以通過為<bean>元素指定parent值重用已有的<bean>元素的配置信息。 <?xml

Go語言學習筆記文件操作

see 大小 unix rdo 筆記 不能 hid code lag 加 Golang學習 QQ群共同學習進步成家立業工作 ^-^ 群號:96933959 文件讀取 os.File 封裝了文件相關操作 type File File代表一個打開的文件對象。

Unity3D之Mecanim動畫系統學習筆記:Animator Controller

浮點 key 發現 菜單 融合 stat mon 好的 project 簡介 Animator Controller在Unity中是作為一種單獨的配置文件存在的文件類型,其後綴為controller,Animator Controller包含了以下幾種功能: 可以對

Python學習筆記OOP

默認 tro acl 引入 支持 不同 post set 成像 模塊 使用模塊import 模塊名。有的僅僅導入了某個模塊的一個類或者函數,使用from 模塊名 import 函數或類名實現。為了避免模塊名沖突。Python引入了按文件夾來組織模塊的方

如鵬網學習筆記MySql基礎

修改列 記錄 tex 令行 金額 升序 查詢 自動遞增 col MySQL基礎 一、數據庫概念  1,網友裝備信息、論壇帖子信息、QQ好友關系信息、學籍管理系統中的學生信息等都要“持久化”的保存到一個地方,    如果通過IO寫到文件中,那麽會非常麻煩,而且不利於多人共享數

docker學習筆記——Docker常用命令總結

docker學習筆記 docker常用命令總結 1. 開啟/停止/重啟container(start/stop/restart)容器可以通過run新建一個來運行,也可以重新start已經停止的container,但start不能夠再指定容器啟動時運行的指令,因為docker只能有一個前臺進程。容器st

jQuery學習筆記

加載 complete += ron 序列 border () ajaxstart 單選 jQuery與Ajax的應用 Ajax的優勢和不足 Ajax的優勢 a)不需要插件支持 b)優秀的用戶體驗 c)提高Web程序的性能 d)減輕服務器和寬帶的負擔 Ajax的不

流暢的python和cookbook學習筆記

pytho col () 學習 util 學習筆記 取出 minute python 1.隨機選擇   python中生成隨機數使用random模塊。   1.從序列中隨機挑選元素,使用random.choice() >>> import random