Redis学习笔记
redis的基本概念
Redis是一款由c语言编写的开源的基于键值对存储数据的非关系型数据库。redis的数据类型有字符串(str)、列表(list)、哈希(hash)、集合(set)、有序集合(sorted set)。一个redis服务默认有16个数据库,序号为0-15。
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 redis
def 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 redis
def 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节点连接在一起,以实现高可用性、数据分片和负载均衡的技术
优点:高可用性,任一节点故障不影响服务;数据分片,突破单节点内存限制,存储更大规模数据;负载均衡,分摊节点压力,提高响应能力。
缺点:配置管理相对复杂;数据迁移和扩容操作需谨慎处理,避免影响业务;可能存在数据分布不均等问题
学海无涯
原文地址:https://blog.csdn.net/Test_the_rookie/article/details/145285466
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!