Redis學習筆記

詳細參考:http://www.yiibai.com/redis/

1.Redis概述

Redis是一個開源(BSD許可),內存存儲的數據結構服務器,可用作數據庫,高速緩存和消息隊列代理。它支持字符串、哈希表、列表、集合、有序集合,位圖,hyperloglogs等數據類型。內置複製、Lua腳本、LRU收回、事務以及不同級別磁盤持久化功能,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供自動分區。

 

2.Redis優點

 性能很高 : Redis是非常快的,每秒可以執行大約110000設置操作,81000個/每秒的讀取操作。

 支持豐富的數據類型 : Redis支持最大多數開發人員已經知道如列表,集合,可排序集合,哈希等數據類型。這使得在應用中很容易解決的各種問題,因爲我們知道哪些問題處理使用哪種數據類型更好解決。

 操作都是原子的 : 所有 Redis 的操作都是原子,從而確保當兩個客戶同時訪問 Redis 服務器得到的是更新後的值(最新值)。

 豐富的特性:支持publish/subscribe,通知,key過期等特性

 redis支持主從複製

 支持持久化數據存儲

 

3.redis的數據類型

Redis支持5種數據類型,它們描述如下:

 

1)Strings - 字符串

Redis的字符串是字節序列。在Redis中字符串是二進制安全的,這意味着他們有一個已知的長度,是沒有任何特殊字符終止決定的,所以可以存儲任何東西,最大長度可達512兆。

例子

redis 127.0.0.1:6379> SET name "yiibai"
OK
redis 127.0.0.1:6379> GET name
"yiibai"


在上面的例子使用Redis命令set和get,Redis的名稱是yiibai的鍵存儲在Redis的字符串值。

注:字符串值可以存儲最大512兆字節的長度。

 

2)Hashes - 哈希值

Redis的哈希鍵值對的集合。 Redis的哈希值是字符串字段和字符串值之間的映射,所以它們被用來表示對象

例子

redis 127.0.0.1:6379> HMSET user:1 username yiibai password yiibai points 200
OK
redis 127.0.0.1:6379> HGETALL user:1
 
1) "username"
2) "yiibai"
3) "password"
4) "yiibai"
5) "points"
6) "200"


在上面的例子中的哈希數據類型,用於存儲包含用戶的基本信息用戶的對象。這裏HMSET,HEXTALL對於Redis 命令 user:1 是鍵。

每個哈希可存儲多達232 - 1個 字段 - 值對(超過4十億)。

 

3)Lists - 列表

Redis的列表是簡單的字符串列表,排序插入順序。可以添加元素到Redis列表的頭部或尾部。

例子

redis 127.0.0.1:6379> lpush tutoriallist redis
(integer) 1
redis 127.0.0.1:6379> lpush tutoriallist mongodb
(integer) 2
redis 127.0.0.1:6379> lpush tutoriallist rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange tutoriallist 0 10
 
1) "rabitmq"
2) "mongodb"
3) "redis"


列表的最大長度爲232- 1元素(4294967295,每個列表中的元素超過4十億)。

 

4)Sets - 集合

Redis集合是字符串的無序集合。在Redis中可以添加,刪除和測試文件是否存在在O(1)的時間複雜度的成員。

例子

redis 127.0.0.1:6379> sadd tutoriallist redis
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist mongodb
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers tutoriallist
 
1) "rabitmq"
2) "mongodb"
3) "redis"


注意:在上面的例子中rabitmq設置屬性加兩次,但由於唯一性只加一次。

成員中集最大數量爲232 - 1(4294967295,集合成員超過4十億)。

 

5)集合排序

Redis的集合排序類似於Redis集合,字符串不重複的集合。不同的是,一個有序集合的每個成員關聯分數,用於以便採取有序set命令,從最小的到最大的分數有關。雖然成員都是獨一無二的,分數可能會重複。

例子

redis 127.0.0.1:6379> zadd tutoriallist 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000
 
1) "redis"
2) "mongodb"
3) "rabitmq"


 

 

4.Redis的應用場景

1)Redis適用場景全部數據在memory

2)替代Memcached使用

3)除了key/value之外更多的數據類型支持

4)支持持久化

5)需要負載均衡的場景(redis主從同步)

5.Redis的安裝和使用

1)安裝步驟

  wget http://download.redis.io/releases/redis-3.2.4.tar.gz
  tar xf redis-3.2.4.tar.gz 
  cd redis-3.2.4
  make MALLOC=jemalloc
  make PREFIX=/application/redis-3.2.4 install
  ln -s /application/redis-3.2.4/ /application/redis
 
 [root@server_3 redis-3.2.4]# tree /application/redis/bin/
/application/redis/bin/
├── redis-benchmark
├── redis-check-aof
├── redis-check-rdb
├── redis-cli
├── redis-sentinel -> redis-server
└── redis-server
 
0 directories, 6 files
[root@server_3 redis-3.2.4]#



2)配置啓動redis

添加redis的環境變量  

echo “PATH=/application/redis/bin/:$PATH”  >>/etc/profile
source /etc/profile


從解壓目錄移動redis.conf到redis安裝目錄下

mkdir /application/redis/conf
cd /tools/redis-3.2.4/
cp redis.conf /application/redis/conf/
ls /application/redis/conf
[root@server_3 redis-3.2.4]# ls /application/redis/conf
redis.conf


3)啓動redis

redis-server /application/redis/conf/redis.conf &

警告1:

4095:M 28 Sep 13:13:36.835 # 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.

解決:

[root@server_3 redis-3.2.4]# sysctl vm.overcommit_memory=1
[root@server_3 redis-3.2.4]# echo "vm.overcommit_memory = 1"  >> /etc/sysctl.conf 
[root@server_3 redis-3.2.4]# tail -1 /etc/sysctl.conf
vm.overcommit_memory = 1
[root@server_3 redis-3.2.4]#


警告2:

4103:M 28 Sep 13:16:41.123 # 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.

解決:

[root@server_3 redis-3.2.4]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@server_3 redis-3.2.4]# echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local 
[root@server_3 redis-3.2.4]# tail -1 /etc/rc.local 
tail: inotify cannot be used, reverting to polling
echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@server_3 redis-3.2.4]#


 

4)關閉Redis

redis-cli shutdown

[root@server_3 redis-3.2.4]# redis-cli shutdown
4121:M 28 Sep 13:27:34.602 # User requested shutdown...
4121:M 28 Sep 13:27:34.602 * Saving the final RDB snapshot before exiting.
4121:M 28 Sep 13:27:34.603 * DB saved on disk
4121:M 28 Sep 13:27:34.603 * Removing the pid file.
4121:M 28 Sep 13:27:34.604 # Redis is now ready to exit, bye bye...
[1]+  Done                    redis-server /application/redis/conf/redis.conf
[root@server_3 redis-3.2.4]#


 

5)連接Redis

1)本地連接

[root@server_3 redis-3.2.4]# redis-cli 
127.0.0.1:6379> set 001 ok
OK
127.0.0.1:6379> get 001
"ok"
127.0.0.1:6379>

 

2)遠程連接

Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
  -h <hostname>      Server hostname (default: 127.0.0.1).
  -p <port>          Server port (default: 6379).
  -s <socket>        Server socket (overrides hostname and port).
  -a <password>      Password to use when connecting to the server.
  -r <repeat>        Execute specified command N times.
  -i <interval>      When -r is used, waits <interval> seconds per command.

交互式操作:

[root@server_3 redis-3.2.4]# redis-cli -h 192.168.1.113 -p 6379
192.168.1.113:6379> set 002 testok
OK
192.168.1.113:6379> get 002
"testok"
192.168.1.113:6379>

非交互式操作:

[root@server_3 bin]# redis-cli -h 192.168.1.113 -p 6379 set 001 dong
OK
[root@server_3 bin]# redis-cli -h 192.168.1.113 -p 6379 set 002 xi
OK
[root@server_3 bin]# redis-cli -h 192.168.1.113 -p 6379 get 001 
"dong"
[root@server_3 bin]# redis-cli -h 192.168.1.113 -p 6379 get 002
"xi"
[root@server_3 bin]#

 

6.php安裝redis擴展模塊

wget https://codeload.github.com/phpredis/phpredis/zip/
unzip master
cd phpredis-master/
phpize 
./configure --with-php-config=/usr/bin/php-config
make && make install
vim /etc/php.ini   配置文件修改以下兩項
     extension_dir = "/usr/lib64/php/modules/"
     extension = redis.so
重啓php服務
pkill  php-fpm
php-fpm -c /etc/php.ini -D

phpinfo測試

wKioL1f4tMrR3MyvAAANnA2tx38295.png-wh_50

7.redis配置主從同步

  1)概述

從結構上,單個Redis服務器會發生單點故障,並且一臺服務器需要處理所有的請求負載,壓力較大;

從容量上,單個Redis服務器內存容量有限,一般情況下,單臺Redis最大使用內存不應該超過20G。

  2)主從同步配置

redis主從同步只需要修改從庫的配置文件,指定主庫的地址和端口即可

示例:192.168.1.112爲redis從庫,192.168.1.113爲主庫

注意:默認從庫是隻讀的,且主從庫的數據都是一樣

[root@server_02 redis-3.2.4]# grep slaveof /application/redis/conf/redis.conf 
# slaveof <masterip> <masterport>
slaveof 192.168.1.113 6379              --只需修改此部分
[root@server_02 redis-3.2.4]#

測試:

主庫寫操作1

[root@server_3 bin]# redis-cli -h 192.168.1.113 -p 6379
192.168.1.113:6379> set 001 dong
OK
192.168.1.113:6379> get 001
"dong"
192.168.1.113:6379>

主庫刪除操作2

192.168.1.113:6379> del 001
(integer) 1
192.168.1.113:6379> get 001
(nil)
192.168.1.113:6379>


從庫讀操作1

[root@server_02 redis-3.2.4]# redis-cli 
127.0.0.1:6379> get 001
"dong"
127.0.0.1:6379>

從庫讀操作2

127.0.0.1:6379> get 001
(nil)
127.0.0.1:6379>

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章