Redis常见知识点

Redis常见问题
Redis有哪些优缺点
优点
读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
支持数据持久化,支持AOF和RDB两种持久化方式。
支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
缺点

数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
redis为什么快
首先是在内存中操作,并且使用单线程。
另外存储数据使用了自己写的一种快速存储方式动态字符串(SDS),在存入数据时会另外保存一个free的空间,下次再加入时就先判断free是否装得下,装得下就直接用,装不下再扩容,处理完后再增加一个free空间。
redis通信协议
RESP协议
在RESP协议中,有些的数据类型取决于第一个字节:
1、对于简单字符串,回复的第一个字节是“+”
2、对于错误,回复的第一个字节是“ - ”
3、对于整数,回复的第一个字节是“:”
4、对于批量字符串,回复的第一个字节是“$”
5、对于数组,回复的第一个字节是“*”
在这里插入图片描述
redis有哪些数据类型
常见的有:Sting、Hash、List、Set、Sort Set
中级类型:HyperLogLog、Pub/Sub、Geo
新增:Stream
各种类型的适用场景
String
1、一般会把用户信息或商品信息序列化后存储在redis中可存512M
2、可以作为计数器使用,例如评论数、点赞数、分享数,收藏数,销售量、评价数等
3、setnx+expire+getset可以实现一个分布式锁功能
Set
最主要的功能就是去重,用交集可以查找两个人的共同好用。也可以实现快速去重、以及统计某直播房间有多少人
SADD KEY_NAME VALUE1…VALUEN eg:sadd oneset one two smembers oneset
Sort Set
可以对set集合排序,因此可以作为直播平台榜单前几名人员展列,也可以作为一些新闻类、电商类等的排行榜,比如电商类里的按时间排序、按销量排序等。
还可以实现订单超时取消等的延时操作,在score里设置操作时间
ZADD KEY_NAME SCORE1 VALUE1… SCOREN VALUEN eg:ZADD myset 1 “hello” ZRANGE myzset 0 -1 WITHSCORES
List
可以通过 List 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西
RPUSH KEY_NAME VALUE1…VALUEN eg: rpush onelist one two LRANGE onelist 0 3
Hash
可以作为在购物车模块的操作,比如增加商品、增加数量、显示总数等
HSET KEY_NAME FIELD VALUE eg: hset 1KR123 contractname qwe age 12 hget 1KR123 age
HyperLogLog
供不精确的去重计数功能,比较适合用来做大规模数据的去重统计
PFADD mykey 1 2 PFADD mykey 3 4 pfcount mykey
Geo
可以用来保存地理位置,并作位置距离计算或者根据半径计算位置等
Pub/Sub
功能是订阅发布功能,可以用作简单的消息队列
redis事务
Redis 事务通过MULTI、EXEC、WATCH等命令实现。支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
但 Redis 提供的不是严格的事务,Redis 只保证串行执行命令,并且能保证全部执行,但是执行命令失败时并不会回滚,而是会继续执行下去。即在ACID中支持CI,一致性和隔离性。原子性单条命令支持,事务不支持,持久性是在开启AOF日志时可以做到。
redis持久化
reids有AOF和RDB两种方式
RDB是把当前redis中的数据以快照的形式保存为dump.rdb,每次保存的为当前全量数据,因此此日志适合做灾备,第一次的主从同步,但是由于刷新间隔较长(可在配置文件里按修改多少次刷新一回)
,如果在此之间夯机会丢失较多数据。如果数据量很大的话,fork出的子进程会执行时间较长,相当于一个新进程出现分享了cpu处理能力,有可能占用cpu时间较多,导致客户端数据进不来。
传输过程中出现网络问题,会自动重连并且连接之后会把缺少的数据补上
AOF可以实现增量式保存,一般可以设置为每秒同步一次,每次都保存的话效率会比较低。
redis高可用性
哨兵模式
哨兵必须用三个实例去保证自己的健壮性的,哨兵+主从并不能保证数据不丢失,但是可以保证集群的高可用
哨兵至少需要 3 个实例,来保证自己的健壮性。
哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。
对于哨兵 + redis 主从这种复杂的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练。
集群模式
Redis Cluster并没有使用一致性hash,而是采用slot(槽)的概念,一共分成16384个槽。将请求发送到任意节点,接收到请求的节点会将查询请求发送到正确的节点上执行
多Redis实例集群
采用哈希算法将Redis数据的key进行散列,通过hash函数,特定的key会映射到特定的Redis节点上。
优势在于非常简单,服务端的Redis实例彼此独立,相互无关联,每个Redis实例像单服务器一样运行,非常容易线性扩展,系统的灵活性很强
Redis的过期键
过期策略通常有以下三种:定时过期、惰性过期、定期过期
redis一般为在加入内容时会添加过期时间,redis会定期去扫描整个内存数据的过期时间,有过期的就删除,不过扫描时间不频繁,不然效率低下。中间没被扫描到的会在操作这个数据时判断是否过期,过期就删除。如果即没被删除也没被使用,就会使用过期策略,最近最少使用测试lru去删除。
Redis过期时间可能造成的问题
当大量数据在同一时间或相近时间失效时,同时又有大量请求访问,这些请求就会全部落在数据库上,增大数据库压力甚至崩溃,造成缓存雪崩。所以一般在设置有效期时间时一般会将时间跨度分布开。
缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
一方面可以使用布隆过滤器,将数据库数据映射到布隆过滤器上,访问数据库时先通过过滤器判断数据是否存在,也可以使用redis给数据设置一个null值,没有的就设置null,后续再有访问的就直接在redis给拦截了。
缓存击穿是指在同一时间大量访问同一个数据,但是数据又过期了,多出现在秒杀场景的热门商品上。可以做一个提前预热加载。
redis数据一致性
读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先删除缓存,然后再更新数据库。删除缓存是因为如果只是更新缓存中某些数据,耗时会比删除重加载更耗时。
如果是分布式大并发不一致(一般公司也不会出现这情况),可以使用阿里开源Canal,类似mysql的主从同步效果,或者直接串行化通过增加机器达到相同性能。

新补充:
HyperLogLog 是基于伯努利试验的抛硬币原理
第一次试验: 抛了3次才出现正面,此时 k=3,n=1
第二次试验: 抛了2次才出现正面,此时 k=2,n=2
第三次试验: 抛了6次才出现正面,此时 k=6,n=3
第n 次试验:抛了12次才出现正面,此时我们估算, n = 2^12
通过多次抛硬币实验的最大抛到正面的次数来预估总共进行了多少次实验(此为统计数据,也就侧面要求了得在大数据量下这种统计出的数据才更加接近真实值)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值