Redis学习笔记

devtools/2025/1/23 13:30:16/

redis_0">redis的基本概念

Redis是一款由c语言编写的开源的基于键值对存储数据的非关系型数据库。redis的数据类型有字符串(str)、列表(list)、哈希(hash)、集合(set)、有序集合(sorted set)。一个redis服务默认有16个数据库,序号为0-15。

redis_3">redis部署

拉取镜像:docker pull redis
启动容器:docker run -d --name myredis -p 6379:6379 -v /my/local/data:/data --restart always -e REDIS_PASSWORD=mypassword redis:latest
其中6379为redis默认的端口号,-v 是设置挂载,将主机上的目录 /my/local/data 挂载到容器内的 /data 目录。这通常用于持久化数据。–restart always: 这个选项配置了容器的重启策略。always 表示无论容器因何种原因停止,Docker 都会自动重新启动它。-e REDIS_PASSWORD=mypassword: 这个选项设置了一个环境变量 REDIS_PASSWORD,其值为 mypassword。这通常用于配置 Redis 的密码认证。

进入redis-cli:docker exec -it myredis redis-cli --raw ,–raw 指令是是为了正常展示中文。
验证服务是否成功启动:在redis-cli界面输入 ping,如果返回pong,则表示服务成功启动。

数据类型介绍

字符串类型(String)
在 Redis 中以二进制保存,没有编码和解码的过程。无论存入的是字符串、整数、浮点类型都会以字符串写入。字符串类型的值最多可以容纳的数据长度是 512M。
列表类型(List)
元素可以重复,元素是有索引号的,有先后顺序。列表中的每个元素都是一个字符串。
集合类型(Set)
元素是不可重复的,元素没有索引号,没有先后顺序。集合中的元素也是字符串类型。
散列类型(Hash)
值由多个键值对组成。每个键值对中的键和值都是字符串类型。
有序集合类型(Zset/Sorted Set)
元素不可重复,每个元素有索引号,还有一个分数值,可以根据分数进行排序。

Redis的基本操作

【键操作】
查看所有键:执行命令 keys * ,该命令会返回当前数据库中的所有键。
统计键的数量:dbsize,返回当前数据库中的键数量。
判断键是否存在:exists key ,键存在返回1,不存在返回0。
查看指定键的类型:type key_name,返回指定键的类型。

【字符串操作】
设置键值:set key value,如果key不存在,则新建key设置对应的值;如果key存在,便是更新key对应的值。
批量设置键值:mset key1 value1 key2 value2 …,批量设置键值对。
删除指定的键:del key_name1 key_name2 …,删除指定的key。
移动key到指定库:move key_name 2,可以将指定的key移动到编号为2的数据库。
获取指定键值:get key_name,返回指定键的值。
批量获取键值:mget key_name1 key_name2 …,批量返回键值。
设置字符串为数值的键递增或是递减:incr key 让key的值在原有基础+1;decr key的值在原有基础-1。 注意!key的值需要为数值。
设置键值的过期时间: set key value ex 5,该命令表示设置的值会在5s后失效。ex是设置失效时间为秒,如果是px,则是毫秒。

【列表操作】
将值插入列表头部:lpush list_name value1 value2 value3,在列表头部插入数据,插入后的顺序为 value3 value2 value1。
将值插入列表尾部:rpush list_name value1 value2 value3,在列表尾部插入数据,插入后的顺序为value1 value2 value3.
查看列表长度:llen list_name,返回指定列表的长度
查看列表所有元素:lrange list_name 0 -1 开始索引 结尾索引,返回指定索引的元素。
获取指定索引的元素:lindex list_name 1,返回索引为1的元素。
给指定索引设置元素:lset list_name 1 tom,给索引1的元素设置值为tom。
移除顶部元素并将移除的元素返回:lpop list_name,如果列表元素为空,则会返回nil。
移除尾部元素并将移除的元素返回:rpop list_name。
移除并获取列表顶部元素:blpop list_name 5,如果列表为空,就会一直等待列表有数据后(此时处于阻塞状态),才会将元素抛出;设置等待时间之后,超过设置的等待时间才会中断阻塞。
移除并获取尾部元素:brpop list_name 5。
保留指定索引的元素:ltrim mylist 0 2,截取指定索引的元素,其余元素均会被移除。
移除列表中与指定值相等的元素: lrem mylist count value,如果 count > 0,则从列表头部开始移除最多 count 个等于 value 的元素。如果 count < 0,则从列表尾部开始移除最多 |count| 个等于 value 的元素。如果 count = 0,则移除所有等于 value 的元素。

【集合操作】
创建集合: sadd myset 1 2 3,创建一个集合。
获取集合长度:scard myset,返回myset集合的长度。
获取所有元素:smembers myset,返回指定集合的所有元素。
判断元素是否属于集合:sismember myset 1,元素1属于集合myset返回1,不属于返回0。
移除元素:srem myset 1 2 3,移除集合中的指定元素。

【有序集合】
创建集合:zadd mysortset 0 tom 1 jak,创建有序集合需要给元素指定下标。
获取集合长度:zcard mysortset ,返回有序集合的长度。
获取所有元素:zrange mysortset 0 -1,返回指定索引的元素。
移除元素: zrem mysortset tom,移除指定的元素。

【hash】
设置字段值:hset key field value 命令用于设置哈希表中指定字段的值;hmset key field1 value1 [field2 value2 …] 命令可一次设置多个字段的值
获取字段值:hget key field 命令可获取哈希表中指定字段的值;hmget key field1 [field2 …] 命令可一次获取多个字段的值。
获取所有字段值:hgetall myhash ,命令可返回哈希表中所有字段及其对应的值
删除字段:hdel key field [field …] 命令可删除哈希表中的一个或多个字段。
获取字段数量:hlen key 命令可获取哈希表中字段的数量。

事务

概念redis事务是通过将多个命令打包,然后一次性、按顺序执行。在事务执行期间,不会主动中断,服务器会在执行完事务中的所有命令之后,才会继续处理其他客户端的命令请求。事务可以保证数据的一致性和原子性,要么全部成功,要么全部回滚。

开启事务:使用 MULTI 命令开启一个事务,该命令会将 Redis 连接设置为事务模式。
执行命令:在事务中,按照需要执行一系列的 Redis 命令,包括数据的修改、删除等操作,这些命令将被缓存到事务队列中,但不会立即执行。
提交事务:使用 EXEC 命令提交事务,Redis 会按照事务中的命令顺序依次执行。
撤销事务:如果在执行事务过程中发生错误或者需要回滚操作,可以使用 DISCARD 命令来撤销事务,这将清空事务队列中的所有命令。
在这里插入图片描述

发布/订阅功能

概念:Redis 的发布/订阅机制是一种消息通信模式,允许发送者(发布者)发送消息到特定的频道,而接收者(订阅者)可以订阅一个或多个频道来接收消息。这种机制常用于实时消息系统、通知系统等场景
发布者代码

import redisdef publish_message(channel, message):r = redis.StrictRedis(host='localhost', port=6379, db=0)r.publish(channel, message)print(f"Message '{message}' published to channel '{channel}'")if __name__ == "__main__":channel = "news"message = "Hello, Redis!"publish_message(channel, message)

订阅者代码

import redisdef subscribe_to_channel(channel):r = redis.StrictRedis(host='localhost', port=6379, db=0)pubsub = r.pubsub()pubsub.subscribe(channel)print(f"Subscribed to channel '{channel}'")for message in pubsub.listen():if message['type'] == 'message':print(f"Received message: {message['data'].decode('utf-8')}")if __name__ == "__main__":channel = "news"subscribe_to_channel(channel)

持久化功能

RDB 持久化
原理:RDB 通过将 Redis 内存中的数据以二进制文件的形式保存到磁盘上。在指定的时间间隔内,对数据进行快照存储,生成一个包含当前数据库状态的文件。

AOF 持久化
原理:AOF 记录服务器接收到的每一个写操作命令,并将这些命令追加到文件的末尾。当 Redis 重启时,会读取 AOF 文件中的命令并重新执行,以此来恢复数据。

混合持久化(Hybrid Persistence)
原理:从 Redis 4.0 开始引入,结合了 RDB 和 AOF 的优点。在 Redis 启动时,优先使用 AOF 文件来恢复数据,如果没有 AOF 文件,则回退到 RDB 文件进行恢复。在运行过程中,同时记录 RDB 快照和 AOF 日志,当 AOF 日志过大时,会自动触发 AOF 重写,并将重写后的 AOF 文件作为新的数据恢复源

主从复制和集群

【Redis主从复制】
定义:Redis主从复制是指将一台Redis服务器(主节点)的数据,复制到一个或多个不同Redis服务器(从节点)。数据复制是单向的,只能由主节点到从节点

优点:实现数据冗余,提高数据可靠性;读写分离,提升系统性能;为主从复制和哨兵模式提供基础,保障高可用性。

缺点:主节点故障时,需手动切换从节点为新主节点,且故障恢复时间长;主节点写操作可能成为性能瓶颈;无法实现数据分片和负载均衡。

【Redis集群】
定义:Redis集群是一种通过将多个Redis节点连接在一起,以实现高可用性、数据分片和负载均衡的技术
优点:高可用性,任一节点故障不影响服务;数据分片,突破单节点内存限制,存储更大规模数据;负载均衡,分摊节点压力,提高响应能力。

缺点:配置管理相对复杂;数据迁移和扩容操作需谨慎处理,避免影响业务;可能存在数据分布不均等问题

                                                                                  学海无涯

http://www.ppmy.cn/devtools/152889.html

相关文章

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块&#xff0c;主要模式如下图&#xff1a; 上节说到&#xff0c;我们需要用到AT固件进行局域网应用&#xff08;ESP8266连接的STM32和手机进行连接&#xff09;。 ESP8266为一个WiFi透传模块&#xff0c;和…

支付宝八折事件启示录:用户体验与风险管理的平衡艺术

作为一名长期关注支付系统的技术从业者&#xff0c;2025年1月16日这天发生的支付宝"八折事件"给了我很多思考。这不仅仅是一个简单的系统故障&#xff0c;更是一个关于如何平衡用户体验与风险管理的典型案例。 从用户视角看事件 还记得那天下午&#xff0c;我的朋友…

通过frm和ibd文件恢复mysql数据

1.提取所有的文件名并查找出以frm结尾的 dir /t /b >1.txt 2.要准备的软件 1.mysql-utilities-1.6.5-winx64.msi 2.vcredist_x64.exe(c 2013) 3.利用frm生成sql文件 mysqlfrm --serverroot:123456localhost:3306 --port3308 D:\phpstudy_pro\Extensions\MySQL5.7.26\da…

数据库高可用方案-07-一致性校验

数据库数据高可用系列 数据库高可用方案-01-数据库备份还原方案 数据库高可用方案-02-多机房部署 数据库高可用方案-03-主备等高可用架构 数据库高可用方案-04-删除策略 数据库高可用方案-05-备份与恢复 数据库高可用方案-06-监控与报警 数据库高可用方案-07-一致性校验…

简识JVM的栈帧优化共享技术

栈帧优化共享技术是Java虚拟机&#xff08;JVM&#xff09;中的一种优化手段&#xff0c;主要用于提高程序的运行效率和节约内存空间。以下是对栈帧优化共享技术的详细解析&#xff1a; 一、栈帧的基本概念 在JVM中&#xff0c;栈帧&#xff08;Stack Frame&#xff09;是方法…

【深度学习基础】多层感知机 | 模型选择、欠拟合和过拟合

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

Spring 6 第6章——单元测试:Junit

一、整合JUnit5 在之前的测试方法中&#xff0c;几乎都能看到以下两行代码&#xff1a; ApplicationContext context new ClassPathXmlApplicationContext("xxx.xml"); Xxxx xxx context.getBean(Xxxx.class); 这两行代码的作用是创建Spring容器&#xff0c;最终…

堆的实现(C语言详解版)

一、堆的概念 1.概念 堆&#xff08;Heap&#xff09;是一种特殊的完全二叉树&#xff0c;它满足父节点的值总是不大于或不小于其子节点的值。这种数据结构常用于实现优先队列&#xff0c;以及在各种排序算法中快速找到最大或最小元素。 堆分为两种类型&#xff1a;最大堆和…