Redis学习记录

基础数据类型

    Redis数据类型包括stirng、List、hash、set,sortset。string为二进制安全,可以存储小于512M的字符数据,例如图片或者序列化的对象,缓存客户端session等。List实现本质是双向链表,可以模拟成堆栈的效果,适用于消息队列。hash适合与对象操作,可以简单快速的更新对象的属性值。set由hash表实现,元素不能重复,查找复杂度为O(1),提供了交集、并集、差集等方法,适用于快速判断数据关系;sortset是set的有序集合,可以作为排行榜的排序处理。

HyperLogLog、Geo、Pub/Sub

    HyperLogLog可以处理基数很大的对象,能够对其进行合并和快速计数,内存占用小计数速度块,存在0.8的错误率,不能取出单条记录。本质是基于概率、散列还有内部维护的bucket;Geo用于存储用户的地理位置信息,而且能够做一些简单的空间计算;pub/sub是一种轻量级的消息订阅发布实现,它并不是持久化的,即用即失。

缓存穿透、雪崩、击穿

    缓存穿透是指查询数据库中本身不存在的数据,如果数据库中不存在那么也不会加入缓存,导致每次还是在进行数据库的查询操作。解决方法一般是将空结果也加入缓存,并设置较短的过期时间;采用互斥锁的方式请求数据,弊端会导致线程阻塞。

    雪崩是指大量的缓存在同一时间失效。例如在同一时间大量缓存对象到期失效或者redis节点断网宕机等,这个时候如果有大量请求那么很有可能压垮数据库。解决方案散列失效时间,不要在同一时间出现大量缓存失效的情况;采用熔断机制,如有超时情况情况尽快返回;采用隔离方式处理,不同的资源采用独立的资源池,当一类资源出现问题时不至于影响到其他环节;采用限流方式,这属于预防形式,对于大规模的请求进行限流处理,超过请求阈值的直接返回。

   击穿跟穿透的现象类似,不过它是集中访问一个热点的Key,当这个Key失效时高并发访问数据库导致数据库奔溃。解决方法采用布隆过滤器。

其他

       获取key值得方法由keys和scan,key会导致线程阻塞,scan不会但是速度较慢且存在数据重复的可能,需要在使用的时候进行去重。

    RDB做redis的持久化,相当于做了全库的备份,但它的备份速度较慢,如果中途断电会导致持久化失败。AOF相当于增量备份,将近期的对象进行备份,两者配合可以较好的完成持久化恢复工作。

Redis为什么高效

1.使用内存数据库

2.单线程的组织方式,避免了锁争用和线程切换的效率损失

3.多路复用技术,多个请求服用一个IO,非阻塞IO的方式进行

4.数据结构经过优化处理

多路复用

    从网上查阅相关的内容理解大致是这样的,Redis下的IO通过FD(文件描述符)来进行读写数据,常规模式下,读取过程先判断文件是否可读然后再获取数据,这是一个完整的过程。由于redis是单进程的,如果文件存在不可读的情况那么整个redis服务就会卡住。为了解决这个问题,所以采用多路复用,即先判断文件是否可读取,如果不可读直接返回而不是等待数据。这样理解的话多路复用只是解决了特殊情况下(文件损坏不可读)线程卡死的问题,并没有在效率上有什么帮助,这是一个疑问点。https://www.jianshu.com/p/9b71f8ee6e28 这篇文章解释相对清楚,上面的疑问是对场景理解错了。当多个socket访问(比如一个单体应用网站,使用了redis,有多个异步客户端请求),这种情况下会存在多线程切换,当A线程正在读取数据时,切换到B线程,此时redis正在为A服务,再响应B请求的时候就采用了多路复用,避免了IO的阻塞。多路复用比多线程的切换的代价要小很多。

https://blog.csdn.net/tmeng521/article/details/91039391 网上找了个图说明运行情况

事务

    redis的事务比较简单,没有那么多的隔离级别,如果是语法上的问题,那么整个事务都不会被执行,如果是运行时的错误则仅执行正确的部分。如果要保持数据的一致性,一般采用watch乐观锁+重试的方式实现。事务相关的操作语句mutil、excu、discard、watch。

    分布式锁的实现有redis、zookeeper等中间件,redis由于是单线程的,所以其在多客户端访问下可以实现分布式锁。使用setnx对锁变量进行赋值,为了避免客户端异常挂掉导致死锁,可以加一个过期时间来处理。

过期策略

    redis的key常规的处理方式有两种一个是定时清理一个是惰性清理,定时清理是每隔一段时间随机取一些key判断是否过期,如果过去了则清理,这样处理会有一些漏网之鱼,有些过期的key可能很长时间都不会被清理。惰性清理是在使用key的时候先判断当前key是否过期,如过期则清理并返回无结果。

redis内存淘汰策略

        noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧

  allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)

  allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧

  volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)

  volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key

  volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

一致性HASH和取模

https://blog.csdn.net/suifeng629/article/details/81567777参考这篇文章的说明,取模运行能够均匀的分配数据到不同的机器,但是当机器个数发生变化的时候,命中率会极具下降。一致性HASH利用环形HASH,将数据分布和机器分散放在环上,按顺时针查找离当前数据最近的机器进行访问,这样处理后仅部分的数据命中失效,其他大部分的都还保持原来的对应关系,整体命中率提升明显。

redis sentinel和cluster

sentinel的主要作用是保证高可用;cluster的作用是支持水平扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值