redis的使用

1、簡介

1.1 概念

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

1.2 使用場景

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

2、對redis的操做

2.1 字符串操做(string)

(1)添加mysql

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

set key value

(2)設置鍵值及過時時間,以秒爲單位sql

setex key seconds value

(3)設置多個鍵值數據庫

mset key1 value1 key2 value2 ...

(4)追加值django

append key value

(5)獲取vim

get key

(6)獲取多個鍵獲取多個值緩存

mget key1 key2 ...

(7)刪除服務器

del username

 2.2 鍵key操做

(1)查看全部鍵session

keys *

(2)查看名稱中包含a的鍵

keys 'a*'

(3)判斷鍵是否存在,若是存在返回1,不存在返回0

exists key1

(4)刪除鍵及對應的值

del key1 key2 .

(5)設置過時時間,以秒爲單位

expire key seconds

(6)查看有效時間,以秒爲單位

ttl key

2.2 哈希操做(hash)

(1)設置單個屬性

hset key field value

(2)設置多個屬性

hmset key field1 value1 field2 value2 ..

(3)獲取指定鍵全部的屬性

hkeys key

(4)獲取⼀個屬性的值

hget key field

(5)獲取多個屬性的值

hmget key field1 field2 

(6)獲取全部屬性的值

hvals key

(7)刪除整個hash鍵及值,使⽤del命令

hdel key field1 field2 ...

2.3 列表操做(list)

(1)在左側插⼊數據

lpush key value1 value2 ...

(2)在右側插⼊數據

rpush key value1 value2 ...

(3)在指定元素的前或後插⼊新元素

linsert key before或after 現有元素 新元素

(4)返回列表⾥指定範圍內的元素

  • start、stop爲元素的下標索引
  • 索引從左側開始,第⼀個元素爲0
  • 索引能夠是負數,表示從尾部開始計數,如-1表示最後⼀個元素
lrange key start stop

(5)設置指定索引位置的元素值

  • 索引從左側開始,第⼀個元素爲0
  • 索引能夠是負數,表示尾部開始計數,如-1表示最後⼀個元素
lset key index value

(6)刪除指定元素

  • 將列表中前count次出現的值爲value的元素移除
  • count > 0: 從頭往尾移除
  • count < 0: 從尾往頭移除
  • count = 0: 移除全部
lrem key count value

2.4 集合操做(set)

說明:對於集合沒有修改操做

(1)添加元素

sadd key member1 member2 ...

(2)獲取全部的元素

smembers key

(3)刪除指定元素

srem key

2.5 zset類型

  • sorted set,有序集合
  • 元素爲string類型
  • 元素具備惟⼀性,不重複
  • 每一個元素都會關聯⼀個double類型的score,表示權重,經過權重將元素從⼩到⼤排序
  • 說明:沒有修改操做

(1)添加

zadd key score1 member1 score2 member2 ...

(2)獲取

  • 返回指定範圍內的元素
  • start、stop爲元素的下標索引
  • 索引從左側開始,第⼀個元素爲0
  • 索引能夠是負數,表示從尾部開始計數,如-1表示最後⼀個元素

zrange key start stop

(3)返回score值在min和max之間的成員

zrangebyscore key min max

(4)返回成員member的score值

zscore key member

(5)刪除指定元素

zrem key member1 member2 ...

(6)刪除權重在指定範圍的元素

zremrangebyscore key min max

2.6 事物操做

redis事務能夠一次執行多個命令,事務具備如下特徵:

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

(1)開啓一個事務

multi

之後執行的全部命令,都將在這個事務中執行。

(2)執行事務

exec

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

(3)取消事務

discard

會將multi後的全部命令取消

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

watch key .......

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

(5)取消全部key的監視

unwatch

3、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。

4、設置redis的鏈接密碼

(1)設置密碼

  vim /etc/redis.conf 

打開配置文件,而後按「/」搜索「requirepass」,再按‘n’找到‘requirepass xxxxx’,取消註釋,在後面加上要設置的密碼 requirepass 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

5、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()

django存儲session

  • 以前django的session默認是存在的數據庫裏面的,咱們也能夠把session存儲在redis裏面
pip install django-redis-sessions==0.5.6
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 2
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'
相關文章
相關標籤/搜索