redis操作和面试常见问题

mac2024-04-08  26

支持的数据类型

list set zset(有序集合) hash string

基本命令

select 数字 #切换数据库 setring的命令 set key value #存取 setex key secodns value #存取能设置时间 mset key value key value #存取多个值 append key value #追加 get key #取值 mget key #取多个值 exists key #查看键是否存在 keys * 或者 a* 都可以查看键 后一种是查看包含 del key key #删除键 ttl key #查看有效时间 hash的命令 hset 键 键的属性(也就是字段) 值 hmset 键 建的属性 值 建 建的属性 值 hkeys key #获取指定键的属性 hget key 键的属性 #获取值 hmget #获取多个值 hvals key #获取某个键的所有属性的值 hdel key 属性 #删除对应的hash list的命令 lpush key value value #给列表左侧加值 rpush key value value #给列表右侧加值 linsert key before或after #现有元素 新元素 lrange key start(开始)stop(结尾)#获取所有元素 lset key 索引 修改的值 #修改指定位置的值 lrem key 值 #删除值 set的命令 sadd key 值 #添加 smembers key #获取所有元素 srem key #删除指定元素 zset的命令 zadd key 权重 值 #添加元素可以添加多个 zrange key start stop #获取值 zscore key 元素#获取当前元素的权重 zrem key 元素 #删除当前键中的指定元素 zremrangebyscore key min max(权重的最大和最小)#删除当前集合中的权重在这个范围的元素

3.在python用法

import redis sr=redis.StrictRedis(host="127.0.0.1",port="6379",db=0)#连接reids数据库 ret=sr.set("a","name")#字符串存值 print(sr.type("a"))#查看存储类型 print(sr.get("a").decode("utf-8"))#从redis取出来的值是beyts类型的用decode()的解码 sr.set("a","list")#字符串存值 print(sr.get("a").decode("utf-8"))#用同一个值存数据覆盖 sr.delete("a")#删除键 print(sr.keys())#查看所有的键

redis是单进程单线程的,redis利用队列技术将并发访问变成串行访问,消除了传统数据库串行控制的开销 因为多线程会涉及到锁,而且多线程处理会频繁切换cpu 会影响效率

redis的优势

1.速度快,因为存在内存中 查找的时间复杂度为0(1)

2.支持丰富的数据类型

3.支持事务,操作的都是原子性

4.丰富的特性:可用于缓存,消息 是指过期时间

redis主要提供的两种 持久化机制: RDB和Aof

RDB 是一种快照存储持久化方式,具体就是将 Redis 某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为 dump.rdb,而在 Redis 服务器启动时,会重新加载 dump.rdb 文件的数据到内存当中恢复数据。 开启 RDB 持久化方式很简单,客户端可以通过向 Redis 服务器发送 Save 或 Bgsave 命令让服务器生成 RDB 文件,或者通过服务器配置文件指定触发 RDB 条件。 当客户端向服务器发送 Save 命令请求进行持久化时,服务器会阻塞 Save 命令之后的其他客户端的请求,直到数据同步完成。 如果数据量太大,同步数据会执行很久,而这期间 Redis 服务器也无法接收其他请求,所以,最好不要在生产环境使用 Save 命令。 AOF :Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。 AOF 的优缺点 优点:数据的完整性和一致性更高 ,只是追加日志文件,因此对服务器的性能影响小,速度比Rdb要快,消耗的内存较少 缺点:因为AOF记录的内容多,日志文件会越来越大,数据恢复也会越来越慢 RDB 的优缺点 优点: 1 适合大规模的数据恢复。 2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。 3 通过Rdb进行数据备份,由于使用子进程生成,所以对Redis服务器性能影响小 缺点: 1 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。 2 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍哦),最后再将临时文件替换之前的备份文件。 所以Redis 的持久化和数据的恢复要选择在夜深人静的时候执行是比较合理的。

redis的哨兵机制

Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。其中三个特性: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。 特点: 1、保证高可用 2、监控各个节点 3、自动故障迁移 缺点:主从模式,切换需要时间丢数据 没有解决 master 写的压力

Redis的主从复制

redis的主从复制机制是指可以让服务器(slave)能精准复制主服务器(master)的数据 Redis 的主从复制是异步复制,异步分为两个方面: 一个是 Master 服务器在将数据同步到 Slave 时是异步的,因此 Master 服务器在这里仍然可以接收其他请求。 一个是 Slave 在接收同步数据也是异步的。 Redis 主从复制分为以下三种方式: 当 Master 服务器与 Slave 服务器正常连接时,Master 服务器会发送数据命令流给 Slave 服务器,将自身数据的改变复制到 Slave 服务器。 当因为各种原因 Master 服务器与 Slave 服务器断开后,Slave 服务器在重新连上 Master 服务器时会尝试重新获取断开后未同步的数据即部分同步,或者称为部分复制。 如果无法部分同步(比如初次同步),则会请求进行全量同步,这时 Master 服务器会将自己的 RDB 文件发送给 Slave 服务器进行数据同步,并记录同步期间的其他写入,再发送给 Slave 服务器,以达到完全同步的目的,这种方式称为全量复制。

Redis的被动删除(惰性删除)和主动删除

redis的被动删除:当读写一个已经过期的key时,会触发被动删除策略,判定它已经过期后就直接删除这个过期的key 这种删除方式对cpu是友好的只有在不得已的情况下才会进行删除操作 不会无故浪费cpu的时间,但是对内存不友好一个key已经过期,但是在它被操作之前不会被删除,仍然占据内存空间。如果有大量的过期键存在但是又很少被访问到,那会造成大量的内存空间浪费 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key

Redis的缓存穿透和缓存雪崩

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。 解决方案: 最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。 另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。(只要数据库没查到,就写一个空值到缓存,下次还有这个请求,就可以走缓存了)简单回答 缓存雪崩缓存 在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。 解决方案: 1.缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。 2.加锁 3.建立备份缓存,缓存A和缓存B,A设置超时时间,B不设值超时时间,先从A读缓存,A没有读B,并且更新A缓存和B缓存; 缓存击穿: 是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力 解决方案:使用互斥锁 就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。 设置热点数据永远不过期。 Redis事务 Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个原语实现的 Redis会将一个事务中的所有命令序列化,然后按顺序执行。 1.redis 不支持回滚“Redis 在事务失败时不进行回滚,而是继续执行余下的命令”, 所以 Redis 的内部可以保持简单且快速。 2.如果在一个事务中的命令出现错误,那么所有的命令都不会执行; 3.如果在一个事务中出现运行错误,那么正确的命令会被执行。

1)MULTI命令用于开启一个事务,它总是返回OK。 MULTI执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当EXEC命令被调用时,所有队列中的命令才会被执行。 2)EXEC:执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。 当操作被打断时,返回空值 nil 。 3)通过调用DISCARD,客户端可以清空事务队列,并放弃执行事务, 并且客户端会从事务状态中退出。 4)WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。 可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令。

最新回复(0)