linux安装redis及Python操作redis
目录
一、Redis安装
1、下载安装包
2、解压文件
3、迁移文件夹
4、编译
5、管理redis文件
6、修改配置文件
7、启动Redis
8、将redis服务交给systemd管理
二、Redis介绍
1、数据结构
①字符串String
②列表List
③哈希Hash
④集合Set
⑤有序集合Sorted Set
2、Redis特点
①高性能
②持久化
③分布式支持
三、Python连接Redis
四、总结
一、Redis安装
1、下载安装包
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
2、解压文件
tar -zxvf redis-6.2.6.tar.gz
3、迁移文件夹
mv redis-6.2.6 /opt/redis
4、编译
cd /opt/redis
make
make install
5、管理redis文件
创建 bin 和 etc 文件夹
bin:用于存放可执行文件
etc:用于存放redis.conf
mkdir bin
mkdir etc# 移动配置文件mv redis.conf /opt/redis/etc/# 移动可执行文件
cd src
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server /opt/redis/bin/
cd ../bin
6、修改配置文件
vim /opt/redis/etc/redis.conf# 注释掉 bing 127.0.0.1,该项限制Redis只允许本地连接。将其注释掉后,Redis服务器将不再只监听本地回环地址,从而允许远程客户端连接到Redis服务器# 取消requirepass foobared的注释,将foobared修改为密码
requirepass your_password# 将appendonly 修改为 yes, appendonly配置项用于开启或关闭 AOF(Append Only File)持久化模式。将其设置为yes后,会开启 AOF 持久化。AOF 持久化模式会将每一个写命令追加到文件末尾,相比默认开启的 RDB 持久化,AOF 恢复的数据通常更完整,能在服务器故障恢复时尽可能保证数据的一致性和完整性
appendonly yes# 将daemonize 修改为 yes,daemonize配置项用于控制Redis是否以守护进程的方式运行。将其设置为yes后,Redis会在后台运行,不会占用当前终端会话,方便在系统后台持续稳定地提供服务。
daemonize yes# dir配置项用于指定 Redis 的数据存储目录。通过修改dir后面的路径,可将 Redis 的数据存储到指定的目录下,方便进行数据管理和备份等操作。
dir /your_data_dir
7、启动Redis
./redis-server /opt/redis/etc/redis.conf
进入客户端
./redis-cli# 验证设置的密码
auth 密码# 退出命令
exit
8、将redis服务交给systemd管理
编写 redis.service
cd /etc/systemd/system
vim redis.service
写入以下内容:
[Unit]
Description=Redis
After=network.target[Service]
Type=forking
PIDFile=/run/redis_6379.pid
ExecStart=/opt/redis/bin/redis-server /opt/redis/etc/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target
刷新并启动Redis
systemctl daemon-reload
systemctl start redis
二、Redis介绍
1、数据结构
①字符串String
最基本的数据结构,能存储任何形式的字符串,包括整数和浮点数(在 Redis 内部会进行转换)。例如,可以存储用户的姓名、文章的标题、计数器的值等。
②列表List
一个有序的字符串列表,可以在列表的两端进行插入(LPUSH和RPUSH)和弹出(LPOP和RPOP)操作,还可以获取指定范围的元素等。常用于消息队列、最新消息列表等场景。
③哈希Hash
一个键值对集合,其中的键和值都是字符串类型。适合存储对象的属性,如用户对象的姓名、年龄、性别等信息。
④集合Set
无序的、不包含重复元素的字符串集合。可以用于实现标签系统、好友关系等功能。
⑤有序集合Sorted Set
和集合类似,但每个元素都关联一个分数(Score),元素根据分数进行排序。常用于排行榜、优先级队列等场景。
2、Redis特点
①高性能
内存存储:数据存储在内存中,读写速度极快,能够在微秒级或者亚毫秒级完成读写操作,相比传统的基于磁盘的数据库,大大提高了数据访问效率。
单线程架构:采用单线程模型处理请求,避免了多线程的上下文切换开销,并且 Redis 的操作都是原子性的,这使得它在处理高并发场景下依然能够保持高性能和数据的一致性。
②持久化
RDB(Redis Database Backup)持久化:在指定的时间间隔内,将内存中的数据集快照写入磁盘。这种方式非常适合用于备份和灾难恢复,它生成的快照文件是紧凑的二进制文件,恢复速度快。
AOF(Append Only File)持久化:以日志的形式记录服务器所执行的所有写操作,在服务器启动时,通过重新执行这些写操作来恢复数据集。AOF 持久化方式提供了更好的数据安全性,可以设置不同的同步频率来平衡性能和数据安全性。
③分布式支持
主从复制(Master - Slave Replication):支持一个主节点(Master)和多个从节点(Slave)的架构。主节点负责写操作,从节点负责复制主节点的数据,用于读操作,这样可以分担服务器的负载,提高系统的并发读写能力。
Redis Sentinel(哨兵):用于监控主从节点的健康状态,当主节点出现故障时,能够自动将一个从节点升级为新的主节点,实现故障自动转移,提高系统的可用性。
Redis Cluster(集群):通过分片(Sharding)的方式将数据分散存储在多个节点上,每个节点负责一部分数据的存储和处理,从而能够支持更大规模的数据存储和更高的并发访问量。
三、Python连接Redis
我将Python连接Redis的各类常用操作封装为了一个Class,使用的时候直接调用相关方法即可:
import redisclass RedisOperator:def __init__(self, host='localhost', port=6379, db=0, password='yj123'):"""初始化Redis连接:param host: Redis服务器主机地址,默认为localhost:param port: Redis服务器端口号,默认为6379:param db: 要使用的数据库编号,默认为0:param password: 密码"""self.r = redis.StrictRedis(host=host, port=port, db=db, password=password)# 字符串操作相关方法def set_string_value(self, key, value):"""设置字符串类型的键值对:param key: 键:param value: 值:return: 设置操作是否成功"""return self.r.set(key, value)def get_string_value(self, key):"""获取字符串类型键对应的值:param key: 键:return: 对应的值,如果不存在则返回None"""result = self.r.get(key)return result.decode('utf-8') if result else None# 列表操作相关方法def push_list_value(self, list_key, value, right=True):"""向列表右侧/左侧添加元素:param list_key: 列表的键:param value: 要添加的元素:param right: 右侧:return: 列表长度"""return self.r.rpush(list_key, value) if right else self.r.lpush(list_key, value)def get_list_range(self, list_key, start=0, end=-1):"""获取列表指定范围内的元素:param list_key: 列表的键:param start: 起始索引:param end: 结束索引:return: 元素列表(字节类型元素组成的列表)"""return self.r.lrange(list_key, start, end)# 哈希操作相关方法def set_hash_value(self, hash_key, field, value):"""在哈希表中设置键值对:param hash_key: 哈希表的键:param field: 哈希表中的字段:param value: 对应的值:return: 成功设置的字段数量"""return self.r.hset(hash_key, field, value)def get_hash_value(self, hash_key, field):"""获取哈希表中指定字段的值:param hash_key: 哈希表的键:param field: 哈希表中的字段:return: 对应的值,如果不存在则返回None"""result = self.r.hget(hash_key, field)return result.decode('utf-8') if result else Nonedef get_multiple_hash_values(self, hash_key, fields):"""获取哈希表中多个字段的值:param hash_key: 哈希表的键:param fields: 字段列表:return: 对应的值列表(字节类型元素组成的列表)"""return self.r.hmget(hash_key, fields)# 集合操作相关方法def add_set_value(self, set_key, value):"""向集合中添加元素:param set_key: 集合的键:param value: 要添加的元素:return: 如果元素是新添加的返回1,否则返回0"""return self.r.sadd(set_key, value)def get_set_members(self, set_key):"""获取集合中的所有元素:param set_key: 集合的键:return: 元素列表(字节类型元素组成的列表)"""return list(self.r.smembers(set_key))# 有序集合操作相关方法def add_zset_value(self, zset_key, mapping):"""向有序集合中添加元素(可批量添加,以字典形式传入元素和分数):param zset_key: 有序集合的键:param mapping: 元素和对应分数的字典,例如 {'element1': score1, 'element2': score2}:return: 添加的元素数量"""return self.r.zadd(zset_key, mapping)def get_zset_range(self, zset_key, start=0, end=-1, withscores=False):"""获取有序集合指定范围内的元素:param zset_key: 有序集合的键:param start: 起始索引:param end: 结束索引:param withscores: 是否同时获取元素对应的分数,默认为False:return: 如果with_scores为False,返回元素列表(字节类型元素组成的列表);如果with_scores为True,返回元素和分数的元组组成的列表"""if withscores:return self.r.zrange(zset_key, start, end, withscores=withscores)return self.r.zrange(zset_key, start, end)def delete_key(self, key):"""删除指定的键:param key: 要删除的键:return: 删除成功返回True,否则返回False"""return self.r.delete(key)
以下使用unittest框架对RedisOperator类进行测试:
import unittestclass TestRedisOperator(unittest.TestCase):def setUp(self):self.redis_op = RedisOperator()# 测试字符串操作相关方法def test_set_string_value(self):result = self.redis_op.set_string_value("name", "James")self.assertEqual(isinstance(result, bool), True)def test_get_string_value(self):self.redis_op.set_string_value("name", "James")result = self.redis_op.get_string_value("name")self.assertEqual(result, "James")# 测试列表操作相关方法def test_push_list_value(self):result = self.redis_op.push_list_value("name_list", "James", right=True)self.assertEqual(isinstance(result, int), True)result = self.redis_op.push_list_value("name_list", "Bob", right=False)self.assertEqual(isinstance(result, int), True)def test_get_list_range(self):result = self.redis_op.get_list_range("name_list")self.assertEqual(isinstance(result, list), True)# 测试哈希操作相关方法def test_set_hash_value(self):result = self.redis_op.set_hash_value("hash_key1", "name", "James")self.assertEqual(isinstance(result, int), True)def test_get_hash_value(self):self.redis_op.set_hash_value("hash_key1", "name", "James")result = self.redis_op.get_hash_value("hash_key1", "name")self.assertEqual(result, "James")def test_get_multiple_hash_values(self):hash_key = "hash_key2"fields = ["field1", "field2"]values = ["value1", "value2"]for field, value in zip(fields, values):self.redis_op.set_hash_value(hash_key, field, value)result = self.redis_op.get_multiple_hash_values(hash_key, fields)self.assertEqual(isinstance(result, list), True)# 测试集合操作相关方法def test_add_set_value(self):result = self.redis_op.add_set_value("name_set", "James")self.assertEqual(isinstance(result, int), True)result = self.redis_op.add_set_value("name_set", "Bob")self.assertEqual(isinstance(result, int), True)def test_get_set_members(self):result = self.redis_op.get_set_members("name_set")self.assertEqual(isinstance(result, list), True)# 测试有序集合操作相关方法def test_add_zset_value(self):result = self.redis_op.add_zset_value("score_zset", {"James": 86, "Bob": 90, "Alice": 65})self.assertEqual(isinstance(result, int), True)def test_get_zset_range(self):result = self.redis_op.get_zset_range("score_zset")self.assertEqual(isinstance(result, list), True)def test_get_zset_range_with_scores(self):result = self.redis_op.get_zset_range("score_zset", withscores=True)self.assertEqual(isinstance(result, list), True)# 测试删除键操作def test_delete_key(self):for key in ["name", "name_list", "hash_key1", "hash_key2", "name_set", "score_zset"]:result = self.redis_op.delete_key(key)self.assertEqual(isinstance(result, int), True)if __name__ == '__main__':unittest.main()
四、总结
Redis是一个不错的缓存工具,可以作为应用程序和后端数据库之间的缓存层,把频繁访问的数据放在Redis,可以大大减少对后端数据库的访问压力。
Redis中的有序列表、Pub/Sub功能也可以用来实现简单的消息队列系统,例如用于异步处理任务、解耦系统组件等。
Redis中的有序集合可以实现排行榜功能,能够实时更新排名数据并快速查询排名情况。
Redis的原子特性可以用来实现计数器功能,如网站的访问量计数、用户点赞数计数等,能够保证在高并发情况下计数的准确性。
相关文章:

linux安装redis及Python操作redis
目录 一、Redis安装 1、下载安装包 2、解压文件 3、迁移文件夹 4、编译 5、管理redis文件 6、修改配置文件 7、启动Redis 8、将redis服务交给systemd管理 二、Redis介绍 1、数据结构 ①字符串String ②列表List ③哈希Hash ④集合Set ⑤有序集合Sorted Set 2、…...

node.js内置模块之---stream 模块
stream 模块的作用 在 Node.js 中,stream 模块是一个用于处理流(stream)的核心模块。流是一种处理数据的抽象方式,允许程序处理大量数据时不会一次性将所有数据加载到内存中,从而提高性能和内存效率。通过流࿰…...

《learn_the_architecture_-_aarch64_exception_model》学习笔记
1.当发生异常时,异常级别可以增加或保持不变,永远无法通过异常来转移到较低的权限级别。从异常返回时,异常级别可能会降低或保持不变,永远无法通过从异常返回来移动到更高的权限级别。EL0级不进行异常处理,异常必须在比…...

【C++项目实战】贪吃蛇小游戏
一、引言 贪吃蛇,这款经典的电子游戏,自1976年诞生以来,一直受到全球玩家的喜爱。它的规则简单,玩法直观,但同时也充满了挑战性。在这篇文章中,我们将一起探索如何开发一个贪吃蛇游戏,无论是作为…...
Python基于matplotlib实现树形图的绘制
在Python中,你可以使用matplotlib库来绘制树形图(Tree Diagram)。虽然matplotlib本身没有专门的树形图绘制函数,但你可以通过组合不同的图形元素(如线条和文本)来实现这一点。 以下是一个简单的示例&#…...

【UE5 C++课程系列笔记】21——弱指针的简单使用
目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中,弱指针(TWeakPtr )也是一种智能指针类型,主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下,提供一种可…...

【游戏设计原理】46 - 魔杖
幻想,人们可以通过多种形式来引发,比如文字,图片,绘画,语言等,但游戏与以上这些形式的区别,正如游戏与其他艺术形式的区别一样,游戏作为一种艺术和娱乐形式,其独特之处在…...
【路径跟踪】PIDMPC
路径跟踪(Path Tracking)是指在实际行驶过程中,根据预先规划好的路径进行控制,能够沿着设定的路径行驶。常见的路径跟踪算法包括基于模型的控制方法(如PID控制器)、模型预测控制(Model Predicti…...

Spring源码分析之事件机制——观察者模式(二)
目录 获取监听器的入口方法 实际检索监听器的核心方法 监听器类型检查方法 监听器的注册过程 监听器的存储结构 过程总结 Spring源码分析之事件机制——观察者模式(一)-CSDN博客 Spring源码分析之事件机制——观察者模式(二ÿ…...

热备份路由HSRP及配置案例
✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网路安全入门系列 目录 一,HSRP的相关概念二,…...
仿生的群体智能算法总结之三(十种)
群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是30种常见的群体智能算法,本文汇总第21-30种。接上文 : 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swar…...
CentOS 7系统 OpenSSH和OpenSSL版本升级指南
文章目录 CentOS 7系统 OpenSSH和OpenSSL版本升级指南环境说明当前系统版本当前组件版本 现存安全漏洞升级目标版本升级准备工作OpenSSL升级步骤1. 下载和解压2. 编译安装3. 配置环境 OpenSSH升级步骤1. 下载和解压2. 编译安装3. 创建systemd服务配置4. 更新SSH配置文件5. 设置…...

【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下,跨境电商行业正以前所未有的态势重塑国际贸易格局,成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》,…...
【Ubuntu】不能连上网络
1. ping路由器的IP地址 ping 192.168.1.1 如果ping不通的话,可能是网络故障导致的。需要重启配置ip地址。配置文件 sudo vi /etc/network/interface 2. ping 8.8.8.8 如果ping不通的话,可能是路由器不能链接往外网; 或者路由器显示了当…...
CSS3 框大小
CSS3 框大小 CSS3 是网页设计和开发中不可或缺的一部分,它为开发者提供了更多样化、更灵活的样式和布局选择。在 CSS3 中,框大小(Box Sizing)是一个重要的概念,它决定了元素内容的宽度和高度以及元素整体的大小。本文将详细介绍 CSS3 框大小的概念、用法以及最佳实践。 …...

联发科MTK6771/MT6771安卓核心板规格参数介绍
MT6771,也被称为Helio P60,是联发科技(MediaTek)推出的一款中央处理器(CPU)芯片,可运行 android9.0 操作系统的 4G AI 安卓智能模块。MT6771芯片采用了12纳米工艺制造,拥有八个ARM Cortex-A73和Cortex-A53核心,主频分别…...
python中的时间模块--datetime模块、time模块
python中的时间模块 一.datetime模块二.time模块 一.datetime模块 引入时间模块 from datetime import datetime获取当前时间 print(datetime.today()) # 前的日期和时间 print(datetime.now()) # 当前的日期和时间 print(datetime.now().year) # 当前的年份 print(datetime…...

CV 处理全流程:从数据采集到模型部署的整个过程,体现全面性
CV 处理全流程:从数据采集到模型部署的整个过程,体现全面性 Numpy广播 OpenCV - Python归一化提取ROI(感兴趣区域)分离和合并通道 Pytorch 基础算子自动梯度计算 CV 全流程图像数据采集1. 确认目标2. 分析过程(使用目标-手段分析法࿰…...

OWASP ZAP之API 请求基础知识
ZAP API 提供对 ZAP 大部分核心功能的访问,例如主动扫描器和蜘蛛。ZAP API 在守护进程模式和桌面模式下默认启用。如果您使用 ZAP 桌面,则可以通过访问以下屏幕来配置 API: Tools -> Options -> API。 ZAP 需要 API 密钥才能通过 REST API 执行特定操作。必须在所有 …...

南京观海微电子----GH7009国宇测试盒使用
1. SPI接线 针对7009: 2. 国宇上位机代码准备 在主函数首尾两端加入IO2时序控制的代码、以及国语SPI有效位控制的代码(请注意7009和其他700x使用的有效位控制不一致,需要用哪一款加入哪一行即可): 三、国宇SPI读的使…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...