Compare commits

...

2 Commits

Author SHA1 Message Date
David McDonald
d50d5b97fd Redis spike 2022-02-09 12:27:50 +00:00
David McDonald
d567d1529d Improve running redis locally
- adds simple explicit instructions for how to install and run
  redis
- gets celery running in docker able to talk to redis running
  natively on your machine as per
  https://docs.docker.com/desktop/mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
2022-02-08 17:09:36 +00:00
4 changed files with 40 additions and 4 deletions

View File

@@ -61,10 +61,18 @@ export PATH=${PATH}:/Applications/Postgres.app/Contents/Versions/11/bin/
### Redis
To switch redis on you'll need to install it locally. On a OSX we've used brew for this. To use redis caching you need to switch it on by changing the config for development:
You can run redis locally using
REDIS_ENABLED = True
```
brew install redis
redis-server
```
To get the API to use redis locally you need to change the config for development:
```
REDIS_ENABLED = True
```
## To run the application

View File

@@ -114,7 +114,7 @@ class Config(object):
# URL of redis instance
REDIS_URL = os.getenv('REDIS_URL')
REDIS_ENABLED = os.getenv('REDIS_ENABLED') == '1'
REDIS_ENABLED = True
EXPIRE_CACHE_TEN_MINUTES = 600
EXPIRE_CACHE_EIGHT_DAYS = 8 * 24 * 60 * 60
@@ -428,7 +428,7 @@ class Development(Config):
NOTIFY_EMAIL_DOMAIN = "notify.tools"
SQLALCHEMY_DATABASE_URI = os.getenv('SQLALCHEMY_DATABASE_URI', 'postgresql://localhost/notification_api')
REDIS_URL = 'redis://localhost:6379/0'
REDIS_URL = os.getenv('REDIS_URL', 'redis://localhost:6379/0')
ANTIVIRUS_ENABLED = os.getenv('ANTIVIRUS_ENABLED') == '1'

View File

@@ -148,6 +148,7 @@ def persist_notification(
# if simulated create a Notification model to return but do not persist the Notification to the dB
if not simulated:
dao_create_notification(notification)
if key_type != KEY_TYPE_TEST and current_app.config['REDIS_ENABLED']:
cache_key = redis.daily_limit_cache_key(service.id)
if redis_store.get(cache_key) is None:
@@ -158,12 +159,37 @@ def persist_notification(
redis_store.set(cache_key, 1, ex=86400)
else:
redis_store.incr(cache_key)
# sending may not always be true, check this
cache_key = notification_count_cache_key(
service.id, notification_created_at, notification_type, 'sending'
)
if redis_store.get(cache_key) is None:
# if cache does not exist set the cache to 1 with an expiry of 8 days,
# The cache should be set by the time we create the notification
# but in case it is this will make sure the expiry is set to 8 days,
# where if we let the incr method create the cache it will be set a ttl.
# fix this comment as it might be missing a word?
redis_store.set(cache_key, 1, ex=691200)
else:
redis_store.incr(cache_key)
current_app.logger.info(
"{} {} created at {}".format(notification_type, notification_id, notification_created_at)
)
return notification
def notification_count_cache_key(
service_id, created_at_utc, notification_type, simplified_status
):
# this is not actually turning it in to bst, will need to fix this
bst_date = created_at_utc.strftime("%Y-%m-%d")
return "service-{}-bst-date-{}-{}-{}".format(
str(service_id), bst_date, notification_type, simplified_status
)
def send_notification_to_queue_detached(
key_type, notification_type, notification_id, research_mode, queue=None
):

View File

@@ -9,11 +9,13 @@ source environment.sh
AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-"$(aws configure get aws_access_key_id)"}
AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-"$(aws configure get aws_secret_access_key)"}
: "${SQLALCHEMY_DATABASE_URI:=postgresql://postgres@host.docker.internal/notification_api}"
REDIS_URL="redis://host.docker.internal:6379"
docker run -it --rm \
-e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
-e SQLALCHEMY_DATABASE_URI=$SQLALCHEMY_DATABASE_URI \
-e REDIS_URL=$REDIS_URL \
-v $(pwd):/home/vcap/app \
${DOCKER_IMAGE_NAME} \
${@}