Redis是一個開源(BSD許可),內存存儲的數據結構服務器,可用做數據庫,高速緩存和消息隊列代理。 它支持字符串、哈希表、列表、集合、有序集合,位圖,hyperloglogs等數據類型。 內置複製、Lua腳本、LRU收回、事務以及不一樣級別磁盤持久化功能,同時經過Redis Sentinel提供高可用,經過Redis Cluster提供自動分區。 簡言之,Redis是一種面向「鍵/值」對數據類型的內存數據庫,能夠知足咱們對海量數據的快速讀寫需求。 Redis是一款NoSQL產品。 官網:http://www.redis.io 或者:http://redis.cn/
Redis支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。 Redis不只僅支持簡單的k-v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。 Redis支持數據的備份,即master-slave主從模式的數據備份。
性能極高——Redis讀的速度爲11w/s,寫的速度爲8.1w/s。 豐富的數據類型——Redis支持二進制案例的Strings,Lists,Hashes,Sets即Ordered Sets數據類型操做。 原子性——Redis的全部操做都是原子性的,同時Redis還支持對幾個操做合併後的原子性執行。 豐富的特性——Redis還支持public/subscribe,通知,key過時等特性。
應用在高併發和實時請求的場景,eg新浪微博 hash:關注列表,粉絲列表 string:微博數,粉絲數 (避免使用select count(*) from...) sorted set: TopN,熱門微博 還有github, stackoverflow也 用到了redis
windows下直接解壓便可使用,主要說明Linux下的安裝方式 :git
解壓: tar -zxvf soft/redis-3.2.0.tar.gz -C app/ 重命名: mv app/redis-3.2.0/ app/redis 編譯: make 安裝: make install PREFIX=/home/uplooking/app/redis
初始配置 修個redis.conf中的配置項 bind uplooking01 daemonize yes(後臺運行) logfile /opt/redis-3.2.0/logs/redis.log(日誌文件,目錄必須存在) 啓動服務 make完成以後,在redis-3.2.0/src目錄下會出現編譯後的redis服務器程序redis-server,還有用於測試的客戶端程序redis-cli。 redis-3.2.0]$ src/redis-server redis.conf 固然,若是再執行了make install則會在指定安裝目錄下生成一個bin目錄,同時也會有相關的命令用於操做Redis. 啓動客戶端 redis-3.2.0]$ src/redis-cli -h localhost -p 6379 關閉服務 ps -ef | grep redis 找到進程id後直接kill -9就能夠了。
Redis的配置文件位於Redis的安裝目錄之下,文件名爲redis.conf。能夠經過config命令來查看或設置配置項。github
查看 語法,Redis config命令格式以下: redis localost:6379> config get config_set_name eg: redis localost:6379> config get loglevel 1) "loglevel" 2) "notice" 使用*號獲取全部配置項:redis localost:6379> config get * 編輯 能夠經過修改redis.conf文件或使用config set命令來修改配置 基本語法: redis localost:6379> config set conf_setting_name new_value eg: redis localost:6379> config set loglevel "warning" redis localost:6379> config get loglevel 1) "loglevel" 2) "warning" -->對當前服務有效,以後當服務重啓以後,纔會失效
string是redis最基本的類型,你能夠理解成與memcached如出一轍的類型,一個key對應一個value。 string類型是二進制安全的。意思是redis的string能夠包含任何數據。好比jpg圖片或者序列化的對象 。 string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。 實例 redis 127.0.0.1:6379> SET name "redis.net.cn" OK redis 127.0.0.1:6379> GET name "redis.net.cn" 在以上實例中咱們使用了Redis的SET和GET命令。鍵爲name,對應的值爲redis.net.cn。 注意:一個鍵最大能存儲512MB。
常見的string操做命令以下:web
set key value 設置指定key的值(會覆蓋無視數據類型) set name yaohuiying get key 獲取指定key的值 get name getrange key start end 返回key中字符串值的子字符 getrange name 1 4 注意:字符串索引從0開始,獲取索引片斷[start, end],包頭包尾 getset key value 將給定key的值設爲value,並返回key的舊值(old value) getset name liuxiangqian 返回值爲yaohuiying mget key1 [key2..] 獲取全部(一個或多個)給定key的值 mget name name1 setex key seconds value 將值value關聯到key,並將key的過時時間設爲seconds(以秒爲單位) setnx key value 只有在key不存在時設置key的值 做用同set,惟一和set的區別在於,只有當key不存在的時候,才進行設置, 而key存在,沒法完成覆蓋 setrange key offset value 用value參數覆寫給定key所儲存的字符串值,從偏移量offset開始 對key的原先的value進行局部覆蓋,從offset偏移量開始, value有多長,就覆蓋多長 strlen key 返回key所儲存的字符串值的長度 mset key value [key value ...] 同時設置一個或多個key-value對 MSETNX key value [key value ...] 同時設置一個或多個key-value對,當且僅當全部給定key都不存在 psetex key milliseconds value 這個命令和SETEX命令類似,但它以毫秒爲單位設置key的生存時間, 而不是像SETEX命令那樣,以秒爲單位 incr key 將key中對應儲存的數字值增一 對key對應的value進行+1,可是value必須是數字類型的字符串 INCRBY key increment 將key所儲存的值加上給定的增量值(increment) 之定義的步長 incrbyfloat key increment 將key所儲存的值加上給定的浮點增量值(increment) decr key 將key中儲存的數字值減一 decrby key decrement key 所儲存的值減去給定的減量值(decrement) append key value 若是key已經存在而且是一個字符串, APPEND命令將value追加到key原來的值的末尾
Redis hash 是一個鍵值對集合。Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。 實例 redis 127.0.0.1:6379> HMSET w3ckey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK redis 127.0.0.1:6379> HGETALL w3ckey 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000" 以上實例中 hash 數據類型存儲了一些描述信息(name,description, likes, visitors)到hash的w3ckey中。 使用hgetall 獲取全部的內容。 每一個hash能夠存儲232-1鍵值對(40多億)。
經常使用命令操做以下:redis
hexists key field 查看hash表key中,指定字段是否存在 0表示沒有,1表示有 hget key field 獲取hash表中指定字段的值 hgetall key 獲取全部的字段和值 hincrby key field increment 爲指定字段的整數值加上增量increment hincrbyfloat key field increment 爲指定字段的浮點值加上增量increment hkeys key 獲取全部的字段 hlen key 獲取key的字段的數量 hdel key field2 [field2] 刪除一個或多個哈是表字段 hmget key field1 [field2] 獲取全部給定字段的值 hmset key f1 v1 [f2 v2] 同時將多個file-value設置到key中 hset key field value 將哈希表key的field設置爲value hsetnx key field value 當在field不存在時,設置相關字段的值 hvals key 獲取全部的值 hscan key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對
Redis列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)。 實例 redis 127.0.0.1:6379> lpush redis.net.cn redis (integer) 1 redis 127.0.0.1:6379> lpush redis.net.cn mongodb (integer) 2 redis 127.0.0.1:6379> lpush redis.net.cn rabitmq (integer) 3 redis 127.0.0.1:6379> lrange redis.net.cn 0 10 1) "rabitmq" 2) "mongodb" 3) "redis" redis 127.0.0.1:6379> 列表最多可存儲 232-1元素 (4294967295, 每一個列表可存儲40多億)。
經常使用操做命令以下:spring
注意:關於list的操做,能夠分爲從左邊操做,也能夠從右邊進行操做 l--->left(頭部),r---->right(尾部) blpop key1 [key2 ] timeout 移除並獲取列表中的第一個元素,若是沒有會阻塞列表直到超時【單位是秒s】 或發現可彈出元素爲止 簡言之就是刪除key1 key2.。。中的元素,若是沒有元素則阻塞,結束條件爲 要麼時間超過了timeout;要麼發現有新的元素進來 brpop key1 [key2 ] timeout 移除並獲取列表中的最後一個元素,若是沒有會阻塞列表直到超時或發現可彈出 元素爲止 同blpop,不一樣在於刪除元素的方向不一致 brpoplpush source destination timeout 從列表中彈出一個值,將彈出的元素插入到另一個列表中並返回 它,若是沒有元素會阻塞列表知道等待超時或發現可彈出元素爲止 uplooking01:6379> brpoplpush season season1 100 "spring" (7.59s) lindex key index 經過索引獲取列表中的元素 注意一個: lindex key -1獲取的是最後一個元素 linsert key before|after pivot value 在列表的元素前或後插入元素 uplooking01:6379> lrange season 0 -1 1) "winter" 2) "autumn" 3) "summer" uplooking01:6379> linsert season after summer spring (integer) 4 uplooking01:6379> lrange season 0 -1 1) "winter" 2) "autumn" 3) "summer" 4) "spring" llen key 獲取列表長度,列表大小 lpop key 移出並獲取列表的第一個元素 lpush key value1 [value2] 將一個或多個值插入到列表頭部 lpushx key value 將一個或多個值插入到已存在的列表頭部 lrange key start stop 獲取列表指定返回內的元素 [start, stop] 若是要出去lrange中的全部的元素的話 lrange key 0 -1 lrem key count value 移出列表元素 count > 0: 從頭往尾移除值爲 value 的元素,1時,表示移除1個元素 count < 0: 從尾往頭移除值爲 value 的元素,-2時,表示移除2個元素 count = 0: 移除全部值爲 value 的元素。 lset key index value 經過索引設置列表元素的值(list.set(i, value)) 須要你們注意的是一個特殊的索引-1,表示最後一個元素 ltrim key start stop 對一個列表進行修剪(trim),也就是說,讓列表只保留指定區間內的元素, 刪除其它元素 [start, stop] uplooking01:6379> lrange season 0 -1 1) "winter" 2) "autumn" 3) "summer" 4) "spring" uplooking01:6379> ltrim season 1 2 OK uplooking01:6379> lrange season 0 -1 1) "autumn" 2) "summer" rpop key 移出並獲取列表最後一個元素 rpoplpush source destination 移出列表的最後一個元素,並將該元素添加到另外一列表並返回 rpush key value1 [value2] 在列表中添加一個或多個值 rpushx key value 爲已存在的列表添加值
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多億個成員)。
經常使用操做命令以下:mongodb
sadd key member1 [member2] 向集合添加一個或多個成員 scard key 獲取集合的成員數(size) sdiff key1 [key2] 返回給定全部集合的差集 集合A={1, 2, 3, 4, 5} 集合B={2, 3, 6, 8} A∩B = {2, 3} A∪B = {1, 2, 3, 4, 5, 6, 8} A-B(差集) = {1, 4, 5, 6, 8} {1, 4, 5}√ uplooking01:6379> sdiff A B 1) "1" 2) "4" 3) "5" sdiffstore dest key1 [key2] 返回並保存給定集合差集保存到dest中 uplooking01:6379> sdiffstore tmp A B (integer) 3 uplooking01:6379> smembers tmp 1) "1" 2) "4" 3) "5" sinter key1 [key2] 返回給定集合的交集 uplooking01:6379> sinter A B 1) "2" 2) "3" sinterstore dest key1 [key2] 返回並保存給定集合的交集到dest中 sismember key member 判斷member元素是不是集合key的成員 uplooking01:6379> sismember A 3 (integer) 1 uplooking01:6379 smembers key 返回集合中全部成員 smove src dest member 將member元素從src移動到dest中 spop key 移除並返回集合中的一個隨機元素 srandmember key [count] 返回集合中一個或多個隨機數 隨機返回集合key中的count個元素,沒有count,返回1個 uplooking01:6379> srandmember A "1" uplooking01:6379> srandmember A 2 1) "3" 2) "4" srem key member1 [member2] 移除集合中一個或多個成員 sunion key1 [key2] 返回全部給定集合的並集---就是數學中的並集的概念 uplooking01:6379> sunion A B 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "8" sunionstore dest key1 [key2] 返回並保存給定集合的並集到dest sscan key cursor [match pattern] [count count] 迭代集合中的元素
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"
經常使用操做命令以下:數據庫
zadd key score1 member1 [score2 member2] 想有序集合添加一個或多個成員, 或是更新已經存在成員的分數 uplooking01:6379> zadd website 0.01 www.uplooking.com (integer) 1 uplooking01:6379> zadd website 0.05 www.baidu.com (integer) 1 uplooking01:6379> zadd website 0.1 www.google.com (integer) 1 uplooking01:6379> zadd website 1 www.taobao.com (integer) 1 uplooking01:6379> zadd website 0.005 www.jd.com (integer) 1 zcard key 獲取有序集合的成員數 uplooking01:6379> zcard website (integer) 5 zcount key min max 計算在有序集合中指定區間分數的成員數 獲取分數區間[min, max]中元素 uplooking01:6379> zcount website 0.01 0.1 (integer) 3 zincrby key increment member 有序集合中對指定成員的分數上增量incr uplooking01:6379> zincrby website 0.01 www.uplooking.com "0.02" zinterstore dest nkeys key [key..] 計算給定的一個或多個有序集的交集並保存在新的有序集合dest中 zlexcount key min max 在有序集合中計算指定字典區間內成員數量 須要清楚的是 可使用-表明,得分最小的元素,使用+表明得分最大的元素 zlexcount key - + 獲得就是集合的size min===>[member1 max===>[member2 獲得的元素個數就是在區間[member1, member2]內的元素個數 redis> ZADD myzset 1 a 2 b 3 c 4 d 5 e 6 f 7 g (integer) 7 redis> zrange myzset 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" 6) "f" 7) "g" redis> ZLEXCOUNT myzset - + (integer) 7 redis> ZLEXCOUNT myzset [c + (integer) 5 redis> ZLEXCOUNT myzset - [c (integer) 3 redis> zrange key start stop [withscores] 經過索引區間返回有序集合成指定區間內的成員 特殊的一個寫法zrange key 0 -1返回全部的元素 zrangebylex key min max [limit offset count] 經過字典區間返回有序集合的成員 zrangebyscore key min max [withscores] [limit] 經過分數返回有序集合指定區間內的成員 zrank key member 返回有序集合中指定成員的索引 zrem key member [member ...] 移除有序集合中的一個或多個成員 返回1,刪除成功,返回0,沒有這個元素 zremrangebylex key min max 移除有序集合中給定的字典區間的全部成員 zremrangebyrank key start stop 移除key中給定的排名區間的全部成員 排名就是索引 zremrangebyscore key start stop 移除key中給定的分數區間的全部成員 分數就是score zrevrange key start stop [withscores] 返回有序key中指定區間內的成員,經過索引,分數從高到低 和zrange key start stop反過來 zrevrangebysocre key max min [withscores] 返回有序key中指定分數區間內的成員,經過索引,分數從高到低 zrevrank key memeber 返回key中指定成員的排名,key成員按分數值遞減排序 zscore key member 返回key中member的分數 zunionstore dest numkeys key [key...] 計算給定的一個或多個有序集的並集,並存儲到新的dest中 zscan key cursor [match pattern] [count count] 迭代有序集合中的元素(包括元素成員和元素分值) uplooking01:6379> zscan website 1 1) "0" 2) 1) "www.jd.com" 2) "0.0050000000000000001" 3) "www.uplooking.com" 4) "0.02" 5) "www.baidu.com" 6) "0.050000000000000003" 7) "www.taobao.com" 8) "1"
keys * 列舉出全部的key type key 獲取對應key的數據類型 select [0-15] 切換到某一個數據庫中 rename oldKey newKey 將oldKey重命名爲newKey 終端中屬於密碼的兩種方式: 第一種: 鏈接的時候:redis-3.2.0]# src/redis-cli -h uplooking03 -a uplooking 第二中: 登錄以後再輸入密碼: auth uplooking(密碼) 中止redis服務的命令: src/redis-cli -h uplooking01 -p 6379 shutdown 一、鍵值相關命令 keys * 取出當前全部的key exists name 查看redis是否有name這個key del name 刪除key name expire confirm 100 設置confirm這個key100秒過時 ttl confirm 獲取confirm 這個key的有效時長 select 0 選擇到0數據庫 redis默認的數據庫是0~15一共16個數據庫 move confirm 1 將當前數據庫中的key移動到其餘的數據庫中, persist confirm 移除confirm這個key的過時時間 randomkey 隨機返回數據庫裏面的一個key rename key2 key3 重命名key2 爲key3 type key2 返回key的數據類型 二、服務器相關命令 ping PONG返回響應是否鏈接成功 echo 在命令行打印一些內容 select 0~15 編號的數據庫 quit /exit 退出客戶端 dbsize 返回當前數據庫中全部key的數量 info 返回redis的相關信息 config get dir/* 實時傳儲收到的請求 flushdb 刪除當前選擇數據庫中的全部key flushall 刪除全部數據庫中的數據庫