摘要:拦截掉,从而避免了对底层存储系统的查询压力。当缓存服务器重启或者大量缓存集中在一段时间内失效,发生大量的缓存穿透,这样在失效者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请
Redis 是一个内存数据结构存储系统。 它是一个键值类型的非关系数据库。 它是一个持久的数据库。 相对于关系型数据库(数据主要存储在硬盘上)来说,它具有较高的性能,所以我们一般使用redis。 缓存使用; 而且redis支持丰富的数据类型,可以更轻松地解决各种问题。 因此,redis可以用作注册中心、数据库、缓存和消息中间件。 Redis的Value支持5种数据类型,string、hash、list、set、zset(有序集);
1)字符串类型:一个键对应一个值
2)Hash类型:它的key是字符串类型,value是一个map(key-value),适合存储对象。
3)列表类型:按插入顺序排列的字符串链表(双链表)。 主要命令是LPUSH和RPUSH,可以支持反向搜索和遍历。
4)集合类型:使用哈希表类型的字符串序列,没有顺序,集合成员唯一,不存在重复数据,底层主要由值始终为null的hashmap实现。
5)zset类型:与set类型基本相同,但它为每个元素关联一个double类型的分数(score),这样可以实现成员排序和插入有序。
你还用过其他缓存吗? 这些缓存有什么区别? 它们在什么场景下使用?
了解用于缓存的 redis 和 memcache
Memcache和redis的区别:
支持的数据类型:redis不仅支持简单的k/v类型数据,还支持list、set、zset、hash等数据结构的存储; memcache只支持简单的k/v类型数据,包括key和value。 是字符串类型
可靠性:memcache不支持数据持久化,断电或重启后数据会消失,但稳定性有保证;
Redis支持数据持久化和数据恢复,允许单点故障,但也会付出性能代价。
性能:对于存储大数据,memcache的性能高于redis
应用场景
Memcache:适合多读少写,数据量大(一些官网的文章信息等)
Redis:适合读写效率高、数据处理业务复杂、安全性要求高的系统
案例:在分布式系统中,存在会话之间共享的问题。 因此,在做单点登录时,我们使用redis来模拟会话共享来存储用户信息,实现不同系统中的会话共享;
你了解redis的持久化吗?
redis有两种持久化方式:
RDB(半持久模式):
根据配置,内存中的数据直接异步传输,时时以快照的形式传输。
数据持久化到磁盘上的dump.rdb文件(二进制临时文件)中,这是redis默认的持久化方式。
它位于配置文件(redis.conf)中。
优点:仅包含一个文件,将单个文件传输到其他存储介质,用于文件备份、灾难恢复
总之,比较实用。
缺点:一旦系统在持久化策略之前宕机,没有来得及持久化的数据就会丢失。
失去
RDB持久化配置:
Redis 会将数据集的快照转储到 dump.rdb 文件中。 另外,我们还可以通过配置文件修改Redis服务器转储快照的频率。 打开6379.conf文件后,我们搜索save,可以看到如下配置信息:
save 900 1 #900秒(15分钟)后,如果至少有1个key发生变化,则转储内存快照。
save 300 10 #300秒(5分钟)后,如果至少有10个键发生变化,则转储内存快照。
save 60 10000 #60秒(1分钟)后,如果至少有10000个key发生变化,则转储内存快照。
AOF(完全持久化方式):
对于每次数据更改,通过 write() 函数将执行的命令追加到appendonly.aof 文件中。 Redis默认不支持这种完整的持久化方式。 您需要将其添加到配置文件(redis.conf)中。 appendonlyno 更改为appendonly yes
优点:数据安全性高。 日志文件写入操作采用append模式,因此写入过程为
即使出现停机问题,日志文件中现有的内容也不会被破坏;
缺点:对于相同数量的数据集,aof文件通常比rdb文件大,因此恢复大数据集时rdb比aof更快;
AOF持久化配置:
Redis配置文件中有3种同步方式,分别是:
1)appendfsyncalways #每次发生数据修改时,都会调用fsync来刷新aof文件,速度很慢。
但安全;
2)appendfsync everysec #每秒调用fsync刷新aof文件。 速度很快,但是一秒之内的数据可能会丢失。 推荐使用,兼顾速度和安全;
3)appendfsync no #不会自动同步到磁盘,需要由OS(操作系统)刷新。
效率快,但安全性比较差;
两种持久化方式的区别:
AOF在运行效率上往往比RDB慢。 每秒同步策略的效率比较高,同步禁用策略的效率与RDB一样高效;
如果对缓存数据的安全性要求比较高,可以使用aof的持久化方式(比如项目中的购物车);
如果对大数据集要求高效率,可以使用默认的持久化方式,并且这两种持久化方式可以同时使用
使用。
你做过redis集群吗? 你搭建集群的时候搭建了多少台机器? 它们是如何建造的?
Redis数据存储在内存中,不适合存储大数据。 对于大数据存储memcache redis 比较,企业常用的是hadoop中的Hbase或者MogoDB。 Redis主要用来处理高并发。 对于我们的项目来说,如果电商项目并发量很大,单个redis不足以支持我们的并发量。 这就需要我们扩展多个设备进行协作,即使用到集群。
Redis构建集群的方式有很多种,比如:客户端分片、Twemproxy、Codis等。不过redis3.0之后才支持redis-cluster集群。 该方法采用无中心结构,每个节点保存数据和整个集群的状态,其中每个节点都与所有其他节点相连。 如果使用,请使用redis-cluster集群。 集群由公司运维搭建。 我不太了解如何构建它。
在我们的项目中,我们主要搭建了6个redis集群,3个master(为了保证redis的投票机制)和3个slave(高可用)。 每台主服务器都有一台从服务器作为备份机。 所有节点通过PING-PONG机制相互连接; 客户端只需要连接集群中的任意节点即可连接到redis集群; Redis-cluster内置了16384个哈希槽,Redis-cluster将所有物理节点映射到[0-16383]槽并负责维护。
redis有事务吗?
Redis有事务。 Redis 中的事务是一组命令。 这组命令要么全部执行,要么全部不执行。 这保证了事务中的命令按顺序执行,而不会被其他命令插入。 Redis事务不支持回滚操作。 redis事务的实现需要使用MULTI(事务开始)和EXEC(事务结束)命令;
缓存穿透
缓存查询一般通过key来查找value。 如果对应的值不存在,则必须在数据库中查找。如果数据库中不存在这个key对应的值,并且这个key的并发请求很多,就会给数据库带来很大的压力。 这称为缓存穿透。
解决方案:
所有可能的查询参数都以哈希形式存储,并首先在控制层进行验证。 如果它们不匹配,它们就会被丢弃。
2. 将所有可能的数据散列成足够大的位图。 绝对不存在的数据将通过该位图进行哈希处理。
Bitmap被拦截,从而避免底层存储系统的查询压力。
3、如果查询返回的数据为空(要么数据不存在,要么系统故障),我们还是把这个
空结果会被缓存,但它们的过期时间很短,不会超过五分钟。
缓存雪崩
当缓存服务器重启或一段时间内大量缓存失效时,会发生大量缓存穿透,使得故障后
此时数据库的访问压力比较大,所有的查询都落在数据库上,造成缓存雪崩。
没有完美的解决方案,但可以分析用户行为并尝试均匀分布故障时间点。大多数系统设计
考虑使用锁或队列来保证单线程(进程)写入缓存,从而避免故障时出现大量并发请求。
问题出在底层存储系统上。
解决方案:
1、缓存过期后,通过加锁或者排队的方式控制读数据库和写缓存的线程数量。比如对于某个key,只
允许一个线程在其他线程等待时查询数据并写入缓存。
可以利用缓存重载机制提前更新缓存,然后在大并发访问发生之前手动触发缓存中不同key的加载,并设置不同的过期时间,使缓存失效时间点尽可能均匀。
4. 创建二级缓存或双缓存策略。 A1是原始缓存,A2是复制缓存。 当A1失效后memcache redis 比较,就可以访问了。
A2和A1的缓存过期时间设置为短期,A2的缓存过期时间设置为长期。
redis的安全机制(你们公司如何考虑redis的安全性?)
漏洞介绍:默认情况下,redis会绑定bind 0.0.0.0:6379,这会将redis服务暴露到公网。 如果未开启身份验证,则任何用户都可以访问目标服务器。 在没有授权的情况下,攻击者可以访问redis并读取redis数据。 攻击者可以利用redis相关方法,在未经授权的情况下成功将公钥写入redis服务器上,然后直接使用私钥。 直接登录目标主机;
解决方案:
1.禁止一些高风险命令。修改redis.conf文件,禁止远程修改DB文件地址,例如
重命名命令 FLUSHALL ""、重命名命令 CONFIG""、重命名命令 EVAL "" 等;
2.以低权限运行redis服务。 为redis服务创建单独的用户和根目录,并配置禁止登录;
3.添加redis的密码验证。 修改redis.conf文件,添加requirepass mypassword;
4、禁止外网访问redis。 修改redis.conf文件,添加或修改bind 127.0.0.1,使得redis服务仅在当前主机上使用;
5、进行日志监控,及时发现攻击;
6.Redis的哨兵机制(redis2.6之后出现)
哨兵机制:
监控:监控主库、从库是否正常运行;
提醒:当监控的redis出现问题时,Sentinel可以通过API向管理员或其他应用程序发送通知;
故障自动迁移:当主库出现故障时,从库可以自动转换为主库,实现自动切换;
具体配置步骤可参考网上文档。需要注意的是,如果主服务器设置了密码,切记
在sentinel配置文件(sentinel.conf)中配置访问密码
生存时间在redis中的应用
在Redis中,可以使用expire命令来设置key的生存时间。 时间到后Redis会自动删除;
应用场景:
有关设置限制的促销活动的信息; 一些需要及时更新的数据,积分排名; 手机验证码的时间;
4、限制网站访问者的频率;