赞
踩
Redis是key-value结构的NoSQL型数据库,由于它是存在内存中的,所以它的读写速度会很快,可以满足一些比较高频的访问。这也是我们选择使用它的原因之一。
字符串 String
解释:最基础的数据类型,可以存储任何形式的文本或二进制数据
应用场景:缓存、计数器、短信验证码
Hash
解释:存储键值对,类似于Java中的Map
应用场景:存储用户信息、对象
List列表
解释:相当于链表
应用场景:消息队列、任务队列
Set集合
解释:用于存储一些无序且唯一的元素集合
应用场景:用户关注列表,共同好友关注
ZSet集合
解释:有序、 不可重复,有权重参数
应用场景:排行榜
是一种机制,确保在分布式系统中,多个节点在同一时刻只能有一个节点对共享资源进行操作。
解决在分布式环境下并发控制和数据一致性问题的关键技术之一
秒杀下单、抢红包等等业务场景,都需要用到分布式锁,
先用setnx抢锁,如果抢到之后,再用expire给锁设置一个过期时间,防止锁忘记释放
缺点:加锁与设置过期时间是非原子操作,如果加锁后未来得及设置过期时间系统异常,会导致其他线程永远获取不到锁
把过期时间放在setnx的value值里面,如果加锁失败,再拿出value值校验一下
优点:避免expire单独设置过期时间,把过期时间放到setnx的value值里面
缺点:
将结果放在字符串里,用jedis提交
NX:表示key不存在的时候,才能set成功,也即保证只有第一个客户端请求才能获得锁,而其他客户端请求只能等其释放锁,才能获取
EX sends:设定key的过期时间,时间单位是秒
PX milliseconds:设定key的过期时间,时间单位是毫秒
XX:仅当key存在时设置值
缺点:
解决方案:将过去时间设置的相对长一点
解决方案:将判断是不是当前线程加的锁和释放锁
底层原理是,在其中一个线程加锁成功后,会启动一个watch dog 看门狗,它是一个后台线程,会每隔一段时间检查一下,如果线程还持有锁,那么就不断延长锁key的生存时间(看门狗的检查时间大概是锁持续时间的三分之一)
Redisson使用 Redlock 算法来保证在分布式环境下的锁的正确性和可靠性
跳表在实现上的简洁性、插入和删除的高效性、以及内存消耗的合理性。跳表在 Redis 的有序集合操作中表现出色,符合 Redis
追求高性能和简单实现的设计理念。
Redis Cluster时Redis的分布式实现,旨在解决单节点Redis在性能,存储和高可用性方面的限制,Redis
Cluster通过数据分片和自动故障转移来实现水平扩展和高可用性
指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。
人话:读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求都会穿透到数据库,这就是缓存穿透。
它由初始值为0的位图数组和N个哈希函数组成。一个对一个key进行N个hash算法获取N个值,在比特数组中将这N个值散列后设定为1,然后查的时候如果特定的这几个位置都为1,那么布隆过滤器判断该key存在。
Redis提供了RDB和AOF两种持久化机制
快照就像给当前时刻的数据拍一张照,保存下来
具体实现:在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis默认的持久化方式。执行完操作后,在指定目录下会生成一个dump.rdb文件,Redis 重启的时候,通过加载dump.rdb文件来恢复数据。
触发机制:
采用日志的形式来记录每个写操作,追加到文件中,重启时再重新执行AOF文件中的命令来恢复数据。它主要解决数据持久化的实时性问题。默认是不开启的。
具体实现:
解释: 指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据库压力过大甚至down机。
我们在set key的时候,可以给它设置一个过期时间,比如expire key 60。指定这key60s后过期
每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。
Redis中同时使用了惰性过期和定期过期两种过期策略。
假设Redis当前存放30万个key,并且都设置了过期时间,如果你每隔100ms就去检查这全部的key,CPU负载会特别高,最后可能会挂掉。
因此,redis采取的是定期过期,每隔100ms就随机抽取一定数量的key来检查和删除的。
但是呢,最后可能会有很多已经过期的key没被删除。这时候,redis采用惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且已经过期了,此时就会删除。
Redis的淘汰策略
我们把访问频率高的key,称为热点key。
如果某一热点key的请求到服务器主机时,由于请求量特别大,可能会导致主机资源不足,甚至宕机,从而影响正常的服务。
redis使用多线程并非是完全摒弃单线程,redis还是使用单线程模型来处理客户端的请求,只是使用多线程来处理数据的读写和协议解析,执行命令还是使用单线程。
这样做的目的是因为redis的性能瓶颈在于网络IO而非CPU,使用多线程能提升IO读写的效率,从而整体提高redis的性能。
Redis通过MULTI、EXEC、WATCH等一组命令集合,来实现事务机制。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
简言之,Redis事务就是顺序性、一次性、排他性的执行一个队列中的一系列命令。
什么是哈希冲突
通过不同的key,计算出一样的哈希值,导致落在同一个哈希桶中。
Redis 会对哈希表做rehash操作,也就是增加哈希桶,减少冲突。为了rehash更高效,Redis还默认使用了两个全局哈希表,一个用于当前使用,称为主哈希表,一个用于扩容,称为备用哈希表。
在生成RDB期间,Redis可以同时处理写请求吗
可以的,Redis提供两个指令生成RDB,分别是save和bgsave。
RESP,英文全称是Redis Serialization Protocol,它是专门为redis设计的一套序列化协议. 这个协议其实在redis的1.2版本时就已经出现了,但是到了redis2.0才最终成为redis通讯协议的标准。
RESP主要有实现简单、解析速度快、可读性好等优点。
Redis的主从复制机制允许一个Redis实例(主节点)将其数据复制到一个或多个Redis实例(从节点)。这为数据的高可用性,负载均衡和读写分离提供了基础。主从复制在Redis是异步进行的,但可以配置为部分同步复制,以提高数据的一致性
Redis Sentinel是Redis的高可用性解决方案,它监控Redis主从复制集群中的实例,并在检测到的主节点故障时自动完成故障转移。
Sentinel的主要职责:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。