일부 데이터베이스는 관계형 데이터베이스가 아니므로 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