Advanced filtering and sorting with redis (part 2)
Posted on October 7, 2019 • 2 minutes • 294 words
With the recent introduction of Redis modules (since Redis v4), redis is now a lot more flexible than the old redis.
Previously in part 1 , if you want to mimic the sorting and filtering behavior, you need to use set/sorted set and do the intersection/union by yourself.
Not anymore.
Meet RediSQL
RediSQL is an in-memory SQL engine, built on top of Redis as Redis module.
It’s pretty much SQL under the hood now. No more smart trick to mimic the behavior.
The downside is there ain’t many redis client that support browsing data for these modules, aside from the newly released RedisInsight , which currently only support RedisGraph, RediSearch and RedisTimeSeries. This makes debugging is really troublesome. This is a big show stopper for me. Just something for you to keep in mind.
RedisGraph
RedisGraph is a graph database module for Redis. It’s specificly built for graph database but can be utilized for doing filtering as well, because it’s a graph database. It’s kinda using the wrong tool for the purpose. RedisGraph is a lot more powerful than just doing filtering and sorting.
Example of doing filtering in RedisGraph
Loading data
GRAPH.QUERY TestGraph "CREATE (:Property {id: '1', name: 'hotel 1'})-[:hasFacility]->(:Facility {id: '1', name: 'Swimming pool'})"
GRAPH.QUERY TestGraph "CREATE (:Property {id: '1', name: 'hotel 1'})-[:inCity]->(:City {id: '1', name: 'Hanoi'})"
GRAPH.QUERY TestGraph "CREATE (:Property {id: '1', name: 'hotel 1'})-[:hasStarRating]->(:Rating {id: '4', name: '4 star'})"
GRAPH.QUERY TestGraph "CREATE (:Property {id: '2', name: 'hotel 2'})-[:hasFacility]->(:Facility {id: '2', name: 'Spa'})"
GRAPH.QUERY TestGraph "CREATE (:Property {id: '2', name: 'hotel 2'})-[:inCity]->(:City {id: '1', name: 'Hanoi'})"
GRAPH.QUERY TestGraph "CREATE (:Property {id: '2', name: 'hotel 2'})-[:hasStarRating]->(:Rating {id: '3', name: '3 star'})"
Filter all 3 star hotels in Hanoi
GRAPH.QUERY TestGraph "MATCH (h:Property)-[:inCity]->(c:City) WHERE c.name = 'Hanoi' and r.name='3 star' RETURN h.id, h.name"