Не, Redis е много повече от кеш.
Подобно на кеша, Redis съхранява двойки ключ=стойност. Но за разлика от кеша, Redis ви позволява да оперирате със стойностите. В Redis има 5 типа данни - низове, набори, хешове, списъци и сортирани набори. Всеки тип данни излага различни операции.
Най-добрият начин да разберете Redis е да моделирате приложение, без да мислите как ще го съхранявате в база данни.
Да кажем, че искаме да изградим StackOverflow.com. За да бъде опростено, имаме нужда от въпроси, отговори, етикети и потребители.
Въпроси за моделиране, потребители и отговори
Всеки обект може да бъде моделиран като карта. Например, въпросът е карта с полета {id, title, date_asked, votes, ask_by, status}. По същия начин, отговорът е карта с полета {id, question_id, answer_text, answered_by, votes, status}. По подобен начин можем да моделираме потребителски обект.
Всеки от тези обекти може да се съхранява директно в Redis като хеш. За да генерирате уникални идентификатори, можете да използвате командата за атомно увеличение. Нещо подобно -
$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK
$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK
Обработване на гласовете
Сега, всеки път, когато някой гласува за въпрос или отговор, просто трябва да направите това
$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2
Списък с въпроси за начална страница
След това искаме да съхраняваме най-новите въпроси, които да се показват на началната страница. Ако пишете програма за .NET или Java, бихте съхранили въпросите в списък. Оказва се, че това е най-добрият начин да съхранявате това и в Redis.
Всеки път, когато някой зададе въпрос, ние добавяме неговия идентификатор към списъка.
$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1
Сега, когато искате да изобразите началната си страница, питате Redis за последните 25 въпроса.
$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"
Сега, когато имате идентификаторите, извлечете елементи от Redis с помощта на конвейер и ги покажете на потребителя.
Въпроси по етикети, сортирани по гласове
След това искаме да извлечем въпроси за всеки маркер. Но SO ви позволява да видите въпроси с най-голямо гласуване, нови въпроси или въпроси без отговор под всеки етикет.
За да моделираме това, ние използваме функцията за сортиран набор на Redis. Сортираният набор ви позволява да свържете резултат с всеки елемент. След това можете да извлечете елементи въз основа на техните резултати.
Нека да продължим и да направим това за маркера Redis
$ zadd questions_by_votes_tagged:redis 2 question:1
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5
1) "question:2"
2) "question:613"
3) "question:1"
Какво направихме тук? Добавихме въпроси към сортиран набор и свързахме оценка (брой гласове) на всеки въпрос. Всеки път, когато даден въпрос бъде гласуван, ние ще увеличаваме неговия резултат. И когато потребител щракне върху „Въпроси, маркирани с Redis, сортирани по гласове“, ние просто правим zrevrange
и върнете най-важните въпроси.
Въпроси в реално време без опресняване на страницата
И накрая, бонус функция. Ако запазите страницата с въпроси отворена, SO ще ви уведоми, когато бъде добавен нов въпрос. Как Redis може да помогне тук?
Redis има пъб-под модел. Можете да създавате канали, например "channel_questions_tagged_redis". След това subscribe
потребители към конкретен канал. Когато се добави нов въпрос, трябва да publish
съобщение до този канал. Тогава всички потребители ще получат съобщението. Ще трябва да използвате уеб технология като уеб сокети или комета, за да доставите съобщението до браузъра, но Redis ви помага с всички водопроводни инсталации от страна на сървъра.
Постоянство, надеждност и др.
За разлика от кеша, Redis запазва данни на твърдия диск. Можете да имате настройка главен-подчинен, за да осигурите по-добра надеждност. За да научите повече, прегледайте темите за постоянство и репликация тук - http://redis.io/documentation