1. 程式人生 > >python通過redis-py,redisco操作redis

python通過redis-py,redisco操作redis

1.安裝redis

1.1、準備部分:

什麼是redis?

Redis是REmote DIctionary Server的縮寫。一個非關係型資料庫

為什麼要用redis?

1, 因為redis快,Redis is pretty fast!, 110000 SETs/second, 81000 GETs/second

2, 省去了複雜的SQL。

3, 可以省去memcache了。

1.2、下載,解壓和編譯:

$ wget http://redis.googlecode.com/files/redis-2.6.13.tar.gz
$ tar xzf redis-2.6.13.tar.gz
$ cd redis-2.6.13
$ make

為什麼沒用標準的Linux安裝三板斧呢?官方維基是這樣說的:Redis can run just fine without a configuration file (when executed without a config file a standard configuration is used). With thedefault configuration Redis will log to the standard output so you can check what happens. Later, you canchange the default settings.

1.3、執行redis

編譯的可執行檔案在src目錄中,使用以下命令執行Redis:

$ src/redis-server

1.4、連線Redis

你可以用內建客戶端連線Redis:

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

1.5、配置redis

在執行redis前,我們要配置一下。redis的配置檔案在你的安裝目錄裡。名為:redis.conf。

簡單說幾點redis.conf:

redis預設不是用守護程序的,如果需要更改,把daemonize no改成daemonize yes。(測試的時候可以不改,看看列印資訊。)

如果對redis預設6379埠不爽的,可以更改port 6379

如果想把資料檔案放到一個指定資料夾,更改dir /opt/data/

預設是dir ./ 也就是預設放到安裝目錄下。

連線超時時間,timeout 300,沒什麼改頭……

dir 是資料檔案路徑。預設在安裝目錄下。

*下面的配置二選一,詳見本文註釋部分2。

###### SNAPSHOTTING ######記憶體快照方式:

預設的記憶體快照策略是,

在900秒(15分鐘)內,至少有1次資料變更;

或者300秒內,有至少10次資料變更;

或者60秒內,有至少1000次資料變更;時間+資料變更次數,共同影響記憶體快照的出現。

###### APPEND ONLY MODE ###### AOF方式

appendfsync everysec 每秒同步。這裡可以註釋掉,開啟下面的選項appendfsync no

其餘的配置,conf裡面的註釋寫的挺清楚,我就不多廢話了。大家看著自己配就行了。

註釋:

▲redis的預設埠號是6379,(據redis的作者antirez的博文說,6379在是手機按鍵上MERZ對應的號碼,而MERZ取自義大利歌女Alessia Merz的名字。而MERZ長期以來被antirez及其朋友當作愚蠢的代名詞。)

▲Redis有兩種儲存方式,預設是snapshot方式,實現方法是定時將記憶體的快照(snapshot)持久化到硬碟,這種方法缺點是持久化之 後如果出現crash則會丟失一段資料。因此在完美主義者的推動下作者增加了aof方式。aof即append only mode,在寫入記憶體資料的同時將操作命令儲存到日誌檔案。

參考:

nosql發燒友集散地:

http://blog.nosqlfan.com

redis認識的幾個誤區:

http://blog.nosqlfan.com/html/868.html

借鑑:

http://shopscor.javaeye.com/blog/792817

2.安裝redis-py

執行

   開啟Python直譯器:

>>> import redis
>>> r = redis.Redis(host='localhost', port=6379, db=0)   #如果設定了密碼,就加上password=密碼
>>> r.set('foo', 'bar')   #或者寫成 r['foo'] = 'bar'
True
>>> r.get('foo')   
'bar'
>>> r.delete('foo')
True
>>> r.dbsize()   #庫裡有多少key,多少條資料
0
>>> r['test']='OK!'

>>> r.save()   #強行把資料庫儲存到硬碟。儲存時阻塞
True

--------------------------------

>>> r.flushdb()   #刪除當前資料庫的所有資料
True

 >>> a = r.get('chang')
>>> a    # 因為是Noen物件,什麼也不顯示!
>>> dir(a)   
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

>>> r.exists('chang')  #看是否存在這個鍵值
False

>>> r.keys()   # 列出所有鍵值。(這時候已經存了4個了)
['aaa', 'test', 'bbb', 'key1']

import redis r = redis.Redis(host=’localhost’, port=6379, db=0) r['test'] = ‘test’ #或者可以r.set(‘test’, ‘test’) 設定key r.get(‘test’)  #獲取test的值 r.delete(‘test’) #刪除這個key r.flushdb() #清空資料庫 r.keys() #列出所有key r.exists(‘test’) #檢測這個key是否存在 r.dbsize() #資料庫中多少個條數

附註A:

來看一下redis.Redis的 init() 函式定義:

 __init__(self, host='localhost', port=6379, db=0, password=None, socket_timeout=None, connection_pool=None, charset='utf-
8', errors='strict', decode_responses=False, unix_socket_path=None)

最新的redis 2.6.0加入了連線池,具體用法可以看作者部落格。

 附註B:

其他命令API,請參照redis-Python作者的部落格,寫的挺清楚了:

https://github.com/andymccurdy/redis-py

3.redisco

redisco:

1)純pyhton開發而成,你可以直接看它的原始碼(github地址:https://github.com/iamteem/redisco).

2) 帶有redis的所有功能,因為它是基於redis這個官方的庫上開發而成的.

3) 可以以django自帶orm的方式將資料存入redis,並且提供了大多數和django的orm相同的查詢功能.

其實我主要就是要介紹上面的第三點,redisco的 model(django裡也叫著名字)類,它提供的這種能讓資料以類似python內部的dict或者class的形式儲存到redis裡,這樣我們對 redis的使用就接近nosql資料庫了(因為redis自帶持久化儲存的功能)。

手把手教程範例教程開始:

建立一個你要存進redis的模型,你可以理解為是mysql裡的表,需要繼承models.Model類

Python程式碼   收藏程式碼
  1. from redisco import models  
  2. class Person(models.Model):  
  3.     name = models.Attribute(required=True)  
  4.     created_at = models.DateTimeField(auto_now_add=True)  
  5.     fave_colors = models.ListField(str)  

類裡面支援的所有資料型別如下:


Model Attributes

Attribute Stores unicode strings. If used for large bodies of text, turn indexing of this field off by setting indexed=True. IntegerField Stores an int. Ints are stringified using unicode() before saving to Redis. Counter An IntegerField that can only be accessed via Model.incr and Model.decr. DateTimeFieldCan store a DateTime object. Saved in the Redis store as a float. DateField Can store a Date object. Saved in Redis as a float. FloatField Can store floats. BooleanField Can store bools. Saved in Redis as 1's and 0's. ReferenceField 可以引用其他的model.Model類,比如可以在一個通訊錄類裡增加一個欄位它的型別是人物這個類他們都繼承model.Model類但可以互相引用這樣你就可以直接通過 通訊錄.人物這樣的方式呼叫(之後的文章會詳細介紹) ListField 列表型別,使用跟python的list一樣可以將 python裡的unicode, int, float和其他redisco.model類放進去 生成一個Person類的資料
 >>person = Person(name="hupu")

   因為name是必填欄位所以必須要給

  然後 呼叫save方法就儲存到redis裡去了。

>>person.save()
True

返回True就是成功了。

查詢剛剛存進去的資料,跟django的orm真的很像

>>conchita = Person.objects.filter(name='hupu')[0]

查詢所有的Person

>> all_person = Person.objects.all()

查詢age大於某5歲

>> all_person = Person.objects.zfilter(age__gt=5)            小於 就是 欄位名__lt 範圍 就是 欄位名__in=(0,5)

查詢範圍的都是一個list別忘了[0] 來獲得一個結果

最後提一點,redisco.model.Model類儲存資料時,對於除了Counter型別以外的所有型別欄位有更改比如 person.age = 5 將年齡改為5 都要呼叫person.save()方法才能更改成功。

更多的功能可以看它的測試程式碼裡的例子https://github.com/iamteem/redisco/blob/master/tests/models.py 和 https://github.com/iamteem/redisco  首頁的文件。

4.test

在Python下一般使用redis-py, 或者在此基礎上的redisco;

測試環境:

在100Mb/s 區域網

伺服器: redis 2.4 rc8/rhel6.0

客戶端:Python2.7.2/Win7

01 01  importdatetime
02 02  
03 03  deftest1(string):
04 04      importredis
05 05      r=redis.StrictRedis(host='211.69.*', port=6379, db=1)
06 06      now=datetime.datetime.now()
07 07      foriinrange(0,10000):
08 08          r.set(i, string)
09 09      printdatetime.datetime.now()-now  
10 10  
11 11  deftest2(string):
12 12      importredisco
13 13      fromredisco.containersimportHash,List,SortedSet,Set
14 14      r=redisco.connection_setup(host='211.69.*', port=6379, db=1)
15 15      h=Hash("h")
16 16      now=datetime.datetime.now()
17 17      foriinrange(0,10000):
18 18          h[i]=string
19 19      printdatetime.datetime.now()-now
20 20      
21 21  if __name__=="__main__":
22 22      string="0"
23 23      test1(string)
24 24      test2(string)

結果:CPU不是瓶頸,大約1000寫操作/s,比傳輸中的10W差的遠了,看來網路IO是不小的瓶頸。而且不在於傳輸的資料量,而在於操作次數

redis配置

下面是抄過來的配置解釋:

redis.conf配置選項如下:


daemonize 是否以後臺程序執行,預設為no
pidfile 如以後臺程序執行,則需指定一個pid,預設為/var/run/redis.pid
bind 繫結主機IP,預設值為127.0.0.1(註釋)
port 監聽埠,預設為6379
timeout 超時時間,預設為300(秒)
loglevel 日誌記錄等級,有4個可選值,debug,verbose(預設值),notice,warning
logfile 日誌記錄方式,預設值為stdout
databases 可用資料庫數,預設值為16,預設資料庫為0
save <seconds> <changes> 指出在多長時間內,有多少次更新操作,就將資料同步到資料檔案。這個可以多個條件配合,比如預設配置檔案中的設定,就設定了三個條件。
save 900 1

900秒(15分鐘)內至少有1個key被改變 
save 300 10300秒(5分鐘)內至少有300個key被改變 
save 60 1000060秒內至少有10000個key被改變 
rdbcompression 儲存至本地資料庫時是否壓縮資料,預設為yes 
dbfilename 本地資料庫檔名,預設值為dump.rdb 
dir 本地資料庫存放路徑,預設值為 ./ 
slaveof <masterip> <masterport> 當本機為從服務時,設定主服務的IP及埠(註釋) 
masterauth <master-password> 當本機為從服務時,設定主服務的連線密碼(註釋) 
requirepass 連線密碼(註釋) 
maxclients 最大客戶端連線數,預設不限制(註釋) 
maxmemory <bytes> 設定最大記憶體,達到最大記憶體設定後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理後,任到達最大記憶體設定,將無法再進行寫入操作。(註釋) 
appendonly 是否在每次更新操作後進行日誌記錄,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為redis本身同步資料檔案是按上面save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設值為no 
appendfilename 更新日誌檔名,預設值為appendonly.aof(註釋) 
appendfsync 更新日誌條件,共有3個可選值。no表示等作業系統進行資料快取同步到磁碟,always表示每次更新操作後手動呼叫fsync()將資料寫到磁碟,everysec表示每秒同步一次(預設值)。 
vm-enabled 是否使用虛擬記憶體,預設值為no 
vm-swap-file 虛擬記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis例項共享 
vm-max-memory 將所有大於vm-max-memory的資料存入虛擬記憶體,無論vm-max-memory設定多小,所有索引資料都是記憶體儲存的(Redis的索引資料 就是keys),也就是說,當vm-max-memory設定為0的時候,其實是所有value都存在於磁碟。預設值為0。 

#當dump.rdb資料庫的時候是否壓縮資料物件 
rdbcompression yes 
#dump資料庫的資料儲存的檔名 
dbfilename dump.rdb 
#Redis的工作目錄 
dir /var/lib/redis/ 
###########Replication ##################### 
#Redis的複製配置 
# slaveof <masterip> <masterport> 
# masterauth <master-password> 

############## SECURITY ########### 
# requirepass foobared 

############### LIMITS ############## 
#最大客戶端連線數 
maxclients 128 
#最大記憶體使用率 
maxmemory <bytes> 

########## APPEND ONLY FILE MODE ######### 
#是否開啟日誌功能 
appendonly no 
# 重新整理日誌到disk的規則 
# appendfsync always 
appendfsync everysec 
# appendfsync no 
################ VIRTUAL MEMORY ########### 
#是否開啟VM功能 
vm-enabled no 
# vm-enabled yes 
vm-swap-file logs/redis.swap 
vm-max-memory 0 
vm-page-size 32 
vm-pages 134217728 
vm-max-threads 4 
############# ADVANCED CONFIG ############### 
glueoutputbuf yes 
hash-max-zipmap-entries 64 
hash-max-zipmap-value 512 
#是否重置Hash表 
activerehashing yes 

Redis官方文件對VM的使用提出了一些建議: 當你的key很小而value很大時,使用VM的效果會比較好.因為這樣節約的記憶體比較大. 當你的key不小時,可以考慮使用一些非常方法將很大的key變成很大的value,比如你可以考慮將key,value組合成一個新的value. 最好使用linux ext3 等對稀疏檔案支援比較好的檔案系統儲存你的swap檔案. vm-max-threads這個引數,可以設定訪問swap檔案的執行緒數,設定最好不要超過機器的核數.如果設定為0,那麼所有對swap檔案的操作都 是序列的.可能會造成比較長時間的延遲,但是對資料完整性有很好的保證.

相關推薦

python通過redis-py,redisco操作redis

1.安裝redis 1.1、準備部分: 什麼是redis? Redis是REmote DIctionary Server的縮寫。一個非關係型資料庫 為什麼要用redis? 1, 因為redis快,Redis is pretty fast!, 110000 S

php安裝redis擴充套件及操作redis

                        &nbs

spring-boot-starter-data-redis(spring cloud 操作redis) RedisTemplate

入門: 引入依賴: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis&

安裝redis-py並連線Redis伺服器設定和獲取redis的二進位制資料

本文件簡單介紹一下使用python版的Redis客戶端redis-py來連線Redis並執行設定和獲取redis的二進位制資料。 說明: set,get,setnx,append等命令同樣也可以用於設定二進位制資料。 因為Redis的自帶的客戶端redis-cli不方便設

java配置Redis ,java操作redis

如果不是maven專案那麼需要下載兩個jar包文章最最下面我會附上百度盤 提供下載package com.redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; impor

python操作三大主流資料庫(12)python操作redis的api框架redis-py簡單使用

#coding:utf-8 import redis class Base(object): def __init__(self): self.r = redis.StrictRedis(host = 'localhost', port=6379, db=0) class St

redis學習一 (key)鍵,Python操作redis

lpad ren redis key lee 設置 amp res 列表 pex # -*- coding: utf-8 -*- import redis #這個redis 連接不能用,請根據自己的需要修改 r =redis.Redis(host="123.516.174

Python 操作 Redis

中移動 超時時間 替換 itl 類型 str gre too mon Python操作redis   下面介紹詳細使用 1、String 操作   redis中的String在在內存中按照一個name對應一個value來存儲 set() #在Redis

python操作redis

python redis nosql 非關系型數據庫和關系型數據庫的差別:非關系型數據庫的優勢:1. 性能NOSQL是基於鍵值對的,可以想象成表中的主鍵和值的對應關系,而且不需要經過SQL層的解析,所以性能非常高。2. 可擴展性同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。關系

python操作redis之String操作

lis class 選擇 錯誤 post range nihao name 定義 # __author__ = ‘STEVEN‘ import redis,time # 方式1,直接鏈接操作 # r = redis.Redis(host=‘192.168.43.22‘,p

python操作redis數據庫(非關系型數據庫,k-v)

都是 ont sql 失效 font cal post nan 所有 數據庫: 1. 關系型數據庫 表結構 2. 非關系型數據庫 nosql (k - v 速度快),常用的時以下三種: memcache 存在內存裏 redis 存在內存裏 mangod

Python-Redis的String操作

john red pytho log light name gpo nbsp 覆蓋 Ubuntu安裝Redis sch01ar@ubuntu:~$ sudo apt install redis-server sch01ar@ubuntu:~$ redis-server

Python-Redis的Set操作

javascrip des store 排行 scrip ber with true art 集合為不重復的列表 無序集合 sadd(name,values):在name對應的集合中添加元素 smembers(name):獲取name對應的集合的所有成員 127.0.0.

python(十二)python操作redis

mysq 配置文件 遊標 edi 參數 字典 PE 增值 pass 1、python要操作redis 首先需要安裝redis模塊,然後導入才能使用 安裝:pip install redis 導入:import redis 2、連接redis

redis python 操作 Python操作Redis數據庫

iss cape 否則 ets start 從大到小 china 過期 link 原文章於此:https://www.cnblogs.com/cnkai/p/7642787.html 有個人修改與改正 連接數據庫 StrictRedisfrom redis i

python操作redis--------------數據庫增刪改查

import host 14. ont color 字符串 font 模塊 第三方 安裝第三方模塊redis import redis 一.連接數據庫,操作增刪改查 1.連接數據 (1).host必填 服務器IP(2).端口號默認的事6379,可以不填寫,如果改成其他端口

操作redis的函數python

進制 理解 imp ict map 失效 pytho 連接 ()   redis是一個key-value結構的數據庫,value的格式可以是string,set(),list,map集合(即python裏面的dict),sorted set(有序集合) 1、連接redis數

pythonredis的基本操作

set pytho ctr def aof 處理 ict local odin #coding:utf8from redis import StrictRedis"""定義一個處理redis的類"""class O

在centos7中安裝redis,並通過node.js操作redis

lease eply 準備 事件 tput div channel cli state 引言 最近在學習node.js 連接redis的模塊,所以嘗試了一下在虛擬機中安裝cent OS7,並安裝redis,並使用node.js 操作redis。所以順便做個筆記。 如有不對的

Anaconda 安裝redis-py模塊操作redis數據庫

不同 是什麽 文件 sta 過程 span python 相同 如果 今天遇到了一個很神奇的事情 ,在使用python操作redis 數據庫的時候 ,如果使用 pip install redis 安裝的是python 連接 redis的模塊, 但是如果是在anac