<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Basic set and get operations
Start off by connecting to the redis server
To understand what decode_responses=True does, refer back to this document
Step1:  The most basic usage of set and get
Step2:  We can override the existing value by calling set method for the same key
Step3:  It is also possible to pass an expiration value to the key by using setex method
Step4:  A dictionary can be inserted like this
Step5:  To get multiple keys' values, we can use mget. If a non-existing key is also passed, Redis return None for that key
<ASSISTANT_TASK:>
Python Code:
import redis 
r = redis.Redis(decode_responses=True)
r.ping()
Explanation: Basic set and get operations
Start off by connecting to the redis server
To understand what decode_responses=True does, refer back to this document
End of explanation
r.set("full_name", "john doe")
r.exists("full_name")
r.get("full_name")
Explanation: The most basic usage of set and get
End of explanation
r.set("full_name", "overridee!")
r.get("full_name")
Explanation: We can override the existing value by calling set method for the same key
End of explanation
r.setex("important_key", 100, "important_value")
r.ttl("important_key")
Explanation: It is also possible to pass an expiration value to the key by using setex method
End of explanation
dict_data = {
    "employee_name": "Adam Adams",
    "employee_age": 30,
    "position": "Software Engineer",
}
r.mset(dict_data)
Explanation: A dictionary can be inserted like this
End of explanation
r.mget("employee_name", "employee_age", "position", "non_existing")
Explanation: To get multiple keys' values, we can use mget. If a non-existing key is also passed, Redis return None for that key
End of explanation
<END_TASK>