Redis är till för användningsfall där du behöver komma åt och uppdatera data med mycket hög frekvens och där du drar nytta av användningen av datastrukturer (hashar, uppsättningar, listor, strängar eller sorterade uppsättningar). Den är gjord för att fylla mycket specifika användningsfall. Om du har ett allmänt användningsfall som mycket flexibel sökning, skulle du vara mycket bättre betjänt av något som är byggt för detta ändamål som elastisk sökning eller SOLR.
Som sagt, om du måste göra detta i Redis, så här skulle jag göra det (förutsatt att användare kan dela namn och telefonnummer):
name:some_name -> set([id1, id2, etc...])
name:some_other_name -> set([id3, id4, etc...])
phone:some_phone -> set([id1, id3, etc...])
phone:some_other_phone -> set([id2, id4, etc...])
id1 -> {'name' : 'bob', 'phone' : '123-456-7891', etc...}
id2 -> {'name' : 'alice', 'phone' : '987-456-7891', etc...}
I det här fallet skapar vi en ny nyckel för varje namn (med prefixet "name:") och varje telefonnummer (prefixet "phone:"). Varje nyckel pekar på en uppsättning ID som har all information du vill ha för en användare. När du söker efter en telefon, till exempel, gör du:
HGETALL 'phone:123-456-7891'
och sedan gå igenom resultaten och returnera all information om varje (namn i vårt exempel) på ditt val av språk (du kan göra hela den här grejen i server-side Lua på Redis-boxen för att gå ännu snabbare och undvika nätverk bak-och- framåt, om du vill):
for id in results:
HGET id 'name'
Din kostnad här kommer att vara O(m)
där m
är antalet användare med det angivna telefonnumret, och detta kommer att vara en mycket snabb operation på Redis på grund av hur optimerad den är för hastighet. Det kommer att vara överdrivet i ditt fall eftersom du förmodligen inte behöver att saker och ting ska gå så snabbt, och du föredrar att ha flexibel sökning, men det är så här du skulle göra det.