Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set values in Redis cache, consisting of multiple rows under the same column name using Python

I am using Google Cloud's memorystore for Redis server. My objective is to store the query results coming out of BigQuery (SQL like) and to retrieve the results from Redis for subsequent usage. The query returns about 1000 rows with two columns which I try to set using client.set.

Once the values along with key are set, when I try to retrieve, it is returning me only the last value of the key. I am guessing that is because while trying to set values in a loop it is overwriting the previous value of the key. How do I overcome this problem of storing multiple values of the same key and retrieving it.

The code that I have used is as below:

import redis
import os
from google.cloud import bigquery

client = bigquery.Client()

redis_host = os.environ.get('REDISHOST', 'IP address')
redis_port = int(os.environ.get('REDISPORT', 6379))
r = redis.StrictRedis(host=redis_host, port=redis_port)

def hello_world():
    if (r.get('company_name')):
        print(r.get("company_name"))
    else:
        query = """SELECT coompany_name, news FROM `some-project.news` LIMIT 1000 """
        query_job = client.query(query)
        results = query_job.result()
        for row in results:
            r.set("company_name",row.company_name)
            r.set("news", row.news)
            r.expire("company_name",15)
            r.expire("news",15)
            print(row.company)
if __name__ == '__main__':
    hello_world()

Please let me know how can I print all the key and values that are set

like image 531
Ranga Vittal Avatar asked Dec 01 '25 10:12

Ranga Vittal


1 Answers

I am not familiar with python but i checked the documentation the method names are same. So you may apply the following structure to your code.

here is the redis-cli version of both sets and lists.

Sets

127.0.0.1:6379> sadd company_name name1 name2 name3 name4 nameN
(integer) 5
127.0.0.1:6379> sadd news news1 news2 news3 news4 newsN
(integer) 5
127.0.0.1:6379> expire company_name 600
(integer) 1
127.0.0.1:6379> expire news 600
(integer) 1
127.0.0.1:6379> ttl company_name
(integer) 588
127.0.0.1:6379> ttl news
(integer) 592
127.0.0.1:6379> smembers company_name
1) "name4"
2) "name3"
3) "name2"
4) "name1"
5) "nameN"
127.0.0.1:6379> smembers news
1) "news4"
2) "news1"
3) "news3"
4) "news2"
5) "newsN"
127.0.0.1:6379>

Lists

127.0.0.1:6379> lpush company_name name1 name2 name3 nameN
(integer) 4
127.0.0.1:6379> lrange company_name 0 -1
1) "nameN"
2) "name3"
3) "name2"
4) "name1"
127.0.0.1:6379> lpush news news1 news2 news3 newsN
(integer) 4
127.0.0.1:6379> lrange news 0 -1
1) "newsN"
2) "news3"
3) "news2"
4) "news1"
127.0.0.1:6379> expire news 15
(integer) 1
127.0.0.1:6379> expire company_name 15
(integer) 1
127.0.0.1:6379> ttl news
(integer) 6
127.0.0.1:6379> ttl company_name
(integer) 8
127.0.0.1:6379> ttl news
(integer) -2
127.0.0.1:6379> lrange news 0 -1
(empty list or set)
127.0.0.1:6379>
like image 100
Ersoy Avatar answered Dec 03 '25 23:12

Ersoy