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的原子特性可以用来实现计数器功能,如网站的访问量计数、用户点赞数计数等,能够保证在高并发情况下计数的准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线RSA pem 密钥pkcs1转pkcs8格式--支持公钥和私钥

具体前往:在线RSA密钥pkcs1转pkcs8--在线将RSA私钥/公钥的pkcs1格式转换到pkcs8格式,支持pem格式

修复OpenLinkSaas客户端在使用AtomGit账号时页面崩溃

问题描述:当一个新的AtomGit用户登录OpenLinkSaas客户端后出现了页面崩溃。 从浏览器控制台来看,是gitNoticeList出现了null。 查看代码后发现是请求atomGit api是返回的一个null的列表 接下来我们加下保护性的代码,来兼容null或undefine的情…

rocketmq-pull模式-消费重平衡和拉取PullTaskImpl线程

1、观察consumer的线程模型 使用arthas分析 MQClientFactoryScheduledThread 定时任务线程 (和push模式一致) 定时任务线程,包含如下任务: 每2分钟更新nameServer列表 每30秒更新topic的路由信息 每30秒检查broker的存活&#x…

Ungoogled Chromium127 编译指南 MacOS 篇(二)- 项目要求

1. 引言 在开始编译 Ungoogled Chromium 之前,我们需要确保系统满足所有必要的硬件和软件要求。由于浏览器编译是一个资源密集型的任务,合适的硬件配置和完整的软件环境至关重要。本文将详细介绍编译 Ungoogled Chromium 所需的各项要求。 2. 硬件要求…

51单片机——共阴数码管实验

数码管中有8位数字,从右往左分别为LED1、LED2、...、LED8,如下图所示 如何实现点亮单个数字,用下图中的ABC来实现 P2.2管脚控制A,P2.3管脚控制B,P2.4管脚控制C //定义数码管位选管脚 sbit LSAP2^2; sbit LSBP2^3; s…

调试:用电脑开发移动端网页,然后用手机真机调试

一、背景 电脑开发移动端,然后想真机调试... 二、实现 2.1、电脑和手机链接相同局域网 2.2、pnpm run dev 启动项目 2.3、浏览器访问 localhost:3001/login 2.4、Windowsr 输入cmd,在cmd输入 ipconfig 2.5、浏览器访问 ip地址加/login 2.6、手机端…

Kbuild学习知识点

1.Kbuild本质:一个可扩展、可配置的Makefile框架,递归式Makefile,菜单式配置。 2.Kbuild构成: Makefile:顶层目录下的Makefile.config:内核的配置文件arch/S(ARCH)/Makefile:跟平台架构相关的Makefilescripts/Makefile.*:通用编…

《Vue3实战教程》39:Vue3无障碍访问

如果您有疑问,请观看视频教程《Vue3实战教程》 无障碍访问​ Web 无障碍访问 (也称为 a11y) 是指创建可供任何人使用的网站的做法——无论是身患某种障碍、通过慢速的网络连接访问、使用老旧或损坏的硬件,还是仅处于某种不方便的环境。例如,…

抢先体验:人大金仓数据库管理系统KingbaseES V9 最新版本 CentOS 7.9 部署体验

一、简介 KingbaseES 是中国人大金仓信息技术股份有限公司自主研发的一款通用关系型数据库管理系统(RDBMS)。 作为国产数据库的杰出代表,它专为中国市场设计,广泛应用于政府、金融、能源、电信等关键行业,以高安全性…

基于 GitHub API 的 Issue 和 PR 自动化解决方案

文章目录 摘要引言优化 Issue 和 PR 管理的方法工具选择流程优化 自动化 Issue 和 PR 管理代码逻辑详解获取 Issue 数据为 Issue 添加标签将 Issue 分配给开发者主逻辑 实际运行效果进一步扩展QA 环节总结参考资料 摘要 在开源项目中,Issue 和 Pull Request&#x…

趣味编程:心形曲线

目录 1.序言 2.代码展示 3.代码详解 3.1 头文件包含 3.2 绘制坐标轴函数 3.3 main 函数主体部分 4. 小结 1.序言 2025年的第一篇博客就用这个笛卡尔心形图开篇吧,寓意着新年大家能够有心有所属,祝诸位程序猿 / 程序媛 能够早点遇到自己的另一半。…

安装和配置 Apache 及 PHP

安装和配置 Apache 及 PHP # 1. 停止当前 Apache 服务 sudo apachectl stop# 2. 清除现有的 Apache 配置和文件 sudo rm -rf /etc/apache2 sudo rm -rf /usr/sbin/httpd sudo rm -rf /Library/WebServer# 3. 使用 Homebrew 安装 Apache brew install httpd# 4. 启动 Apache su…

解决uniapp H5页面限制输入框只能输数字问题

工作记录 最最近在做 uniapp 开发的移动端 H5 页面,有个需求是金额输入框只能输入数字,不能输入小数点和其他字符,经过各种尝试,发现其他字符可以通过正则过滤掉,但是输入小数点的话,因为没有触发 input 和…

group by 执行顺序

后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 感谢各位大佬写的文章让我学到很多东西!只是在各位大佬的基础加了我自己的思路&a…

通过爬虫方式实现视频号助手发布视频

1、将真实的cookie贴到解压后目录中cookie.txt文件里,修改python代码里的user_agent和video_path, cover_path等变量的值,最后运行python脚本即可; 2、运行之前根据import提示安装一些常见依赖,比如requests等; 3、2025年1月份最新版; 代码如下: import json import…

Docker入门常用命令总结

1.从远程仓库拉取一个纯净的镜像 docker pull docker .io/centos 2.创建并进入容器(左外右内) docker run --name xxx -dit 镜像id(镜像名称:Tag) /bin/bash 【参数必须放在镜像ID之前】 -i 让Docker分配一个伪终端,并…

初学stm32 --- FSMC驱动LCD屏

目录 FSMC简介 FSMC框图介绍 FSMC通信引脚介绍 FSMC_NWE 的作用 FSMC_NWE 的时序关系 FSMC_NOE 的含义 FSMC_NOE 的典型用途 FSMC_NOE 的时序关系 使用FSMC驱动LCD FSMC时序介绍 时序特性中的 OE ILI9341重点时序: FSMC地址映射 HADDR与FSMC_A关系 LCD的…

CSS系列(47)-- Animation Timeline详解

前端技术探索系列:CSS Animation Timeline详解 ⏱️ 致读者:探索动画时间线的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Animation Timeline,这个强大的动画控制特性。 基础概念 🚀 时间线定义 …

Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)

文章目录 概述步骤 1: 安装 Nginx 和 Lua 模块步骤 2: 创建 Lua 脚本用于参数校验步骤 3: 配置 Nginx 使用 Lua 脚本写法二: 状态码写法三 : 返回自定义JSON复杂的正则校验 步骤 4: 测试和验证ngx.HTTP_* 枚举值 概述 一个不使用 OpenResty 的 Nginx 集…

GRAPE——RLAIF微调VLA模型:通过偏好对齐提升机器人策略的泛化能力(含24年具身模型汇总)

前言 24年具身前沿模型大汇总 过去的这两年,工作之余,我狂写大模型与具身的文章,加之具身大火,每周都有各种朋友通过CSDN私我及我司「七月在线」寻求帮助/指导(当然,也欢迎各大开发团队与我司合作共同交付&#xff09…