一、引言
今天给大家讲讲非关系型数据库Redis.
二、非关系型数据库Redis
1. Redis 概述
1.1 什么是Redis
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对存储数据库,它可以用作数据库、缓存和消息中间件。
1.2 Redis 的特点
基于内存运行:数据主要存储在内存中,读写性能极高
支持数据持久化:可以将内存中的数据保存到磁盘,重启后可以再次加载使用
丰富的数据类型:支持字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等
支持事务:操作都是原子性,要么全部执行,要么全部不执行
丰富的特性:支持发布/订阅、键过期等特性
1.3 Redis应用场景
缓存系统:减轻数据库压力,提升系统性能
计数器:如网站访问量、点赞数等
消息队列:利用列表类型实现简单的消息队列
排行榜:利用有序集合实现各种排行榜功能
会话存储:存储用户会话信息
2. Redis软件安装
2.1 Windows 系统安装
方法一:用小皮安装(推荐)
方法二:使用官方版本
- 访问 Redis 官网下载 Windows 版本
- 解压到指定目录,如
C:\redis - 打开命令提示符,进入 Redis 目录
- 运行命令:
redis-server.exe redis.windows.conf
方法三:使用 WSL(Windows Subsystem for Linux)
# 在 WSL 中安装 Redis sudo apt update sudo apt install redis-server # 启动 Redis 服务 sudo service redis-server start # 检查 Redis 状态 sudo service redis-server status2.2 Mac系统安装
方式1: Homebrew
Homebrew是MacOS上的一个包管理器,它可以让安装和管理软件变得非常简单。首先,你需要安装Homebrew(如果你还没有安装的话)。
打开终端,然后粘贴以下命令来安装:
# 安装 Homebrew(如果尚未安装) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # 安装 Redis brew install redis # 启动 Redis(后台运行) brew services start redis # 或手动启动 redis-server /usr/local/etc/redis.conf # 检查是否运行 # 在另一个终端窗口中,你可以使用以下命令来检查Redis服务器是否正在运行: redis-cli ping # 应返回 PONG,表示Redis服务器正在正常运行。方式2:源码编译安装
# 下载最新稳定版 curl -O http://download.redis.io/redis-stable.tar.gz tar xzf redis-stable.tar.gz cd redis-stable # 编译 make # 测试编译结果 make test # 安装到 /usr/local/bin sudo make install # 创建配置文件目录 sudo mkdir /etc/redis sudo cp redis.conf /etc/redis/ # 修改配置文件(可选) vim /etc/redis/redis.conf # 启动 Redis redis-server /etc/redis/redis.conf2.3 Linux系统安装
Ubuntu/Debian 系统
# 更新软件包列表 sudo apt update # 安装 Redis sudo apt install redis-server # 启动 Redis 服务 sudo systemctl start redis-server # 设置开机自启 sudo systemctl enable redis-server # 检查 Redis 状态 sudo systemctl status redis-serverCentOS/RHEL 系统
# 安装 EPEL 仓库 sudo yum install epel-release # 安装 Redis sudo yum install redis # 启动 Redis 服务 sudo systemctl start redis # 设置开机自启 sudo systemctl enable redis2.4 验证安装
安装完成后,可以通过以下命令测试 Redis 是否正常工作:
# 连接 Redis 客户端 redis-cli # 在 Redis 客户端中测试 127.0.0.1:6379> ping PONG 127.0.0.1:6379> set test "Hello Redis" OK 127.0.0.1:6379> get test "Hello Redis" 127.0.0.1:6379> exit三、Python操作Redis
1. redis-py 模块安装
1.1 使用 pip 安装
# 安装 redis-py pip install redis # 或者指定版本 pip install redis==4.5.01.2 使用 conda 安装
conda install redis-py1.3 验证安装
上述两者都指向同一个 Python 库:redis-py库在导入时都是import redis
安装完成后,可以在 Python 中验证是否安装成功:
import redis print(redis.__version__)2. redis-py 模块使用
2.1 连接 Redis 数据库
基本连接
import redis # 创建 Redis 连接对象 r = redis.Redis( host='localhost', # Redis 服务器地址 port=6379, # Redis 服务器端口 db=0, # 数据库编号,默认0 password=None, # 密码,如果没有设置密码则为None decode_responses=True # 自动解码,返回字符串而不是字节 ) # 测试连接 try: response = r.ping() print("Redis 连接成功:", response) except redis.ConnectionError as e: print("Redis 连接失败:", e)2.2 字符串(String)操作
设置和获取值
import redis r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) # 设置单个值 r.set('name', '张三') r.set('age', '25') # 获取单个值 name = r.get('name') age = r.get('age') print(f"姓名: {name}, 年龄: {age}") # 设置多个值 r.mset({'city': '北京', 'job': '工程师'}) # 获取多个值 values = r.mget(['name', 'age', 'city', 'job']) print("多个值:", values) # 设置值并设置过期时间(单位:秒) r.setex('temp_data', 60, '临时数据') # 60秒后自动删除数值操作
import redis r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) # 设置初始值 r.set('counter', '0') # 自增操作 r.incr('counter') # +1 print("自增后:", r.get('counter')) r.incrby('counter', 5) # +5 print("增加5后:", r.get('counter')) # 自减操作 r.decr('counter') # -1 print("自减后:", r.get('counter')) r.decrby('counter', 3) # -3 print("减少3后:", r.get('counter'))2.3 哈希(Hash)操作
import redis r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) # 设置哈希字段 r.hset('user:1001', 'name', '李四') r.hset('user:1001', 'age', '30') r.hset('user:1001', 'city', '上海') # 获取单个字段 name = r.hget('user:1001', 'name') print(f"用户名: {name}") # 获取所有字段 user_info = r.hgetall('user:1001') print("用户信息:", user_info) # 设置多个字段 r.hmset('user:1002', { 'name': '王五', 'age': '28', 'city': '广州' }) # 获取多个字段 fields = r.hmget('user:1002', ['name', 'age']) print("指定字段:", fields) # 获取所有字段名 field_names = r.hkeys('user:1001') print("字段名:", field_names) # 获取所有字段值 field_values = r.hvals('user:1001') print("字段值:", field_values) # 删除字段 r.hdel('user:1001', 'city') print("删除后:", r.hgetall('user:1001'))2.4 列表(List)操作
import redis r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) # 从左侧添加元素 r.lpush('tasks', 'task1', 'task2', 'task3') # 从右侧添加元素 r.rpush('tasks', 'task4', 'task5') # 获取列表长度 length = r.llen('tasks') print(f"列表长度: {length}") # 获取列表元素 all_tasks = r.lrange('tasks', 0, -1) print("所有任务:", all_tasks) # 获取指定范围的元素 first_three = r.lrange('tasks', 0, 2) print("前三个任务:", first_three) # 从左侧弹出元素 left_task = r.lpop('tasks') print(f"左侧弹出: {left_task}") # 从右侧弹出元素 right_task = r.rpop('tasks') print(f"右侧弹出: {right_task}") print("剩余任务:", r.lrange('tasks', 0, -1))2.5 集合(Set)操作
import redis r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) # 添加元素 r.sadd('tags', 'python', 'redis', 'database', 'cache') # 获取所有元素 all_tags = r.smembers('tags') print("所有标签:", all_tags) # 判断元素是否存在 is_member = r.sismember('tags', 'python') print("python是否存在:", is_member) # 获取集合元素数量 tag_count = r.scard('tags') print(f"标签数量: {tag_count}") # 随机弹出一个元素 random_tag = r.spop('tags') print(f"随机弹出: {random_tag}") # 移除指定元素 r.srem('tags', 'database') print("移除后:", r.smembers('tags')) # 集合运算 r.sadd('set1', 'a', 'b', 'c') r.sadd('set2', 'b', 'c', 'd') # 交集 intersection = r.sinter('set1', 'set2') print("交集:", intersection) # 并集 union = r.sunion('set1', 'set2') print("并集:", union) # 差集 difference = r.sdiff('set1', 'set2') print("差集:", difference)2.6 有序集合(Sorted Set)操作
import redis r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) # 添加带分数的元素 r.zadd('leaderboard', { 'player1': 1000, 'player2': 1500, 'player3': 800, 'player4': 2000 }) # 按分数升序获取 asc_players = r.zrange('leaderboard', 0, -1, withscores=True) print("升序排名:", asc_players) # 按分数降序获取 desc_players = r.zrevrange('leaderboard', 0, -1, withscores=True) print("降序排名:", desc_players) # 获取元素分数 score = r.zscore('leaderboard', 'player2') print(f"player2的分数: {score}") # 增加元素分数 r.zincrby('leaderboard', 500, 'player1') print("增加后player1分数:", r.zscore('leaderboard', 'player1')) # 获取排名 rank = r.zrevrank('leaderboard', 'player4') # 从0开始的排名 print(f"player4的排名: {rank + 1}") # 转换为从1开始的排名 # 按分数范围获取 high_scores = r.zrangebyscore('leaderboard', 1000, 3000, withscores=True) print("高分玩家:", high_scores)2.7 键操作和过期时间
import redis import time r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) # 设置键值对 r.set('session:user123', 'user_data') # 检查键是否存在 exists = r.exists('session:user123') print("键是否存在:", exists) # 设置过期时间(秒) r.expire('session:user123', 300) # 5分钟后过期 # 获取剩余生存时间 ttl = r.ttl('session:user123') print(f"剩余生存时间: {ttl}秒") # 设置键值对并指定过期时间 r.setex('temp:code', 60, '123456') # 60秒后过期 # 移除过期时间,使键永久存在 r.persist('session:user123') # 查找匹配模式的键 all_keys = r.keys('*') print("所有键:", all_keys) session_keys = r.keys('session:*') print("会话键:", session_keys) # 删除键 r.delete('session:user123') print("删除后是否存在:", r.exists('session:user123'))四、结语
Redis差不多就是这些,之后会给大家讲一下数据分析和Linux