您好,登錄后才能下訂單哦!
Redis簡介
Redis(REmote DIctionary Server)是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。它通常被稱為數據結構服務器,因為值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
Redis特點:
1,支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
2,不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲
3,支持數據的備份,即master-slave模式的數據備份
Redis優勢:
1,讀寫性能高。讀的速度是110000次/s,寫的速度是81000次/s 。
2,豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
3,原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執行。
4,豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
(一)Redis安裝
環境:
操作系統:CentOS Linux release 7.2
具體步驟如下:
1,下載安裝包,地址如下:https://redis.io/download
[root@localhost install]#wget http://download.redis.io/releases/redis-3.2.9.tar.gz [root@localhost install]#tar zxvf redis-3.2.9.tar.gz [root@localhost install]#mv redis-3.2.9 /usr/local/ [root@localhost install]#cd /usr/local/redis-3.2.9/ [root@localhost redis-3.2.9]# make MALLOC=libc
2,啟動redis服務。默認加載的是/usr/local/redis-3.2.9/redis.conf 配置文件。
[root@localhost redis-3.2.9]# cd src/ [root@localhost src]# ./redis-server 13796:C 07 Jun 04:40:46.590 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.2.9 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 13796 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 13796:M 07 Jun 04:40:46.591 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 13796:M 07 Jun 04:40:46.591 # Server started, Redis version 3.2.9 13796:M 07 Jun 04:40:46.591 # 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. 13796:M 07 Jun 04:40:46.591 # 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. 13796:M 07 Jun 04:40:46.591 * DB loaded from disk: 0.000 seconds 13796:M 07 Jun 04:40:46.591 * The server is now ready to accept connections on port 6379
3,使用客戶端redis-cli進行連接測試。
[appuser@localhost src]$ cd .. [appuser@localhost redis-3.2.9]$ cd src/ [appuser@localhost src]$ ./redis-cli 127.0.0.1:6379> set lqb bar OK 127.0.0.1:6379> get lqb "bar" 127.0.0.1:6379> ping PONG
(二)Redis配置。redis配置既可以通過config命令查看或設置配置項,也可以通過redis.conf配置。
1,通過config命令格式配置(config get config_setting_name):
127.0.0.1:6379> config get loglevel 1) "loglevel" 2) "notice 127.0.0.1:6379> config get * ####使用*獲取所有配置項 1) "dbfilename" 2) "dump.rdb" 3) "requirepass" 4) "" 5) "masterauth" 6) "" 7) "unixsocket" 8) "" 9) "logfile" 10) "" 11) "pidfile" 12) "" 13) "slave-announce-ip" 14) "" 15) "maxmemory" 16) "0" 17) "maxmemory-samples" 18) "5" 19) "timeout" 20) "0" 21) "auto-aof-rewrite-percentage" 22) "100" 23) "auto-aof-rewrite-min-size" 24) "67108864" 25) "hash-max-ziplist-entries" 26) "512" 27) "hash-max-ziplist-value" 28) "64" 29) "list-max-ziplist-size" 30) "-2" 31) "list-compress-depth" 32) "0" 33) "set-max-intset-entries" 34) "512" 35) "zset-max-ziplist-entries" 36) "128" 37) "zset-max-ziplist-value" 38) "64" 39) "hll-sparse-max-bytes" 40) "3000" 41) "lua-time-limit" 42) "5000" 43) "slowlog-log-slower-than" 44) "10000" 45) "latency-monitor-threshold" 46) "0" 47) "slowlog-max-len" 48) "128" 49) "port" 50) "6379" 51) "tcp-backlog" 52) "511" 53) "databases" 54) "16" 55) "repl-ping-slave-period" 56) "10" 57) "repl-timeout" 58) "60" 59) "repl-backlog-size" 60) "1048576" 61) "repl-backlog-ttl" 62) "3600" 63) "maxclients" 64) "10000" 65) "watchdog-period" 66) "0" 67) "slave-priority" 68) "100" 69) "slave-announce-port" 70) "0" 71) "min-slaves-to-write" 72) "0" 73) "min-slaves-max-lag" 74) "10" 75) "hz" 76) "10" 77) "cluster-node-timeout" 78) "15000" 79) "cluster-migration-barrier" 80) "1" 81) "cluster-slave-validity-factor" 82) "10" 83) "repl-diskless-sync-delay" 84) "5" 85) "tcp-keepalive" 86) "300" 87) "cluster-require-full-coverage" 88) "yes" 89) "no-appendfsync-on-rewrite" 90) "no" 91) "slave-serve-stale-data" 92) "yes" 93) "slave-read-only" 94) "yes" 95) "stop-writes-on-bgsave-error" 96) "yes" 97) "daemonize" 98) "no" 99) "rdbcompression" 100) "yes" 101) "rdbchecksum" 102) "yes" 103) "activerehashing" 104) "yes" 105) "protected-mode" 106) "yes" 107) "repl-disable-tcp-nodelay" 108) "no" 109) "repl-diskless-sync" 110) "no" 111) "aof-rewrite-incremental-fsync" 112) "yes" 113) "aof-load-truncated" 114) "yes" 115) "maxmemory-policy" 116) "noeviction" 117) "loglevel" 118) "notice" 119) "supervised" 120) "no" 121) "appendfsync" 122) "everysec" 123) "syslog-facility" 124) "local0" 125) "appendonly" 126) "no" 127) "dir" 128) "/usr/local/redis-3.2.9/src" 129) "save" 130) "3600 1 300 100 60 10000" 131) "client-output-buffer-limit" 132) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60" 133) "unixsocketperm" 134) "0" 135) "slaveof" 136) "" 137) "notify-keyspace-events" 138) "" 139) "bind" 140) "" 編輯配置項 語法:config set config_setting_name new_config_value 127.0.0.1:6379> config set loglevel "notice" OK 127.0.0.1:6379> config get loglevel 1) "loglevel" 2) "notice"
2,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:有序集合)。
(1)string字符串:
string中的字符串是一個字節序列,是最基本的類型,你可以理解成與Memcached一模一樣的類型,一個key對應一個value。
string中的字符串是二進制安全的,這意味著它們的長度不由任何特殊的終止字符決定。
redis的string可以包含任何數據。比如jpg圖片或者序列化的對象 。
string類型是Redis最基本的數據類型,字符串的最大長度能存儲512MB。
127.0.0.1:6379> set name "lqb" OK 127.0.0.1:6379> get name "lqb"
在以上實例中我們使用了 Redis 的 SET 和 GET 命令。鍵為 name,對應的值為 lqb。一個鍵最大能存儲512MB
(2)Hash(哈希)
Redis hash 是一個鍵值對集合。
Redis hash是是字符串字段和字符串值之間的映射,hash特別適合用于表示對象。
127.0.0.1:6379> hmset user username lqb password passwd123 OK 127.0.0.1:6379> hgetall user 1) "username" 2) "lqb" 3) "password" 4) "passwd123"
實例中我們使用了 Redis HMSET, HGETALL 命令,user是鍵的名稱
每個 hash 可以存儲 232 -1 鍵值對(40多億)
(3)list(列表)。Redis 列表是字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
127.0.0.1:6379> lpush runoob redis (integer) 1 127.0.0.1:6379> lpush runoob mongodb (integer) 2 127.0.0.1:6379> lpush runoob mysql (integer) 3 127.0.0.1:6379> lrange runoob 0 10 1) "mysql" 2) "mongodb" 3) "redis" 127.0.0.1:6379> lrange runoob 0 2 1) "mysql" 2) "mongodb" 3) "redis" 127.0.0.1:6379> lrange runoob 0 1 1) "mysql" 2) "mongodb"
列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)。
(4)set(集合)。
Redis的Set是字符串(string)類型的無序集合。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。
sadd 命令
添加一個string元素到,key對應的set集合中,成功返回1,如果元素已經在集合中返回0,key對應的set不存在返回錯誤。
語法:sadd key member.
redis 127.0.0.1:6379> sadd runoob redis (integer) 1 redis 127.0.0.1:6379> sadd runoob mongodb (integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq (integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq (integer) 0 redis 127.0.0.1:6379> smembers runoob 1) "rabitmq" 2) "mongodb" 3) "redis"
根據集合內元素的唯一性,第二次插入的元素將被忽略。
集合中最大的成員數為 232 - 1(4294967295, 每個集合可存儲40多億個成員)。
(5)zset(sorted set:有序集合),是不重復的字符集合。Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重復。
zadd 命令格式:zadd key score member
添加元素到集合,元素在集合中存在則更新對應score
redis 127.0.0.1:6379> zadd runoob 0 redis (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000 1) "redis" 2) "mongodb" 3) "rabitmq"
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。