https://github.com/redis-developer/fastapi-redis-tutorial
Using Redis with FastAPI
https://github.com/redis-developer/fastapi-redis-tutorial
Last synced: 10 months ago
JSON representation
Using Redis with FastAPI
- Host: GitHub
- URL: https://github.com/redis-developer/fastapi-redis-tutorial
- Owner: redis-developer
- License: mit
- Created: 2021-05-28T00:34:51.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2024-07-01T20:55:51.000Z (over 1 year ago)
- Last Synced: 2025-03-30T22:51:14.862Z (11 months ago)
- Language: Python
- Homepage:
- Size: 151 KB
- Stars: 115
- Watchers: 4
- Forks: 87
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# FastAPI Redis Example
This is an example API that demonstrates how to use Redis with FastAPI to build
a fully async web service in Python.
The API is called *IsBitcoinLit*. Readers outside the U.S. who are unfamiliar with
the slang term "lit" might enjoy this [Merriam-Webster
etymology](https://www.merriam-webster.com/words-at-play/lit-meaning-origin#:~:text=Lit%20has%20been%20used%20as,is%20%22exciting%20or%20excellent.%22).
The IsBitcoinLit API tracks Bitcoin sentiment and prices over time, rolling
these up into hourly averages of averages using the [RedisTimeSeries
module](https://oss.redislabs.com/redistimeseries/). You can use the API to get
average Bitcoin price and sentiment for each of the last three hours, with a
quick indication of price and sentiment movement.
## Setup
This project is designed to run as a set of Docker containers. You will need to
[install Docker](https://www.docker.com/) to complete the setup tasks.
First, clone this repo and build the Docker images for the project:
$ git clone https://github.com/redis-developer/fastapi-redis-tutorial.git
$ cd fastapi-redis-tutorial
$ docker-compose build
Running the API involves starting the app server and Redis. You'll do those steps
next!
## Running the API
The `docker-compose.yaml` file in this project configures containers for a Redis
instance with the RedisTimeSeries module, the Python app for the example API,
and a test runner.
Use this command to run all three containers:
$ docker-compose up
This command starts Redis and the API server and runs the tests.
### Ingesting Price and Sentiment Data
A `/refresh` endpoint exists in the app that ingests the last 24 hours of
Bitcoin price and sentiment data.
The app assumes a scheduler (cron job, Google Cloud Scheduler, etc.) will hit
the `/refresh` endpoint on a regular basis to keep data fresh.
**NOTE** : We can refresh data as often as we want without getting
duplicate data. This is because RedisTimeSeries allows [configuring
rules](https://oss.redislabs.com/redistimeseries/configuration/#duplicate_policy)
to ignore duplicate sample and timestamp pairs.
After you first start the API, use the `/refresh` API to ingest data:
$ curl -X POST localhost:8080/refresh
Now you can use the `/is-bitcoin-lit` endpoint to see a summary of Bitcoin price
and sentiment data. Continue reading to see how to use that endpoint.
**NOTE**: We've used the free [SentiCrypt](https://senticrypt.com) API to pull
Bitcoin sentiment and price. We are not affiliated with SentiCrypt and this is **in no way**
a recommendation to use the API for crypto price and sentiment tracking in real applications.
### Getting Summary Price and Sentiment Data from the API
Use the `/is-bitcoin-lit` endpoint to get an hourly summary of Bitcoin price and
sentiment data for the last three hours:
$ curl localhost:8080/is-bitcoin-lit | jq
```json
{
"hourly_average_of_averages": [
{
"price": "32928.345",
"sentiment": "0.22",
"time": "2021-07-08T17:00:00+00:00"
},
{
"price": "32834.2910891089",
"sentiment": "0.224257425742574",
"time": "2021-07-08T18:00:00+00:00"
},
{
"price": "32871.3406666667",
"sentiment": "0.208666666666667",
"time": "2021-07-08T19:00:00+00:00"
}
],
"sentiment_direction": "rising",
"price_direction": "rising"
}
```
As you can see, the response includes the key `hourly_average_of_averages`. This
key contains hourly averages derived from the Bitcoin sentiment API's data,
which is itself averaged over 30-second periods. (Thus, these are *averages of
averages*.)
The API also returns the *direction* that the price and sentiment are moving.
The directions are:
Value | Meaning
---------|----------
Rising | The price has risen over the past three hours.
Falling | The price has fallen over the past three hours.
Neutral | The price stayed the same for three hours (unlikely!)
So, *is Bitcoin lit* in this example? Yes, it's lit: the price and sentiment are
rising. See how that works?
### Running Tests
You can run the app's test suite using docker-compose:
$ docker-compose up test