Redis 介绍
Redis是一个开源的、高性能的键值对数据库,它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。Redis的内存读取速度非常快,因为它将所有数据都存储在内存中,而不是硬盘。此外,Redis可以使用持久化机制将数据保存到硬盘上,以便在服务器重启之后也能够继续访问这些数据。
Redis有以下几个主要的特点:
- 内存读写速度非常快:因为Redis将数据都存储在内存中,所以它可以快速读写数据。
- 多种数据结构支持:Redis支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等,使得开发者可以根据应用场景选择最合适的数据结构。
- 持久化机制:Redis支持两种持久化机制,即RDB和AOF。RDB是将数据保存到硬盘上的快照方式,而AOF是将写入操作保存到文件中,以便在服务器重启之后恢复数据。
- 高性能:Redis采用单线程模型,避免了多线程带来的竞争问题,同时通过事件轮询机制提高了并发处理能力。
- 分布式支持:Redis支持多种分布式场景,如主从复制、哨兵模式和集群模式等。
总之,Redis是一个非常强大、灵活的数据库,适合处理高并发、高性能的应用场景。
Redis是一款高性能的非关系型数据库,可以存储键值对、列表、集合、有序集合、哈希表等多种数据类型。
Redis的基本操作代码
1.连接Redis
import redis
redis_client = redis.Redis(host='localhost', port=6379, db=0)
2.操作键值对
# 设置键值对
redis_client.set('key', 'value')
# 获取键对应的值
value = redis_client.get('key')
# 删除键值对
redis_client.delete('key')
3.操作列表
# 在列表左侧添加元素
redis_client.lpush('list', 'value1')
redis_client.lpush('list', 'value2')
# 获取列表所有元素
values = redis_client.lrange('list', 0, -1)
# 删除列表中的元素
redis_client.lrem('list', 0, 'value1')
4.操作集合
# 添加元素到集合
redis_client.sadd('set', 'value1')
redis_client.sadd('set', 'value2')
# 获取集合所有元素
values = redis_client.smembers('set')
# 删除集合中的元素
redis_client.srem('set', 'value1')
5.操作有序集合
# 在有序集合中添加元素
redis_client.zadd('zset', {'value1': 1, 'value2': 2})
# 获取有序集合所有元素
values = redis_client.zrange('zset', 0, -1)
# 删除有序集合中的元素
redis_client.zrem('zset', 'value1')
6.操作哈希表
# 在哈希表中设置字段值
redis_client.hset('hash', 'key1', 'value1')
redis_client.hset('hash', 'key2', 'value2')
# 获取哈希表中的字段值
value = redis_client.hget('hash', 'key1')
# 删除哈希表中的字段
redis_client.hdel('hash', 'key1')
Redis 在Python文件中具体代码实现
#!/usr/bin/env python3
import redis
import json
import time
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 7890
REDIS_DB = 0
REDIS_PASSWORD = '12356'
REDIS_MAX_CONNECTIONS = 1000
def create_conn(db=REDIS_DB, decode_responses=False):
# 创建连接池
pool = redis.ConnectionPool(
host=REDIS_HOST,
port=REDIS_PORT,
db=db,
max_connections=REDIS_MAX_CONNECTIONS,
password=REDIS_PASSWORD,
decode_responses = decode_responses,
)
# 创建连接
conn = redis.StrictRedis(connection_pool=pool)
return conn
# 使用function进行连接
db_1 = create_conn(1)
Redis 高级功能--切片,发布/订阅
一、Redis切片
Redis切片(sharding)是将一个大的Redis数据库分为多个小的Redis数据库,达到分布式存储的目的。Redis切片可以提高系统性能、可用性和扩展性。
Redis切片的实现方式有两种:
1.客户端分片
客户端分片是指在客户端通过一定的算法将数据分散到多个Redis服务器上。客户端分片的优点是实现简单,但是需要客户端维护数据的分片和负载均衡等问题。
2.服务端分片
服务端分片是指在Redis服务器端实现数据的切片。服务端分片的优点是可以通过配置、监控、管理工具来管理服务端,用于处理数据切片和负载均衡等问题。
下面是Redis服务端分片的详细代码:
import redis
from rediscluster import RedisCluster
startup_nodes = [{"host": "127.0.0.1", "port": "7000"}, {"host": "127.0.0.1", "port": "7001"}, {"host": "127.0.0.1", "port": "7002"}]
rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
# 写入数据
for i in range(1, 101):
key = "key" + str(i)
value = "value" + str(i)
rc.set(key, value)
# 读取数据
for i in range(1, 101):
key = "key" + str(i)
print(rc.get(key))
上面的代码创建了一个Redis集群,该集群有三个节点,分别是7000、7001、7002端口,使用RedisCluster类连接Redis集群,在集群中写入了100条数据,然后在集群中读取数据。
二、Redis管道
Redis管道是一种批量执行Redis命令的方式,将多个命令一次性发送给Redis服务器,然后一次性接收Redis服务器的响应。Redis管道可以提高Redis服务器的性能,减少网络开销和Redis服务器的负担。
下面是Redis管道的详细代码:
import redis
r = redis.Redis(host='127.0.0.1', port=6379)
pipe = r.pipeline()
# 写入数据
for i in range(1, 101):
key = "key" + str(i)
value = "value" + str(i)
pipe.set(key, value)
# 读取数据
for i in range(1, 101):
key = "key" + str(i)
pipe.get(key)
# 执行管道
result = pipe.execute()
# 输出结果
for i in result:
print(i)
上面的代码创建了一个Redis连接对象,使用Redis管道批量写入和读取了100条数据,然后执行管道,最后输出结果。
三、Redis发布/订阅
Redis发布/订阅是一种消息模式,可以实现多个客户端之间的实时通信。发布者将消息发布到一个通道上,订阅者订阅该通道,当有消息发布到该通道时,订阅者会自动接收到该消息。Redis发布/订阅可以用于实现聊天室、游戏、即时通讯等场景。
下面是Redis发布/订阅的详细代码:
import redis
import threading
# 创建Redis连接对象
r = redis.Redis(host='127.0.0.1', port=6379)
# 订阅通道
def subscribe(channel):
p = r.pubsub()
p.subscribe(channel)
for message in p.listen():
print("收到消息: ", message['data'])
# 发布消息
def publish(channel, message):
r.publish(channel, message)
# 创建两个线程,一个订阅通道,一个发布消息
t1 = threading.Thread(target=subscribe, args=("channel1",))
t2 = threading.Thread(target=publish, args=("channel1", "hello world"))
# 启动线程
t1.start()
t2.start()
# 等待线程执行完毕
t1.join()
t2.join()
上面的代码创建了一个Redis连接对象,创建了两个线程,一个订阅channel1通道,一个发布hello world消息到channel1通道。最后启动两个线程并等待线程执行完毕。当发布消息时,订阅者就会接收到该消息。