파이썬코딩

NoSQL 데이터 저장소

일부 데이터베이스는 관계형 데이터베이스가 아니므로 SQL을 지원하지 않습니다. 이는 매우 큰 데이터 세트를 처리하거나, 보다 유연한 데이터 정의를 허용하거나, 사용자 지정 데이터 작업을 지원하기 위해 작성되었습니다. 이들은 집합적으로 NoSQL(이전에는 SQL이 없었으나 이제는 SQL뿐만 아니라 덜 대립한다는 의미)로 분류되었습니다.

 

dbm 제품군

DBM 포맷은 NoSQL이 만들어지기 훨씬 전에 존재했다. 키 밸류 스토어로, 웹 브라우저와 같은 응용 프로그램에 내장되어 다양한 설정을 유지합니다. DBM 데이터베이스는 다음과 같은 면에서 파이썬 사전과 같습니다.

• 키에 값을 할당할 수 있으며, 자동으로 디스크에 있는 데이터베이스에 저장됩니다. • 키에서 값을 얻을 수 있습니다.

다음은 간단한 예입니다. 다음 open() 메서드에 대한 두 번째 인수는 읽으려면 'r', 쓰려면 'w', 둘 다의 경우 'c'로 파일이 존재하지 않을 경우 파일을 만듭니다.

 

>>> import dbm
>>> db = dbm.open('definitions', 'c') 

키-값 쌍을 만들려면 사전과 마찬가지로 키에 값을 할당하면 됩니다.

 

>>> db['mustard'] = 'yellow'

    >>> db['ketchup'] = 'red'

    >>> db['pesto'] = 'green'

 

잠시 멈추고 지금까지 보여드린 내용을 확인해 보겠습니다.

 

 >>> len(db)

    3

    >>> db['pesto']

    b'green'

 

닫았다가 다시 열어 실제로 저장했는지 확인합니다.

 

 >>> db.close()

    >>> db = dbm.open('definitions', 'r')

    >>> db['mustard']

    b'yellow'

 

키와 값은 바이트로 저장됩니다. 데이터베이스 오브젝트 DB를 반복할 수는 없지만 len()을 사용하여 키 수를 얻을 수 있습니다. 사전에서와 같이 get() 및 setdefault()가 작동합니다.

 

Memcached 

memcached는 빠른 메모리 내 키 값 캐시 서버입니다. 종종 데이터베이스 앞에 놓이거나 웹 서버 세션 데이터를 저장하는 데 사용됩니다. Linux 및 OS X용 및 Windows용 버전을 다운로드할 수 있습니다. 이 섹션을 사용하려면 memcached 서버와 Python 드라이버가 필요합니다.

Python 드라이버에는 여러 가지가 있습니다. Python 3에서 작동하는 드라이버는 python3 memcached이며 다음 명령을 사용하여 설치할 수 있습니다.

 

$ pip install python-memcached

이를 사용하려면 memcached 서버에 연결하고, 그런 다음 다음을 수행할 수 있습니다.

• 키 값 설정 및 가져오기

• 값의 증가 또는 감소

• 키 삭제

데이터가 영구적이지 않고 이전에 작성한 데이터가 사라질 수 있습니다. 이것은 memcached에 내재되어 있습니다. 캐시 서버이기 때문입니다. 오래된 데이터를 카드화하여 메모리 부족을 방지합니다.

여러 memcached 서버에 동시에 연결할 수 있습니다. 다음 예에서는 같은 컴퓨터에 있는 사람과 대화하고 있습니다.

 

>>> import memcache
>>> db = memcache.Client(['127.0.0.1:11211']) >>> db.set('marco', 'polo')
True
>>> db.get('marco')
'polo'
>>> db.set('ducks', 0)
True
>>> db.get('ducks')
0
>>> db.incr('ducks', 2)
2
>>> db.get('ducks')
2 

레디스

Redis는 데이터 구조 서버입니다. memcached와 마찬가지로 Redis 서버의 모든 데이터는 메모리에 맞아야 합니다(데이터를 디스크에 저장할 수 있는 옵션이 있습니다). memc ac aced와 달리 Redis는 다음을 수행할 수 있습니다.

• 안정성 및 재시작을 위해 데이터를 디스크에 저장

• 이전 데이터 유지

• 단순한 문자열보다 더 많은 데이터 구조 제공

Redis 데이터 유형은 Python과 거의 일치하며, Redis 서버는 하나 이상의 Python 애플리케이션이 데이터를 공유하는 데 유용한 매개체가 될 수 있다. 나는 그것이 매우 유용하다는 것을 알았기 때문에 여기에서 약간의 추가 커버리지를 할 가치가 있다.

파이썬 드라이버 redis-py는 온라인 문서뿐만 아니라 GitHub에 소스 코드와 테스트를 가지고 있다. 다음 명령을 사용하여 설치할 수 있습니다.

 

  • $ pip install redis
  • Redis 서버 자체의 설명서가 좋습니다. 로컬 컴퓨터에 네트워크 닉네임 localhost를 사용하여 Redis 서버를 설치하고 시작하는 경우 다음 섹션에서 pro ing을 사용할 수 있습니다.

 

 

  • Strings 
  • 단일 값을 갖는 키는 Redis 문자열입니다. 간단한 파이썬 데이터 유형이 자동으로 
  • 변환됩니다. 일부 호스트(기본값: localhost) 및 포트(de 오류: 6379)에서 Redis 
  • 서버에 연결합니다.
  • >>> import redis
  • >>> conn = redis.Redis()
  • redis.Redis('localhost') 또는 redis.Redis('localhost', 6379)도 같은 결과를 냈을 것이다.

모든 키 나열(현재 없음):

  >>> conn.keys('*')

    []

 

단순 문자열(키 'secret', 정수(키 '캐럿') 및 플로트(키 'fever') 설정:

 

  >>> conn.set('secret', 'ni!')

    True

    >>> conn.set('carats', 24)

    True

    >>> conn.set('fever', '101.5')

    True

 

키로 값을 다시 가져옵니다.

 

  >>> conn.get('secret')

    b'ni!'

    >>> conn.get('carats')

    b'24'

    >>> conn.get('fever')

    b'101.5'

 

여기서 setnx() 메서드는 키가 없는 경우에만 값을 설정합니다.

 

>>> conn.setnx('secret', 'icky-icky-icky-ptang-zoop-boing!') 

False 

이미 '비밀'을 정의했기 때문에 실패했습니다.

 

>>> conn.get('secret') 

b'ni!'

getset() 메서드는 이전 값을 반환하고 동시에 새 값으로 설정합니다.

 

 >>> conn.getset('secret', 'icky-icky-icky-ptang-zoop-boing!')

    b'ni!'

 

너무 앞서가지 맙시다. 효과가 있던가요?

  >>> conn.get('secret')

    b'icky-icky-icky-ptang-zoop-boing!'

 

이제 getrange()를 사용하여 하위 문자열을 가져옵니다(파이썬에서와 같이 오프셋 0=start, -1=end).

 

>>> conn.getrange('secret', -6, -1) 

b'boing!'

setrange()를 사용하여 하위 문자열을 교체합니다(영점 기반 오프셋 사용).

 

   >>> conn.setrange('secret', 0, 'ICKY')

    32

    >>> conn.get('secret')

    b'ICKY-icky-icky-ptang-zoop-boing!'

 

그런 다음 mset()을 사용하여 여러 키를 한 번에 설정합니다.

 

    >>> conn.mset({'pie': 'cherry', 'cordial': 'sherry'})

    True

 

mget()을 사용하여 두 개 이상의 값을 동시에 가져옵니다.

 

>>> conn.mget(['fever', 'carats']) 

[b'101.5', b'24']

삭제()를 사용하여 키 삭제:

 

  >>> conn.delete('fever')

    True

 

incr() 또는 incrbyfloat() 명령을 사용하여 증가시키고 decr()을 사용하여 감소시킵니다.

 

  >>> conn.incr('carats')

    25

    >>> conn.incr('carats', 10)

    35

    >>> conn.decr('carats')

    34

    >>> conn.decr('carats', 15)

    19

    >>> conn.set('fever', '101.5')

    True

    >>> conn.incrbyfloat('fever')

    102.5

    >>> conn.incrbyfloat('fever', 0.5)

    103.0

 

디크르비플로트가 없습니다. 열을 낮추려면 음의 증분을 사용합니다.

 

>>> conn.incrbyfloat('fever', -2.0) 

101.0 

목록

재지정 목록에는 문자열만 포함할 수 있습니다. 이 목록은 처음 삽입할 때 작성됩니다. lpush()를 사용하여 처음에 삽입합니다.

 

    >>> conn.lpush('zoo', 'bear')

    1

 

처음에 두 개 이상의 항목을 삽입합니다.

 >>> conn.lpush('zoo', 'alligator', 'duck')

    3

삽입()을 사용하여 값 앞 또는 뒤에 삽입:

 >>> conn.linsert('zoo', 'before', 'bear', 'beaver')

    4

    >>> conn.linsert('zoo', 'after', 'bear', 'cassowary')

    5

lset()을 사용하여 오프셋에 삽입(목록이 이미 존재해야 함):

>>> conn.lset('zoo', 2, 'marmoset') 

True 

rpush()를 사용하여 끝에 삽입합니다.

 

>>> conn.rpush('zoo', 'yak') 

6 

lindex()를 사용하여 오프셋의 값을 가져옵니다.

>>> conn.lindex('zoo', 3) 

b'bear'

lrange()(0 ~ -1)를 사용하여 오프셋 범위의 값을 가져옵니다.

 

   >>> conn.lrange('zoo', 0, 2)

    [b'duck', b'alligator', b'marmoset']

 

ltrim()으로 목록을 트리밍하고 오프셋 범위에만 유지합니다.

>>> conn.ltrim('zoo', 1, 4) 

True 

lrange()를 사용하여 값의 범위를 가져옵니다(모두에 대해 0 ~ -1 사용).

 

>>> conn.lrange('zoo', 0, -1) 

[b'alligator', b'marmoset', b'bear', b'cassowary']

이 장에서는 Redis 목록과 게시-구독을 사용하여 구현할 수 있는 방법을 보여줍니다.

작업 대기열

 

Hashes 

Redis 해시는 Python 사전과 유사하지만 문자열만 포함할 수 있습니다. 그러므로, 여러분은 깊은 내피 구조를 만들 수 없고 오직 한 단계만 깊이 들어갈 수 있습니다. 다음은 노래라는 Redis 해시를 만들고 재생하는 예입니다.

hmset()을 사용하여 해시 송에서 do 및 re 필드를 한 번에 설정합니다.

 

>>> conn.hmset('song', {'do': 'a deer', 're': 'about a deer'}) 

True 

 

hset()을 사용하여 해시의 단일 필드 값을 설정합니다.

>>> conn.hset('song', 'mi', 'a note to follow re') 

1 

hget()을 사용하여 필드 값 가져오기:

 

>>> conn.hget('song', 'mi') 

b'a note to follow re'

hmget()을 사용하여 여러 필드 값을 가져옵니다.

 

  >>> conn.hmget('song', 're', 'do')

    [b'about a deer', b'a deer']

 

hkeys()를 사용하여 해시의 모든 필드 키를 가져옵니다.

 

>>> conn.hkeys('song') 

[b'do', b're', b'mi']

hval()을 사용하여 해시의 모든 필드 값을 가져옵니다.

 

  >>> conn.hvals('song')

    [b'a deer', b'about a deer', b'a note to follow re']

 

hlen()을 사용하여 해시의 필드 수를 가져옵니다.

 

>>> conn.hlen('song') 

3 

hgetall()을 사용하여 해시의 모든 필드 키 및 값을 가져옵니다.

 

>>> conn.hgetall('song') 

{b'do': b'a deer', b're': b'about a deer', b'mi': b'a note to follow re'} 

hsetnx()를 사용하여 해당 키가 없는 필드를 설정합니다.

 

 >>> conn.hsetnx('song', 'fa', 'a note that rhymes with la')

    1