redis用法分析

redis基本介紹

redis也是一個內存非關係型數據庫,它擁有memcache在數據存儲上的所有優勢,並且在memcache的基礎上增長了數據持久性功能,redis用rdb和aof兩種方式實現數據持久性,在服務器忽然宕機時也能幾乎保留已存的所有數據。php

  1. 增長了string(字符串)、set(集合)、sorted_set(有序集合)、hash(哈希)、list(鏈表)數據類型,方便了多類型的存儲和數據庫操做。
  2. 增長了安全驗證(可爲服務器設置鏈接密碼)。
  3. redis的主從分離等系統更完善(官方開發)。
  4. 原生支持發佈/訂閱、隊列、緩存等工具。

固然,相比較memcache,它的數據庫操做也較爲複雜。python

redis的應用場景和安裝

redis除了能夠用在memcache能用的地方,它還能夠用在:mysql

  1. 能夠用鏈表來存儲數據,讀取其最新信息。
  2. 能夠用有序列表存儲數據,讀取其排行榜數據
  3. 能夠用集合來存儲關注/被關注信息。

在官網(http://redis.io/)下載到它的最新版本,直接解壓,由於redis官方已經編譯過了,直接進行make / make test ,在make install時能夠指定其安裝路徑。redis

$ wget http://download.redis.io/releases/redis-4.0.8.tar.gz
$ tar xzf redis-4.0.8.tar.gz
$ cd redis-4.0.8
$ make

也可使用對應平臺的安裝包工具進行安裝。sql

安裝完成後,將安裝包裏的redis的conf文件mv到安裝目錄的bin目錄下,它是配置和啓動redis所必需的。數據庫

除此,安裝目錄文件下src目錄裏還有以下文件。vim


redis-benchmark //性能測試工具 -n xxx 表示發出xxx條命令用來測試
redis-check-aof //檢查aof日誌的工具
redis-check-dump //檢查rbd日誌的工具
redis-cli //客戶端
redis-server //redis的服務器進程
redis-sentinel //redis哨兵模式的進程設計模式

查看默認配置緩存

cat  redis.conf |grep -v '^#'
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
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

咱們用vim打開redis.conf來簡單配置redis服務器。安全

將daemonize 選項改成yes來後臺運行
database n 設置一個redis服務器裏有n個服務器,默認爲0-15共16個
port n 來設置redis服務器的監聽端口
設置requirepass yourpassword來設置密碼,客戶端鏈接後用auth password來經過驗證

咱們使用./redis-server ./redis.conf命令來打開redis服務器。

使用./redis-cli [-p port]來鏈接服務器(默認6379)。

redis的命令

基本(包括string字符串類型)命令

set key value [ex|px n] //設置值[並設置過時時間爲n秒/毫秒]
get key //獲取值
del key //刪除值
incby|decby key n //將key值自增或自減n
rename key newkey//覆蓋原來的
select n//選擇第n個數據庫
ttl key //查詢key的過時時間,-1表示永不過時,不存在的爲-2
expire key n //設置key的過時時間爲n秒 
type key //獲取key的存儲類型
flushdb //清除當前數據庫中的值
shutdown [nosave]//關閉服務器[不存儲]

list(鏈表)命令

lpush/rpush list value1 [value2 value3...] //將value壓入鏈表頭/尾
lpop/rpop list //彈出鏈表頭/尾的值
llen list //獲取鏈表長度

set(集合)命令

zadd sorted_set score1 key1 score2 key2 score3 key3...向有序集合中添加key,並定義其score,集合會用score對其排序
zrange sorted_set a b [withscores]從第a到第b顯示有序列表中的值 b爲-1時顯示所有,[顯示各個值的score]
zrank/zrevrank sorted_set key 正序/倒序顯示key在有序集合中的位置
zrem sorted_set key 刪除有序集合中的key
zcard sorted_set [m n]計算有序集合中[score在m到n之間的]一共有多少個

sorted_set(有序集合)命令

zadd sorted_set score1 key1 score2 key2 score3 key3...向有序集合中添加key,並定義其score,集合會用score對其排序
zrange sorted_set a b [withscores]從第a到第b顯示有序列表中的值 b爲-1時顯示所有,[顯示各個值的score]
zrank/zrevrank sorted_set key 正序/倒序顯示key在有序集合中的位置
zrem sorted_set key 刪除有序集合中的key
zcard sorted_set [m n]計算有序集合中[score在m到n之間的]一共有多少個

hash(哈希類型)命令

hset hashset key value 設置hash表key的值爲value
hget hashset key 獲取hash表的key值
hdel hashset key 刪除hash表中的一個key
hlen hashset 獲取hash表的長度

redis命令繁多,這裏只列了一點簡單的,具體命令能夠其官網或其中文站http://www.redis.cn/查看翻譯文檔

redis的事務和發佈、訂閱

redis中的事務與mysql的相似,只有語句有些不一樣。

redis        mysql
開始事務    multi      start transition
          事務中的query語句
執行事務    exec        commit
回滾事務    discard       roll back

對於併發影響,redis有watch語句控制,被watch語句監測的key值一旦在事務提交前發生變化,則事務自動被取消回滾。

watch key1 [key2...]

unwatch 取消全部監測。

redis原生髮布和訂閱功能,它相似於設計模式中的觀察者模式,被訂閱對象一旦發佈了新的消息,那麼全部訂閱對象都會收到這條消息。使用方式爲:

subscribe key //訂閱某個key,若是這個key發佈了新的消息,則會收聽到
public key value//發佈消息key,值爲value,返回值是收到這個消息的人的個數
unsubscribe key //取消監聽
psubscribe key1 key2/pattrn //[根據模式]監聽多個key

redis的數據持久化

redis經過rdb和aof兩種方式實現數據持久化,兩種數據持久化方式都會佔用CPU資源,拖慢redis的執行效率,通常兩種模式配合使用。

rdb方式的主要原理就是達到某一寫入條件後把內存中的全部數據的快照保存一份到磁盤上,數據恢復時用數據快照恢復。

aof方式是經過將每條redis執行命令記錄入文本文件,恢復數據時重複執行記錄的命令。

rdb方式實現數據持久化

用save/bgSave命令能夠主動使用rdb方式[後臺]存儲rdb

修改redis.conf文件進行配置

save m n          //在m秒內有n次修改即進行一次快照,保存點很重要,通常會配置多個條件,知足其中之一就保存
stop-writes-on-bgsave-error yes //在進行快照的過程當中若是出錯,則中止寫入
rdbcompression yes     //設置進行數據壓縮
rdbchecksum yes       //導入數據時檢查文件是否損壞
dbfilename xxx.rdb     //導出的文件名
dir path          //導出的文件路徑

aof方式實現數據持久化

aof持久化的問題在於將每條指令都記錄下來,即便是對一個鍵的反覆操做,這樣會致使aof文件愈來愈大,使用aof重寫將會大大減少aof文件的體積,由於它是在最後將數據庫內數據的狀態統一逆化爲命令,而不論一個key通過了多少次變化。使用 bgrewrite 命令可手動重寫aof文件。

配置redis.conf文件:

noapppendfsync-on-rewrite yes    //設置導出rdb時中止寫入aof,aof會被寫在內存隊列裏,dump rdb 完成後統一進行寫入操做。
appendfsync everysec        //每秒寫入一次
appendfilename           //path/filename.aof
auto-aof-rewrite-percentage 100   //文件大小增加100%時重寫
auto-aof-rewrite-min-size 64m    //文件至少達到64m時重寫

redis的主從複製

主從複製時,主從都要以本身的.conf文件來啓動服務器。主服務器能夠將rdb關閉,以從服務器來產生rdb,加快主服務器的速度。

從服務器複製一個redis6380.conf文件,設置端口,pid存放文件,只讀,主服務器的密碼。

port 6380
pidfile filename
slave-read-only yes
masterauth password

設置完成後,分別用不一樣的conf文件打開服務器。

考慮到主服務器宕機的狀況,咱們用sentinel redis哨兵來監測服務器狀態,在主服務器宕機以後作出反應。sentinel是redis集成的,咱們只須要將安裝包裏的sentinel.conf文件拷貝到redis/bin目錄下,使用redis-sentinel進程文件來啓動服務器便可。

port 26379                    //sentinel監聽的端口號
daemonize yes                  //後臺啓動進程
sentinel monitor mymaster 192.168.100.211 6379 2 //設置主進程ip和端口號,並設置兩個哨兵發現主服務器長時間沒法鏈接才斷定其宕機
sentinel down-after-milliseconds mymaster 30000 //30000毫秒鏈接不上斷定爲沒法鏈接
sentinel parallel-syncs mymaster 1        //一個主服務器打開時,同時複製的從服務器數,太大的話會形成服務器瞬間擁堵
sentinel failover-timeout mymaster 900000    //在90000秒內哨兵再也不試圖恢復原主服務器

PHP操做redis服務器

安裝好php的redis擴展後,就能夠直接使用redis的類函數庫了。

以下是典型的redis應用。

$redis=new Redis();           //實例化一個Redis對象
$redis->connect('host',port);      //鏈接redis服務器
$redis->auth('password');        //用密碼認證
$redis->set($key,$value[,$expire_time]);//設置一個值
$content=$redis->get($key);       //獲取值

python使用redis

首先安裝redis

pip install redis

使用

In [3]: import redis

In [4]: r = redis.Redis(host='localhost', port=6379, db=0)

In [5]: dir(r)
Out[5]:
['RESPONSE_CALLBACKS',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_georadiusgeneric',
 '_use_lua_lock',
 '_zaggregate',
 'append',
 'bgrewriteaof',
 'bgsave',
 'bitcount',
 'bitop',
 'bitpos',
 'blpop',
 'brpop',
 'brpoplpush',
 'client_getname',
 'client_kill',
 'client_list',
 'client_setname',
 'cluster',
 'config_get',
 'config_resetstat',
 'config_rewrite',
 'config_set',
 'connection_pool',
 'dbsize',
 'debug_object',
 'decr',
 'delete',
 'dump',
 'echo',
 'eval',
 'evalsha',
 'execute_command',
 'exists',
 'expire',
 'expireat',
 'flushall',
 'flushdb',
 'from_url',
 'geoadd',
 'geodist',
 'geohash',
 'geopos',
 'georadius',
 'georadiusbymember',
 'get',
 'getbit',
 'getrange',
 'getset',
 'hdel',
 'hexists',
 'hget',
 'hgetall',
 'hincrby',
 'hincrbyfloat',
 'hkeys',
 'hlen',
 'hmget',
 'hmset',
 'hscan',
 'hscan_iter',
 'hset',
 'hsetnx',
 'hstrlen',
 'hvals',
 'incr',
 'incrby',
 'incrbyfloat',
 'info',
 'keys',
 'lastsave',
 'lindex',
 'linsert',
 'llen',
 'lock',
 'lpop',
 'lpush',
 'lpushx',
 'lrange',
 'lrem',
 'lset',
 'ltrim',
 'mget',
 'move',
 'mset',
 'msetnx',
 'object',
 'parse_response',
 'persist',
 'pexpire',
 'pexpireat',
 'pfadd',
 'pfcount',
 'pfmerge',
 'ping',
 'pipeline',
 'psetex',
 'pttl',
 'publish',
 'pubsub',
 'pubsub_channels',
 'pubsub_numpat',
 'pubsub_numsub',
 'randomkey',
 'register_script',
 'rename',
 'renamenx',
 'response_callbacks',
 'restore',
 'rpop',
 'rpoplpush',
 'rpush',
 'rpushx',
 'sadd',
 'save',
 'scan',
 'scan_iter',
 'scard',
 'script_exists',
 'script_flush',
 'script_kill',
 'script_load',
 'sdiff',
 'sdiffstore',
 'sentinel',
 'sentinel_get_master_addr_by_name',
 'sentinel_master',
 'sentinel_masters',
 'sentinel_monitor',
 'sentinel_remove',
 'sentinel_sentinels',
 'sentinel_set',
 'sentinel_slaves',
 'set',
 'set_response_callback',
 'setbit',
 'setex',
 'setnx',
 'setrange',
 'shutdown',
 'sinter',
 'sinterstore',
 'sismember',
 'slaveof',
 'slowlog_get',
 'slowlog_len',
 'slowlog_reset',
 'smembers',
 'smove',
 'sort',
 'spop',
 'srandmember',
 'srem',
 'sscan',
 'sscan_iter',
 'strlen',
 'substr',
 'sunion',
 'sunionstore',
 'time',
 'touch',
 'transaction',
 'ttl',
 'type',
 'unwatch',
 'wait',
 'watch',
 'zadd',
 'zcard',
 'zcount',
 'zincrby',
 'zinterstore',
 'zlexcount',
 'zrange',
 'zrangebylex',
 'zrangebyscore',
 'zrank',
 'zrem',
 'zremrangebylex',
 'zremrangebyrank',
 'zremrangebyscore',
 'zrevrange',
 'zrevrangebylex',
 'zrevrangebyscore',
 'zrevrank',
 'zscan',
 'zscan_iter',
 'zscore',
 'zunionstore']

總結

上面只是簡單的介紹redis的使用,不少知識點都沒有介紹。 後續有時間再按官方文檔來一篇教程。

原文地址:https://www.jianshu.com/p/5c960c0bf6d3

相關文章
相關標籤/搜索