Redis入門

Redis

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的全部操做都是原子性的,意思就是要麼成功執行要麼失敗徹底不執行。單個操做是原子性的。多個操做也支持事務,即原子性,經過MULTI和EXEC指令包起來。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過時等等特性。

redis是一個數據庫 redis是一個內存數據庫, 全部數據基本上都存在於內存當中, 會定時以追加或者快照的方式刷新到硬盤中. 因爲redis是一個內存數據庫, 因此讀取寫入的速度是很是快的, 因此常常被用來作數據, 頁面等的緩存。


注意:Redis支持多個數據庫,而且每一個數據庫的數據是隔離的不能共享,而且基於單機纔有,若是是集羣就沒有數據庫的概念。

每一個數據庫對外都是一個從0開始的遞增數字命名,Redis默認支持16個數據庫(能夠經過配置文件支持更多,無上限),能夠經過配置databases來修改這一數字。客戶端與Redis創建鏈接後會自動選擇0號數據庫,不過能夠隨時使用SELECT命令更換數據庫,
SELECT 1 #切換到1號數據庫
最重要的一點是多個數據庫之間並非徹底隔離的,好比FLUSHALL命令能夠清空一個Redis實例中全部數據庫中的數據。
Redis特色、優點
sudo apt-get update
sudo apt-get install redis-server  #安裝redis
redis-server   #使用默認配置啓動redis
redis-server ../redis.conf    #使用指定配置文件啓動redis
redis-cli        #使用測試客戶端程序redis-cli和redis服務交互
redis 127.0.0.1:6379> ping  #使用ping進行測試,返回pong則說明redis正常運行

Redis桌面管理器 https://redisdesktop.com/download


Redis 配置
你能夠經過修改 redis.conf 文件或使用 CONFIG set 命令來修改配置。
參數說明詳見 http://www.runoob.com/redis/redis-conf.html



redis-cli     鏈接本地的 redis 服務
redis-cli -h host -p port -a password            #鏈接遠程 redis 服務
redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis-cli --raw        #有時須要這個參數避免中文亂碼



Redis 鏈接
AUTH password            驗證密碼是否正確(密碼認證在鏈接reids成功後,在reids操做界面進行密碼認證)
ECHO message             打印字符串
PING                     查看服務是否運行
QUIT                     關閉當前鏈接
SELECT index             切換到指定的數據庫
安裝、配置及鏈接Redis
服務器命令

BGREWRITEAOF :異步執行一個 AOF(AppendOnly File) 文件重寫操做
BGSAVE :在後臺異步保存當前數據庫的數據到磁盤
CLIENT KILL [ip:port] [ID client-id] :關閉客戶端鏈接
CLIENT LIST :獲取鏈接到服務器的客戶端鏈接列表
CLIENT GETNAME :獲取鏈接的名稱
CLIENT PAUSE timeout :在指定時間內終止運行來自客戶端的命令
CLIENT SETNAME connection-name :設置當前鏈接的名稱
CLUSTER SLOTS :獲取集羣節點的映射數組
COMMAND :獲取 Redis 命令詳情數組
COMMAND COUNT :獲取 Redis 命令總數
COMMAND GETKEYS :獲取給定命令的全部鍵
TIME :返回當前服務器時間
COMMAND INFO command-name [command-name ...] :獲取指定 Redis 命令描述的數組
CONFIG GET parameter :獲取指定配置參數的值
CONFIG REWRITE :對啓動 Redis 服務器時所指定的 redis.conf 配置文件進行改寫
CONFIG SET parameter value :修改 redis 配置參數,無需重啓
CONFIG RESETSTAT :重置 INFO 命令中的某些統計數據
DBSIZE :返回當前數據庫的 key 的數量
DEBUG OBJECT key :獲取 key 的調試信息
DEBUG SEGFAULT :讓 Redis 服務崩潰
FLUSHALL :刪除全部數據庫的全部key
FLUSHDB :刪除當前數據庫的全部key
INFO [section] :獲取 Redis 服務器的各類信息和統計數值
LASTSAVE :返回最近一次 Redis 成功將數據保存到磁盤上的時間,以 UNIX 時間戳格式表示
MONITOR :實時打印出 Redis 服務器接收到的命令,調試用
ROLE :返回主從實例所屬的角色
SAVE :同步保存數據到硬盤
SHUTDOWN [NOSAVE] [SAVE] :異步保存數據到硬盤,並關閉服務器
SLAVEOF host port :將當前服務器轉變爲指定服務器的從屬服務器(slave server)
SLOWLOG subcommand [argument] :管理 redis 的慢日誌
SYNC :用於複製功能(replication)的內部命令
服務器命令
若是是用apt-get或者yum install安裝的redis,能夠直接經過下面的命令中止/啓動/重啓redis
/etc/init.d/redis-server stop 
/etc/init.d/redis-server start 
/etc/init.d/redis-server restart

若是是經過源碼安裝的redis,則能夠經過redis的客戶端程序redis-cli的shutdown命令來重啓redis
1.redis關閉 
redis-cli -h 127.0.0.1 -p 6379 shutdown
2.redis啓動 
redis-server

若是上述方式都沒有成功中止redis,則可使用終極武器 kill -9

加上‘&’號使redis之後臺程序方式運行
./redis-server &
重啓Redis

 

Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。html

命令:

DEL key:該命令用於在 key 存在時刪除 key。
TYPE key :返回 key 所儲存的值的類型。
EXISTS key:檢查給定 key 是否存在。
RENAME key newkey :修改 key 的名稱
RENAMENX key newkey :僅當 newkey 不存在時,將 key 更名爲 newkey 。

EXPIRE key seconds:爲給定 key 設置過時時間,以秒計。
EXPIREAT key timestamp :EXPIREAT 的做用和 EXPIRE 相似,都用於爲 key 設置過時時間。 不一樣在於 EXPIREAT 命令接受的時間參數是 UNIX 時間戳(unix timestamp)。
PEXPIRE key milliseconds :設置 key 的過時時間以毫秒計。
PEXPIREAT key milliseconds-timestamp :設置 key 過時時間的時間戳(unix timestamp) 以毫秒計
KEYS pattern :查找全部符合給定模式( pattern)的 key 。 #keys * 查看全部的keys
MOVE key db :將當前數據庫的 key 移動到給定的數據庫 db 當中。
PERSIST key :移除 key 的過時時間,key 將持久保持。
PTTL key :以毫秒爲單位返回 key 的剩餘的過時時間。
TTL key :以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)。
RANDOMKEY :從當前數據庫中隨機返回一個 key 。
DUMP key :序列化給定 key ,並返回被序列化的值。
命令
Redis 字符串(String)命令
Redis 字符串數據類型的相關命令用於管理 redis 字符串值
新增
SET key value:設置指定 key 的值
MSET key value [key value ...]:同時設置一個或多個 key-value 對。
SETNX key value:只有在 key 不存在時設置 key 的值。
MSETNX key value [key value ...] :同時設置一個或多個 key-value 對,當且僅當全部給定 key 都不存在。
SETEX key seconds value:將值 value 關聯到 key ,並將 key 的過時時間設爲 seconds (以秒爲單位)。

查看
GET key :獲取指定 key 的值。
MGET key1 [key2..]:獲取全部(一個或多個)給定 key 的值。
GETRANGE key start end:返回 key 中字符串值的子字符
GETSET key value:將給定 key 的值設爲 value ,並返回 key 的舊值(old value)。
STRLEN key:返回 key 所儲存的字符串值的長度。

修改
INCR key:將 key 中儲存的數字值增一。
INCRBY key increment:將 key 所儲存的值加上給定的增量值(increment) 。
INCRBYFLOAT key increment:將 key 所儲存的值加上給定的浮點增量值(increment) 。
DECR key:將 key 中儲存的數字值減一。
DECRBY key decrement:ey 所儲存的值減去給定的減量值(decrement) 。
APPEND key value:若是 key 已經存在而且是一個字符串, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾。

其餘
GETBIT key offset:對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。
SETBIT key offset value:對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。
SETRANGE key offset value:用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。
PSETEX key milliseconds value:這個命令和 SETEX 命令類似,但它以毫秒爲單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒爲單位。




以最小的空間記錄全部的在線用戶,且快速統計(快速有存疑)
每個用戶id對應了一組二進制字符串的一位bit;
當該位置爲0時,表示用戶不在線;當該位置爲1時,表示用戶在線
直接查詢用戶id對應的那一位bit值,便可知道用戶是否在線
統計二進制字符串全部的1,便可知道在線用戶數量
setbit login_users 1 0  #設置二進制字符串login_users的1位bit值爲0
setbit login_users 2 1  #設置bit值爲1
setbit login_users 3 0
bitcount login_users    #統計該二進制字符串中1的數量,即在線用戶總數
getbit login_users 5    #查看第5位的bit值,便是否在線
Redis 字符串(String)命令
Redis 哈希(Hash)命令
Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
新增
HSET key field value :將哈希表 key 中的字段 field 的值設爲 value 。
HMSET key field1 value1 [field2 value2 ] :同時將多個 field-value (域-值)對設置到哈希表 key 中。
HSETNX key field value :只有在字段 field 不存在時,設置哈希表字段的值。

查看
HEXISTS key field :查看哈希表 key 中,指定的字段是否存在。
HGET key field :獲取存儲在哈希表中指定字段的值。
HMGET key field1 [field2] :獲取全部給定字段的值
HGETALL key :獲取在哈希表中指定 key 的全部字段和值
HKEYS key :獲取全部哈希表中的字段
HLEN key :獲取哈希表中字段的數量
HVALS key :獲取哈希表中全部值
HSCAN key cursor [MATCH pattern] [COUNT count] :迭代哈希表中的鍵值對。

修改
HINCRBY key field increment :爲哈希表 key 中的指定字段的整數值加上增量 increment 。
HINCRBYFLOAT key field increment :爲哈希表 key 中的指定字段的浮點數值加上增量 increment 。

刪除
HDEL key field1 [field2] :刪除一個或多個哈希表字段
Redis 哈希(Hash)命令
Redis 列表(List)命令
Redis列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)

新增(插入)
LINSERT key BEFORE|AFTER pivot value :在列表的元素前或者後插入元素
LPUSH key value1 [value2] :將一個或多個值插入到列表頭部
LPUSHX key value :將一個值插入到已存在的列表頭部
RPUSH key value1 [value2] :在列表中添加一個或多個值
RPUSHX key value :爲已存在的列表添加值

查看
LINDEX key index :經過索引獲取列表中的元素
LLEN key :獲取列表長度
LRANGE key start stop :獲取列表指定範圍內的元素

修改(移除)
BLPOP key1 [key2 ] timeout :移出並獲取列表的第一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
BRPOP key1 [key2 ] timeout :移出並獲取列表的最後一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
BRPOPLPUSH source destination timeout :從列表中彈出一個值,將彈出的元素插入到另一個列表中並返回它; 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。
LPOP key :移出並獲取列表的第一個元素
LSET key index value :經過索引設置列表元素的值
LREM key count value :移除列表元素
RPOP key :移除列表的最後一個元素,返回值爲移除的元素。
RPOPLPUSH source destination :移除列表的最後一個元素,並將該元素添加到另外一個列表並返回
LTRIM key start stop :對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間以內的元素都將被刪除。
Redis 列表(List)命令
Redis 集合(Set)命令
Redis 的 Set 是 String 類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。
Redis 中集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是 O(1)。

新增
SADD key member1 [member2] :向集合添加一個或多個成員


查看
SCARD key :獲取集合的成員數
SDIFF key1 [key2] :返回給定全部集合的差集
SMEMBERS key :返回集合中的全部成員
SRANDMEMBER key [count] :返回集合中一個或多個隨機數
SSCAN key cursor [MATCH pattern] [COUNT count] :迭代集合中的元素

修改
SMOVE source destination member :將 member 元素從 source 集合移動到 destination 集合


刪除
SPOP key :移除並返回集合中的一個隨機元素
SREM key member1 [member2] :移除集合中一個或多個成員


集合間操做
SDIFFSTORE destination key1 [key2] :返回給定全部集合的差集並存儲在 destination 中
SINTER key1 [key2] :返回給定全部集合的交集
SINTERSTORE destination key1 [key2] :返回給定全部集合的交集並存儲在 destination 中
SISMEMBER key member :判斷 member 元素是不是集合 key 的成員
SUNION key1 [key2] :返回全部給定集合的並集
SUNIONSTORE destination key1 [key2] :全部給定集合的並集存儲在 destination 集合中
Redis 集合(Set)命令
Redis 有序集合(sorted set)命令
Redis 有序集合和集合同樣也是string類型元素的集合,且不容許重複的成員。
不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。
有序集合的成員是惟一的,但分數(score)卻能夠重複。
集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。 

新增
ZADD key score1 member1 [score2 member2] :向有序集合添加一個或多個成員,或者更新已存在成員的分數


查看
ZCARD key :獲取有序集合的成員數
ZCOUNT key min max :計算在有序集合中指定區間分數的成員數
ZLEXCOUNT key min max :在有序集合中計算指定字典區間內成員數量
ZRANGE key start stop [WITHSCORES] :經過索引區間返回有序集合成指定區間內的成員
ZRANGEBYLEX key min max [LIMIT offset count] :經過字典區間返回有序集合的成員
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] :經過分數返回有序集合指定區間內的成員
ZRANK key member :返回有序集合中指定成員的索引
ZREVRANGE key start stop [WITHSCORES] :返回有序集中指定區間內的成員,經過索引,分數從高到底
ZREVRANGEBYSCORE key max min [WITHSCORES] :返回有序集中指定分數區間內的成員,分數從高到低排序
ZREVRANK key member :返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
ZSCORE key member :返回有序集中,成員的分數值
ZSCAN key cursor [MATCH pattern] [COUNT count] :迭代有序集合中的元素(包括元素成員和元素分值)

修改
ZINCRBY key increment member :有序集合中對指定成員的分數加上增量 increment


刪除
ZREM key member [member ...] :移除有序集合中的一個或多個成員
ZREMRANGEBYLEX key min max :移除有序集合中給定的字典區間的全部成員
ZREMRANGEBYRANK key start stop :移除有序集合中給定的排名區間的全部成員
ZREMRANGEBYSCORE key min max :移除有序集合中給定的分數區間的全部成員

集合間操做
ZINTERSTORE destination numkeys key [key ...] :計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中
ZUNIONSTORE destination numkeys key [key ...] :計算給定的一個或多個有序集的並集,並存儲在新的 key 中
Redis 有序集合(sorted set)命令
Redis HyperLogLog(一種新增的結構)
Redis 在 2.8.9 版本添加了 HyperLogLog 結構。
詳見http://www.runoob.com/redis/redis-tutorial.html
Redis HyperLogLog(一種新增的結構)

Redis 發佈訂閱

Redis 發佈訂閱(pub/sub)是一種消息通訊模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
Redis 客戶端能夠訂閱任意數量的頻道。


SUBSCRIBE channel [channel ...] :訂閱給定的一個或多個頻道的信息。
PSUBSCRIBE pattern [pattern ...] :訂閱一個或多個符合給定模式的頻道。

PUBSUB subcommand [argument [argument ...]] :查看訂閱與發佈系統狀態。
PUBLISH channel message :將信息發送到指定的頻道。

UNSUBSCRIBE [channel [channel ...]] :指退訂給定的頻道。
PUNSUBSCRIBE [pattern [pattern ...]] :退訂全部給定模式的頻道。
Redis 發佈訂閱

python操做Redis

import redis
# Redis對象的方法與Redis中的命令基本一致,
# 參數說明詳見https://www.cnblogs.com/alex3714/articles/6217453.html
r = redis.Redis(host='10.0.0.45', port=6379)#填上假地址,虛假鏈接會一直保持阻塞狀態
r.set('foo', 'Bar')
print(r.get("foo"))
r.hset("dict1","name","allen")
print(r.hget("dict1",'name'))
r.lpush("list1",11,22,33)
print(r.llen('list1'))

# redis-py默認在執行每次請求都會建立(鏈接池申請鏈接)和斷開(歸還鏈接池)一次鏈接操做,若是想要在一次請求中指定多個命令,則可使用pipline實現一次請求指定多個命令,而且默認狀況下一次pipline 是原子性操做。
pipe = r.pipeline(transaction=True)
pipe.set('name100', 'alex')
pipe.set('role200', 'sb')
pipe.execute()# 執行管道
示例
import redis
class RedisHelper:

    def __init__(self):
        self.__conn = redis.Redis(host='10.0.0.45',port=6379)#填上錯誤地址,虛假鏈接會一直保持阻塞狀態
        self.chan_sub = 'fm104.5'
        self.chan_pub = 'fm104.5'

    def public(self, msg):
        self.__conn.publish(self.chan_pub, msg)
        return True

    def subscribe(self):
        pub = self.__conn.pubsub()
        pub.subscribe(self.chan_sub)
        pub.parse_response()
        return pub

        
# 訂閱者
obj = RedisHelper()
redis_sub = obj.subscribe()
while True:
    msg= redis_sub.parse_response()
    print(msg)
    
# 發佈者
obj = RedisHelper()
obj.public('hello')
obj.public('hello2')
obj.public('hello3')
發佈訂閱示例

 

 

 

參考文章:
https://www.cnblogs.com/alex3714/articles/6217453.html
http://www.runoob.com/redis/redis-tutorial.html
Redis 命令參考 http://doc.redisfans.com/python

相關文章
相關標籤/搜索