Redis
 sql >> база данни >  >> NoSQL >> Redis

Постоянен обект на Python в паметта за nginx/uwsgi сървър

Това, което предлагате, не е директно осъществимо. Тъй като новите процеси могат да се въртят нагоре и надолу извън вашия контрол, няма начин да запазите родните данни на Python в паметта.

Има обаче няколко начина да заобиколите това.

Често едно ниво на съхранение ключ-стойност е всичко, от което се нуждаете. И понякога с буфери с фиксиран размер за стойности (които можете да използвате директно като str /bytes /bytearray предмети; всичко друго, което трябва да struct там или по друг начин сериализирайте) е всичко, от което се нуждаете. В този случай вградената рамка за кеширане на uWSGI ще се погрижи за всичко, от което се нуждаете.

Ако имате нужда от по-прецизен контрол, можете да разгледате как е внедрен кешът върху SharedArea и направете нещо персонализирано. Въпреки това не бих препоръчал това. По принцип ви дава същия вид API, който получавате с файл, и единствените реални предимства пред простото използване на файл са, че сървърът ще управлява живота на файла; работи на всички езици, поддържани от uWSGI, дори тези, които не позволяват файлове; и улеснява мигрирането на вашия персонализиран кеш към разпределен (многокомпютърен) кеш, ако по-късно се наложи. Не мисля, че някой от тях е от значение за вас.

Друг начин да получите плоска памет ключ-стойност, но без буферите с фиксиран размер, е с stdlib на Python anydbm . Търсенето на ключ-стойност е толкова pythonic, колкото става:изглежда точно като dict , с изключение на това, че е архивиран в дискова BDB (или подобна) база данни, кеширана според случая в паметта, вместо да се съхранява в хеш таблица в паметта.

Ако трябва да се справите с няколко други прости типа — всичко, което е невероятно бързо за разваляне/отваряне, като int s—може да помислите за shelve .

Ако вашата структура е достатъчно твърда, можете да използвате база данни ключ-стойност за най-високото ниво, но достъп до стойностите чрез ctypes.Structure , или де/сериализирайте с struct . Но обикновено, ако можете да направите това, можете също да премахнете най-горното ниво, в който момент цялото ви нещо е само една голяма Structure или Array .

В този момент можете просто да използвате обикновен файл за съхранение — или mmap го (за ctypes ), или просто open и read it (за struct ).

Или използвайте multiprocessing Споделени ctypes Обекти за достъп до вашата Structure директно от зона на споделена памет.

Междувременно, ако всъщност не се нуждаете от всички кеш данни през цялото време, а само от битове и части от време на време, точно за това са базите данни. Отново anydbm , и т.н. може да е всичко, от което се нуждаете, но ако имате сложна структура, начертайте диаграма на ER, превърнете я в набор от таблици и използвайте нещо като MySQL.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jest и Redis (проблем с модулни тестове с кеша на базата данни)

  2. Как мога да разбера времето, когато ключът ми се съхранява в Redis Cache/db?

  3. Споделяне на магазин за сесии на Redis за Django и приложение Express.js

  4. Запазете вложен хеш в redis чрез приложение node.js

  5. Проблем с връзката с Redis при пружинното зареждане на Docker compose