As i am new to redis, i need some guidance on how we can store the below complex json in REDIS so that we can access the Elements of the JSON from REDIS -
"Reservations": [
{
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
"PublicDnsName": "",
"State": {
"Code": 16,
"Name": "running"
},
"EbsOptimized": "false",
"LaunchTime": "xxxxxxxxx",
"PrivateIpAddress": "x.x.x.x",
"ProductCodes": [],
"VpcId": "xxxxx",
"StateTransitionReason": "",
"InstanceId": "i-xxxxxxx",
"EnaSupport": "true",
"ImageId": "ami-xxxxx",
"PrivateDnsName": "ip-xxxxxx.ec2.internal",
"KeyName": "xxxxxxv",
"SecurityGroups": [
{
"GroupName": "xxx",
"GroupId": "sg-xxxx"
},
{
"GroupName": "xxxxxx",
"GroupId": "sg-xxxxx"
},
{
"GroupName": "xxxxx",
"GroupId": "sg-xxxxxx"
},
{
"GroupName": "xxxxx",
"GroupId": "sg-xxxxxx"
}
],
"ClientToken": "xxxxx",
"SubnetId": "subnet-xxxxx",
"InstanceType": "t2.micro",
"NetworkInterfaces": [
{
"Status": "in-use",
"MacAddress": "xxxxxxxx",
"SourceDestCheck": "true",
"VpcId": "vpc-xxxxx",
"Description": "",
"NetworkInterfaceId": "eni-xxxxx",
"PrivateIpAddresses": [
{
"PrivateDnsName": "ip-xx-ec2.internal",
"Primary": "true",
"PrivateIpAddress": "xxxxx"
}
],
"PrivateDnsName": "ip-xxxx-xx.ec2.internal",
"Attachment": {
"Status": "attached",
"DeviceIndex": 0,
"DeleteOnTermination": "true",
"AttachmentId": "eni-attach-xxxxx",
"AttachTime": "2017-0xxxxx"
},
"Groups": [
{
"GroupName": "xx",
"GroupId": "sg-xxxx"
},
{
"GroupName": "xxxx",
"GroupId": "sg-xxx"
},
{
"GroupName": "xxxx",
"GroupId": "sg-xxx"
},
{
"GroupName": "xxxx",
"GroupId": "sg-xxxx"
}
],
"Ipv6Addresses": [],
"OwnerId": "xxx",
"SubnetId": "subnet-xxxx",
"PrivateIpAddress": "1xxxx"
}
],
"SourceDestCheck": "true",
"Placement": {
"Tenancy": "default",
"GroupName": "",
"AvailabilityZone": "us-xxxxxxx"
},
"Hypervisor": "xen",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xxxxxx",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": "true",
"VolumeId": "vol-xxxxxx",
"AttachTime": "2017-xxxxxxx"
}
}
],
"Architecture": "x86_64",
"RootDeviceType": "ebs",
"IamInstanceProfile": {
"Id": "xxxxxxxx",
"Arn": "arn:aws:iam::xxxxxxx"
},
"RootDeviceName": "/dev/xxxxx",
"VirtualizationType": "hvm",
"Tags": [
{
"Value": "xxxxxx",
"Key": "aws:cloudformation:stack-name"
},
{
"Value": "xxxxxxx",
"Key": "aws:cloudformation:logical-id"
},
{
"Value": "arn:aws:cloudformation:xxxxxx",
"Key": "aws:cloudformation:stack-id"
}
],
"AmiLaunchIndex": 0
}
],
"ReservationId": "r-xxxxx",
"RequesterId": "xxxxx",
"Groups": [],
"OwnerId": "xxxxxx"
}
]
}
I need to store this in such a way that i query the IP/Hostname/InstanceID to get all the elements that are present in the JSON.
I need some guidance on the above.
You can't directly do that, but luckily there is a new Redis module called ReJSON that does exactly what you need, and it has a nice Python binding as well. You need to use redis 4.0, then compile and install ReJSON and configure redis to load it, and it adds native commands for JSON manipulation.
It lets you store JSON documents in redis, and then either fetch or modify a specific element in the document tree, without retrieving (or internally even parsing) the document. Its Python client even lets you store python dicts and converts them to JSON automatically.
ReJSON module: http://rejson.io
Python client: https://pypi.python.org/pypi/rejson
Example:
You can use the pickle module incase you don't want to use reJson.
To set data in redis:
To obtain value from redis: