redis 学习笔记
redis 的数据类型
ps :redis 区分大小写 键(key)的名称、哈希(hash)字段的名称、集合(set)成员的名称等地方,大小写是敏感的。
数据类型 | 命令格式1 | 命令格式2 | 3 | 4 | 5 | 6 | 7 ps:(到期错误代码-2,不存在-1) |
---|---|---|---|---|---|---|---|
string | append key value | (自减1) decr key | (自增1)incr key | decrby key decrement 删除到 … | strlen key (统计包括空格) | MSET GETSET: 设置已有的键的值 | setex key second value 创建键值并设置有效期秒 expire key second 为已有的键值设置有效期 TTL key 查看剩余有效期 |
hash | HSET KEY failed value | HGET KEY FAILED | HMSET KEY FAILED VALUE [FAILED VALUE ] | HMSET KEY FAILED [FAILED]… | EXPIRE hash_key_name time_in_seconds | HGETALL KEY 获取所有字段和值 | HKEYS KEY 获取所有 字段 |
list | LPUSH KEY 添加一个或多个 值 | LPOP KEY 从左侧取出第一个值 | RPUSH KEY | RPOP KEY | LRANG STAR AND END 返回一段内所有的元素 | BL/RPOP KEY TIMEOUT 阻塞 N秒之后退出 除非 KEY 有值 | |
set(集合) | SADD KEY MEMBER 添加一个或多个元素 | SREM KEY MEMBER 移除指定的元素 | SCRAD KEY 返回个数 | SISMEMBER KEY MEMBER 判断是否存在于set中 | SMEMBERS 获取set中的所有元素 | SINTER/SDIFF KEY1 KEY2 求交集 差集 | SUNION KEY1 KEY2 求并集 |
SortedSet |
ps: EXPIRE hash_key_name time_in_seconds 在使用记时 删除 hash 时 ,在哈希表的键过期后,Redis 将自动删除与该键关联的哈希表数据。
需要注意的是,仅设置键的过期时间并不能直接影响哈希表中的字段(Field)的过期。如果需要对哈希表中的特定字段设置过期时间,你需要手动处理或使用其他方式实现。
另外,当哈希表的所有字段都过期后,哈希表本身并不会自动删除。Redis 中的空哈希表将保留在内存中,直到有新的字段被添加进来或手动删除该哈希表。
set: 无序 ,不可重复,查找快,支持 交并补等功能
数据持久化
常见的持久化方式: a、基于快照的方式:redis安装一定的周期把内存里面的数据同步到磁盘文件里面 b、基于文件追加:redis会把对redis数据造成更改的命令记录到日志文件里面,然后再一次重启,执 行日志文件里面对redis写的操作,达到数据还原。
redis的主从同步
主从复制的作用:
1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗
余。
3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写
Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场
景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4. 读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可
根据需求的变化,改变从库的数量;
5. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高
可用的基础
内
Redis 主从复制过程:
➢ Slave 与 master 建立连接,发送 sync 同步命令
➢ Master 会启动一个后台进程,将数据库快照保存到文件中,同时 master 主进程会开始收集新的写 命令并缓存。
➢ 后台完成保存后,就将此文件发送给 slave
➢ Slave 将此文件保存到硬盘上 一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级 服务器集群架构 比如,将ip为192.168.1.10的机器作为主服务器,将ip为192.168.1.11的机器作为从服务器 设置主服务器的配置
redis主从复制操作:
在从服务器上操作
vim /etc/redis/redis.conf(一般在这,也有可能在上一级)
找到 bind IP
换行添加 slaveof 主IP 端口号(默认6379)
ps: 如果主服务器上边配置有密码则需要
masterauth 123456 (验证master的密码,此密码为master的密码 /etc/redis/redis.conf)
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0 -- 说明没有连接上从服务器
.....
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1 --连接成功 从服务器数1
slave0:ip=192.168.126.141,port=6379,state=online,offset=98,lag=0
发布订阅
作用
- 实时消息传递:当一个客户端向订阅的频道发布消息时,所有订阅了该频道的客户端将立即接收到消息。这使得实时消息传递成为可能,适用于即时聊天、实时通知和在线协作等场景。
- 事件通知:当事件发生时,发布者可以通过将事件消息发布到相应的频道,通知所有订阅了该频道的客户端。这对于实现事件驱动架构和实时数据更新非常有用。
- 实时数据更新:当数据在后端发生变化时,可以将数据更改的消息发布到相应的频道,然后前端订阅了该频道的客户端可以实时地获取最新数据,无需主动轮询后端。
- 消息广播:发布/订阅模型使得向多个订阅者广播消息变得简单高效。这在需要将一条消息传递给多个客户端时非常有用。
订阅
SUBSCRIBE 频道名称1 [频道名称2..]
取消订阅
UNSUBSCRIBE 频道名称1 [...] 不写名称则取消所有
发布
PUBLISH 频道名称 消息
案例
192.168.126.140:6379(主)> publish chan1 hello
(integer) 0
192.168.126.141:6379(从)> SUBSCRIBE chan1
Reading messages... (press Ctrl-C to quit)
1) "subscribe" --订阅成功
2) "chan1" -- 频道名
3) (integer) 1 -- 订阅频道数量
1) "message"
2) "chan1"
3) "hello"
ps:在 Redis 的发布/订阅(Pub/Sub)模式中,消息的发布(发送)操作只能由 Redis 的主服务器执行,从服务器不能执行发布操作。
5)事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
▪ 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程 中,不会被其他客户端发送来的命令请求所打断。
▪ 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。 一个事务从开始到执行会经历以下三个阶段:
▪ 开始事务。multi
▪ 命令入队。
▪ 执行事务
序号 | 命令及描述 |
---|---|
1 | DISCARD 取消事务,放弃执行事务块内的所有命令。 |
2 | EXEC 执行所有事务块内的命令。 |
3 | MULTI 标记一个事务块的开始。 |
4 | UNWATCH 取消 WATCH 命令对所有 key 的监视。 |
5 | WATCH key [key …] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他 命令所改动,那么事务将被打断。 |
多数据库
redis也是有数据库的,默认已经创建好,一共有16个,分别为0,1,2,…15 redis默认数据操作是在0号数据库上。 数据库和数据库之间不能共享键值对。
切换数据库
select 1 //切换到1号数据库
把键值移到指定数据库
move address 0 //假定当前为1号数据库,将1号数据库address移到0号数据库
清空当前数据库:flushdb
清空服务器所有数据库:flushall
注意:清空数据库慎用!!!
Redis 练习题
-
Redis中的数据类型有哪些?请简要描述每种数据类型的用途。
Redis中的数据类型有:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set)和位图(bitmap)。它们的用途如下: 字符串:存储单个值。 哈希:存储字段-值对的映射。 列表:按照插入顺序存储一个有序的值列表。 集合:存储唯一的、无序的成员集合。 有序集合:存储唯一的成员集合,并为每个成员分配一个分数,以便根据分数进行排序。 位图:用于位级操作和位级存储。
-
在Redis中如何设置一个键的过期时间?
可以使用 EXPIRE 命令为键设置过期时间,例如:EXPIRE key_name seconds,其中 key_name 是要设置过期时间的键的名称,seconds 是过期时间的秒数
-
如何使用Redis进行分布式锁的实现?
在Redis中实现分布式锁的一种常见方法是使用 SETNX 命令(原子性地设置键值对)。当某个进程或线程获得锁时,它将在Redis中设置一个特定的键,其他进程或线程在设置相同键时将失败。获得锁的进程在完成任务后,可以通过删除该键来释放锁
-
如何实现Redis中的发布/订阅功能?
Redis中的发布/订阅功能使用 PUBLISH 命令将消息发布到指定的频道,使用 SUBSCRIBE 命令订阅一个或多个频道。发布者将消息发送到指定频道后,所有订阅该频道的客户端将接收到消息
-
Redis中的持久化方式有哪些?请分别说明它们的优缺点。
Redis中的持久化方式有两种:RDB(Redis Database)和AOF(Append-Only File)。 RDB:通过周期性地将数据集快照写入磁盘来持久化数据。它具有紧凑的文件格式和较快的恢复速度,但可能会导致数据丢失。 AOF:通过追加每个写操作到日志文件来持久化数据。它可以提供更高的数据安全性,但文件通常比RDB大且恢复速度较慢。
-
如何使用Redis实现简单的计数器?
使用Redis实现简单的计数器可以使用 INCR 或 INCRBY 命令递增一个键的值。
-
Redis中的事务是如何实现的?它们有什么特性和限制?
Redis的事务通过 MULTI、EXEC、WATCH 和 UNWATCH 命令实现。事务中的命令在 EXEC 命令执行之前不会立即执行,而是按顺序存储在一个队列中。它们具有原子性,要么全部执行,要么全部放弃。事务还支持乐观锁机制,可以使用 WATCH 和 UNWATCH 命令监视键,以确保在执行事务期间键没有被修改。
-
如何使用Redis实现缓存穿透和缓存击穿的解决方案?
解决缓存穿透的一种常见方法是使用布隆过滤器(Bloom Filter),它可以高效地判断一个键是否存在于缓存中。解决缓存击穿的方法包括设置合理的过期时间、使用互斥锁避免同时访问数据库等。
-
Redis中的管道(pipeline)是什么?如何使用它提高性能?
管道(pipeline)是一种批量执行多个Redis命令的机制。通过将多个命令一次性发送给Redis服务器并一次接收响应,可以减少网络往返时间并提高性能。
-
如何使用Redis实现分布式限流?
使用Redis实现分布式限流可以结合使用令牌桶算法或漏桶算法。令牌桶算法基于令牌桶中的令牌数量来控制请求的处理速率,而漏桶算法则通过限制从桶中流出的速率来控制请求的处理速率。