Of course! The redis-py library for Python uses the SELECT command internally to manage connections to different databases within the same Redis server. Here’s a comprehensive guide on how to do it, covering the best practices and common pitfalls.

Understanding Redis Databases
First, it's important to understand that a single Redis server can have multiple databases, numbered from 0 to 15 (by default). Each database is a separate key-value store with its own keys and data.
- Default Database: When you connect to Redis without specifying a database, you are automatically connected to database
0. - Isolation: Data in one database is completely separate from data in another. A key named
my_keyin database0is different from a key namedmy_keyin database1. - Use Case: This is useful for separating different environments or types of data within the same Redis instance (e.g., caching data in
0and user sessions in1).
Method 1: Using redis-py (The Recommended Way)
The redis-py library provides two primary ways to select a database: during connection and on an existing connection.
A. Selecting a Database During Connection (Best Practice)
This is the cleanest and most common method. You simply pass the db argument to the Redis() constructor.
import redis
# Connect to database 0 (the default)
r0 = redis.Redis(host='localhost', port=6379, db=0)
# Connect to database 1
r1 = redis.Redis(host='localhost', port=6379, db=1)
# Connect to database 2
r2 = redis.Redis(host='localhost', port=6379, db=2)
# --- Let's test it ---
# Set a key in database 1
r1.set('user:session:123', 'some_session_data')
print(f"Set key 'user:session:123' in DB 1. Value: {r1.get('user:session:123')}")
# Try to get the same key from the connection to database 0
# This will return None because the key doesn't exist in DB 0
print(f"Getting key from DB 0: {r0.get('user:session:123')}")
# Set a different key in database 0
r0.set('cache:page:index', 'html_content')
print(f"Set key 'cache:page:index' in DB 0. Value: {r0.get('cache:page:index')}")
# Try to get this key from database 1
# This will also return None
print(f"Getting key from DB 1: {r1.get('cache:page:index')}")
B. Selecting a Database on an Existing Connection
If you already have a connection object and want to switch to a different database, you can use the select() method. This is useful for scenarios where a single connection needs to work with multiple databases.

import redis
# Start by connecting to the default database (0)
r = redis.Redis(host='localhost', port=6379, db=0)
print(f"Initially connected to DB: {r.connection_pool.connection_kwargs.get('db')}")
# Set a key in database 0
r.set('app:config', 'production')
print(f"Set 'app:config' in DB 0. Value: {r.get('app:config')}")
# --- Now, switch to database 1 using the select() method ---
r.select(1)
print(f"Switched to DB: {r.connection_pool.connection_kwargs.get('db')}")
# Set a key in the newly selected database (1)
r.set('user:token:456', 'xyz123abc')
print(f"Set 'user:token:456' in DB 1. Value: {r.get('user:token:456')}")
# If you try to get the key from DB 0, it won't be found
# because the connection is now "focused" on DB 1.
print(f"Getting 'app:config' from current DB (1): {r.get('app:config')}")
# To switch back, just call select() again
r.select(0)
print(f"Switched back to DB: {r.connection_pool.connection_kwargs.get('db')}")
print(f"Getting 'app:config' from current DB (0): {r.get('app:config')}")
Method 2: Direct SELECT Command (Advanced)
You can also send the raw SELECT command to Redis using the execute_command() method. This is less common but gives you direct access to the Redis protocol.
import redis
# Connect without specifying a db
r = redis.Redis(host='localhost', port=6379)
# The execute_command method sends a raw Redis command
# The response is 'OK' if the selection was successful
response = r.execute_command('SELECT', 2)
print(f"Direct SELECT command response: {response}") # Should print 'OK'
# Now, all operations on this connection will target database 2
r.set('direct:db:key', 'test_value')
print(f"Key 'direct:db:key' in DB 2: {r.get('direct:db:key')}")
Best Practices and Important Considerations
-
Use Connection Pools: The
redis-pylibrary uses a connection pool by default. When you create a newRedisobject (e.g.,redis.Redis(db=1)), it creates a new connection pool for that specific database. If you are frequently switching between databases, creating a new connection for each is inefficient. For advanced use cases, you can manage a single connection pool and pass it to multipleRedisobjects, but for most applications, creating separate connections is simpler and just fine. -
Thread Safety: A single
redis.Redisconnection object is not thread-safe. If you are using multiple threads, each thread should get its own connection instance. This is another reason why creating a new connection for each database (redis.Redis(db=X)) is a good pattern—it naturally gives you a thread-safe connection for each database you need. -
Avoid
SELECTin High-Traffic Code: WhileSELECTis fast, repeatedly switching databases on a single connection within a tight loop can add a tiny amount of overhead. If a piece of code exclusively works with one database, it's best to connect to that database once and stick with it for the duration of that operation.
(图片来源网络,侵删) -
Clear Naming Conventions: A good alternative to using multiple databases is to use a consistent naming convention for your keys. For example, use prefixes like
cache:...andsession:.... This is often simpler and avoids confusion. However, usingSELECTis a great way to achieve logical separation, especially for different applications or environments running on the same Redis server.
Summary
| Method | When to Use | Example |
|---|---|---|
Redis(db=X) |
Recommended for most cases. When you know which database a component or function will use from the start. | r_sessions = redis.Redis(db=1) |
connection.select(X) |
When a single connection needs to dynamically switch between databases during its lifetime. | r.select(2) |
execute_command('SELECT', X) |
Rarely needed. For advanced use cases where you need to interact with the Redis protocol directly. | r.execute_command('SELECT', 3) |
