Redis操作以及Aof Rdb 數據持久化簡介

一、簡介

1.1.概念  

     redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

1.2.使用場景

  • 登錄會話存儲,存儲在redis中,與memcached相比,數據不會丟失
  • 排行版、計數器:比如一些秀場類的項目,經常會有一些前多少名的主播排名。還有一些文章閱讀量的技術,或者新浪微博的點贊數。
  • 作爲消息隊列:比如celery就是redis作爲中間人
  • 當前在線人數:顯示有多少在線人數
  • 一些常用的數據緩存:比如BBS論壇,模塊不會經常變化,但是每次訪問首頁都要從mysql中獲取,可以在redis中緩存起來,不用每次請求數據庫。
  • 把前200篇文章或者評論緩存:一般用戶瀏覽網站,只會瀏覽前面一部分文章或者評論,那麼可以把前面200篇文章和對應評論緩存起來。用戶訪問超過的,就訪問數據庫,並且以後文章超過200篇,則把之前的文章刪除。
  • 好友關係:微博的好友關係使用redis實現
  • 發佈和訂閱功能:可以用來做聊天軟件

1.3.reids和memcached的比較

1.4.安裝與啓動

yum install redis

ps -ef | grep redis

service redis start

redis-cli -p 6379 -h 127.0.0.1

quit

service redis stop

二、對redis的操作

2.1.字符串操作

 (1)添加

將字符串值value關聯到key。如果key已經存在值,set命令會覆蓋之前的值。默認的過期時間是永久。

set username derek

(2)刪除

del username

(3)設置過期時間

#兩種方式都可以
set username derek EX 10     #10s

#或者
setex username 10 derek

*(4)查看過期時間

ttl username

(5)查看當前redis中的所有key

keys *

2.2.列表操作

 (1)在列表左邊添加元素

lpush username derek

 將值value插入到列表key的表頭。如果key不存在,一個空列表會被創建並執行lpush操作。當key存在但不是列表類型時,將返回一個錯誤。

(2)在列表右邊添加元素

rpush username Tom

將值value插入到列表key的表尾,如果key不存在,一個空列表會被創建並執行lpush操作。當key存在但不是列表時,將返回一個錯誤。

 (3)查看列表中的元素

lrange username 0 -1       #起始到末尾,索引

返回列表key中指定區間內的元素,區間以偏移量start和stop指定。

 (4)移除列表中的元素

#移除並返回列表key的頭元素
lpop username

#移除並返回列表key的尾元素
rpop username

(5)指定返回第幾個元素

將返回key這個列表中,索引爲index的這個元素

#lindex key index

lindex username 1

 (6)獲取列表中的元素個數

llen username

(7)刪除指定的元素

lrem users 2 derek    # 2,代表刪除的數量

lrem users 0 derek     # 刪除所有數量

根據參數count的值,移除列表中與參數value相等的元素。count的值可以試一下幾種:

  • count > 0:從表頭開始向表尾搜索,移除與value相等的元素,數量爲count
  • count < 0:從表尾開始向表頭搜索,移除與value相等的元素,數量爲count的絕對值
  • count = 0:移除表中所有與value相等的值。

2.3.集合操作

(1)添加元素

sadd users derek jack

(2)查看元素

smembers users

(3)移除元素

srem users derek

(4)查看集合中的元素個數

scard users

(5)多個集合之間的交集、並集和差集

sinter set1 set2      #交集

sunion set1 set2      #並集

sdiff set1 set2      #差集

2.4.哈希操作

(1)添加一個新值

hset key field value

hset person name derek

將哈希表key中的域field的值設爲value。如果key不存在,一個新的哈希表被創建並進行HSET操作。如果域field已經存在哈希表中,舊值將被覆蓋。

(2)獲取哈希中的field對應的值

hget person name

(3)刪除field中的某個field

hdel person name

(4)獲取某個哈希中所有的field和value

hgetall person

(5)獲取某個哈希中所有的field

hkeys person

(5)獲取某個哈希中所有的值

hvals person

(6)判斷哈希中是否存在某個field

hexists person name

(7)一次設多個

hmset person name derek age 18 hight 175

(8)長度

hlen person 

2.5.事務操作

redis事務可以一次執行多個命令,事務具有以下特徵:

  • 隔離操作:事務中的所有命令都會序列化,按順序執行,不會被其它命令打擾。
  • 原子操作:事務中的命令要麼全部被執行,要麼全部不執行。

(1)開啓一個事務

multi

以後執行的所有命令,都將在這個事務中執行。

(2)執行事務

exec

會將在multi和exec中的操作一併提交

(3)取消事務

discard

會將multi後的所有命令取消

(4)監視一個或者多個key

watch key .......

監視一個或多個key,如果在事務執行之前這個key被其它命令所改動,那麼事務將被打斷。

(5)取消所有key的監視

unwatch

2.6.發佈和訂閱

(1)給某個頻道發佈消息

publish channel message

(2)訂閱某個頻道的消息

subscribe channel

三、RDB和AOF的兩種數據持久化機制

 RDB同步機制

  • 開啓和關閉:默認情況下是開啓了,如果想關閉,那麼註釋掉“redis.conf”文件中的所有“safe”選項就可以了
  • 同步機制:save 900 1 如果在900s以內發生了一次數據跟新操作,那麼就會做一次同步操作;還有兩種機制:save 300 10;  save 60 10000
  • 存儲內容:存儲的是具體的值,並且是經過壓縮後存儲進去的。
  • 存儲路徑:根據“redis.conf”下的dir以及‘rdbfilename’來制定的,默認是 /var/lib/redis/dump.rdb
  • 優點:1.存儲數據到文件中會進行壓縮,文件體積比AOF小;2.因爲存儲的是redis具體的值,並且經過壓縮,因此在回覆的時候速度比AOF快;3.非常實用於備份。
  •  缺點:1.RDB在多少時間內發生了多少寫操作的時候就會觸發同步機制,因爲採用壓縮機制,RDB在同步的時候都重新保存整個redis中的數據,因此一般會設置在最少5分鐘才保存一次數據。在這種情況下,一單服務器故障,會造成5分鐘的數據丟失。

 AOF同步機制

  • 開啓和關閉:默認是關閉的。如果想開啓,那麼修改redis.conf中的‘appendonly yes’ 就可以了
  • 同步機制:1.appendfsync always:每次有數據更新操作,都會同步到文件中;2.appendfsync everysec:每秒進行一次更新;3.appendfsync no:30s更新一次(採用默認的)
  • 存儲內容:存儲的是具體的命令,不會進行壓縮。
  • 存儲路徑:根據redis.conf下的dir以及appendfilename來指定的。默認是 /var/lib/redis/appendonly.aof
  • 優點:1.AOF的策略是每秒鐘或者每次發生寫操作的時候都會同步,因此即使服務器故障,最對只會丟失1秒的數據;2.AOF存儲的是redis的命令,並且是直接追加到aof文件後面,因此每次備份的時候只要添加新的數據進去就可以了。3.如果AOF文件比較大了,那麼redis會進行重寫,只保留最小的命令集合。
  • 缺點:1.AOF文件因爲沒有壓縮,因此體積比AOF大;2.AOF是在每秒或者每次寫操作都進行備份,因此如果併發量比較大,效率可能有點慢;3,AOF文件因爲存儲的是命令,因此在災難恢復的時候redis會重新運行AOF中的命令,速度不及RDB。

四、設置redis的連接密碼

 (1)設置密碼

  vim /etc/redis.conf 

打開配置文件,然後按“/”搜索“requirepass”,再按‘n’找到‘requirepass password’,取消註釋,在後面加上要設置的密碼 requirepass password 123456.

(2)本地連接

redis-cli -p 6379 -h 127.0.0.1 -a 123456

可以在連接的時候,通過‘-a’參數指定密碼進行連接,也可以先登錄上去,然後再使用‘auth password’命令進行授權。

 (3)其它機器連接redis

 如果想讓其它機器連接本機的redis服務器,那麼應該在‘redis.conf’配置文件中,指定“bind 本機的ip地址”,這樣別的機器就能連接成功了。

vim /etc/redis.conf

按‘/’搜索‘bind’,後面指定自己機器的ip

五、python操作redis

 (1)安裝

pip install redis

(2)連接

from redis import redis

cache = Redis(host="139.199.131.146",port=6379,password=123456)

(3)字符串操作

cache.set('uers','derek')

cache.get('users')

cache.delete('users')

(4)列表操作

cache.lpush('users','tom')

print(cache.lrange('users',0,-1))

(5)集合的操作

cache.sadd('group','CEO')

print(cache.smembers('group'))

(6)哈希的操作

cache.hset('person','name','derek')

print('cache.hgetall('person')')

(7)事務的操作

pip = cache.pipeline()
pip.set('username','derek')
pip.set('password','123456')
pip.execute()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章