redis 学习笔记

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

redis 学习笔记_第1张图片

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

发布订阅

作用

  1. 实时消息传递:当一个客户端向订阅的频道发布消息时,所有订阅了该频道的客户端将立即接收到消息。这使得实时消息传递成为可能,适用于即时聊天、实时通知和在线协作等场景。
  2. 事件通知:当事件发生时,发布者可以通过将事件消息发布到相应的频道,通知所有订阅了该频道的客户端。这对于实现事件驱动架构和实时数据更新非常有用。
  3. 实时数据更新:当数据在后端发生变化时,可以将数据更改的消息发布到相应的频道,然后前端订阅了该频道的客户端可以实时地获取最新数据,无需主动轮询后端。
  4. 消息广播:发布/订阅模型使得向多个订阅者广播消息变得简单高效。这在需要将一条消息传递给多个客户端时非常有用。

订阅

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 练习题

  1. Redis中的数据类型有哪些?请简要描述每种数据类型的用途。

    Redis中的数据类型有:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set)和位图(bitmap)。它们的用途如下:
    
    字符串:存储单个值。
    哈希:存储字段-值对的映射。
    列表:按照插入顺序存储一个有序的值列表。
    集合:存储唯一的、无序的成员集合。
    有序集合:存储唯一的成员集合,并为每个成员分配一个分数,以便根据分数进行排序。
    位图:用于位级操作和位级存储。
    
  2. 在Redis中如何设置一个键的过期时间?

    可以使用 EXPIRE 命令为键设置过期时间,例如:EXPIRE key_name seconds,其中 key_name 是要设置过期时间的键的名称,seconds 是过期时间的秒数
    
  3. 如何使用Redis进行分布式锁的实现?

    在Redis中实现分布式锁的一种常见方法是使用 SETNX 命令(原子性地设置键值对)。当某个进程或线程获得锁时,它将在Redis中设置一个特定的键,其他进程或线程在设置相同键时将失败。获得锁的进程在完成任务后,可以通过删除该键来释放锁
    
  4. 如何实现Redis中的发布/订阅功能?

     Redis中的发布/订阅功能使用 PUBLISH 命令将消息发布到指定的频道,使用 SUBSCRIBE 命令订阅一个或多个频道。发布者将消息发送到指定频道后,所有订阅该频道的客户端将接收到消息
    
  5. Redis中的持久化方式有哪些?请分别说明它们的优缺点。

    Redis中的持久化方式有两种:RDB(Redis Database)和AOF(Append-Only File)。
    
    RDB:通过周期性地将数据集快照写入磁盘来持久化数据。它具有紧凑的文件格式和较快的恢复速度,但可能会导致数据丢失。
    AOF:通过追加每个写操作到日志文件来持久化数据。它可以提供更高的数据安全性,但文件通常比RDB大且恢复速度较慢。
    
  6. 如何使用Redis实现简单的计数器?

     使用Redis实现简单的计数器可以使用 INCR 或 INCRBY 命令递增一个键的值。
    
  7. Redis中的事务是如何实现的?它们有什么特性和限制?

    Redis的事务通过 MULTI、EXEC、WATCH 和 UNWATCH 命令实现。事务中的命令在 EXEC 命令执行之前不会立即执行,而是按顺序存储在一个队列中。它们具有原子性,要么全部执行,要么全部放弃。事务还支持乐观锁机制,可以使用 WATCH 和 UNWATCH 命令监视键,以确保在执行事务期间键没有被修改。
    
  8. 如何使用Redis实现缓存穿透和缓存击穿的解决方案?

    解决缓存穿透的一种常见方法是使用布隆过滤器(Bloom Filter),它可以高效地判断一个键是否存在于缓存中。解决缓存击穿的方法包括设置合理的过期时间、使用互斥锁避免同时访问数据库等。
    
  9. Redis中的管道(pipeline)是什么?如何使用它提高性能?

    管道(pipeline)是一种批量执行多个Redis命令的机制。通过将多个命令一次性发送给Redis服务器并一次接收响应,可以减少网络往返时间并提高性能。
    
  10. 如何使用Redis实现分布式限流?

使用Redis实现分布式限流可以结合使用令牌桶算法或漏桶算法。令牌桶算法基于令牌桶中的令牌数量来控制请求的处理速率,而漏桶算法则通过限制从桶中流出的速率来控制请求的处理速率。

你可能感兴趣的:(redis,学习,笔记)