Redis知识点

一、什么是 redis?简述它的优缺点?
redis 的全称是:remote dictionary.server,本质上是一个 key-value 类型的内存数据库,按期经过异步操做把数据库数据 flush 到硬盘上进行保存。每秒能够处理超过 10 万次读写操做,是已知性能最快的key-value db。
redis多种数据结构,单个 value 的最大限 制是 512m,不像 memcached 只能保存 1mb 的数据,所以 redis 能够消息双向链表,消息队列等服务。redis 能够持久化其数据
另外 redis 也能够对存入的 key-value 设置 expire 时间,主要缺点是数据库容量受到物理内存的限制,不能用做海量数据的高性能 读写,所以 redis 适合的场景主要局限在较小数据量的高性能操做和运算上。
redis 内部使用文件事件处理器file event handle,这个文件事件处理器是单线程的,因此 redis 才叫作单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理。
二、redis 有哪几种数据淘汰策略?
1.noeviction:返回错误当内存限制达到
2.allkeys-lru: 尝试回收最少使用的键(lru)
3.volatile-lru: 尝试回收最少使用的键(lru),但仅限于在过时集合的键。
4.allkeys-random: 回收随机的键使得新添加的数据有空间存放。
5.volatile-random: 回收随机的键,但仅限于在过时集合的键。
6.volatile-ttl: 回收在过时集合的键,而且优先回收存活时间较短的键。

三、redis中只存20w的数据,如何保证redis中的数据都是热点数据?
        redis内存数据集大小上升到必定大小的时候,就会施行数据淘汰策略allkeys-lru,计算预估出20w数据所占空间,而后将redis限制为此数,同时设置redis回收策略为allkeys-lru回收最少使用.
四、redis支持的java客户端都有哪些?官方推荐用哪一个?
 redisson、jedis、lettuce等等,官方推荐使用redisson。

五、说说redis哈希槽的概念?
在redis节点发送心跳包时须要把全部的槽放到这个心跳包里,以便让节点知道当前集群信息,
16384=16k,在发送心跳包时使用bitmap压缩后是2k(2 * 8 (8 bit) * 1024(1k) = 2k),也就是说使用2k的空间建立了16k的槽数。
虽然使用crc16算法最多能够分配65535(
2^16-1)个槽位,65535=65k,压缩后就是8k(8 * 8 (8 bit) * 1024(1k) = 8k),也就是说须要须要8k的心跳包,做者认为通常状况下一个redis集群不会有超过1000个master节点,因此16k的槽位是个比较合适的选择。
redis集群没有使用一致性hash,而是引入了哈希槽的概念,redis集群有16384个哈希槽,每一个key经过crc16校验后对16384取模来决定放置哪一个槽,集群的每一个节点负责一部分hash槽。

六、怎么理解redis事务?
事务指令:multi :开启事务
exec :提交事务
discard :放弃事务
watch :当被监控的键被修改后取消以后的事务
unwatch
redis事务不能保证每条指令彻底正确执行,只能保证此事务数据的原子性,单独的一组操做。不支持失败回滚。

7、redis回收策略:
惰性删除
读删除:用于当客户端读取带有超时属性的键时,若是已经超过键设置的过时时间,会执行删除操做并返回空,这种策略是出于节省cpu成本考虑,不须要单独维护ttl链表来处理过时键的删除。
写删除:客服端运行新命令致使内存不足时,redis将根据回收策略回收。
定时任务删除:redis内部维护一个定时任务,默认每秒运行10次(经过配置hz控制)。定时任务中删除过时键逻辑采用了自适应算法,根据键的过时比例,使用快慢两种速率模式回收键。

8、使用过redis分布式锁么,它是怎么实现的及缺点?
先拿setnx来争抢锁,抢到以后,再用expire给锁加一个过时时间防止锁忘记了释放。可使用redis事务机制 将两条指令合并执行。
redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操做。在redis主实例宕机的时候,可能多个客户端同时完成加锁。
九、redis作异步队列缺点
    通常使用list结构做为队列,rpush生产消息,lpop消费消息。
    redis能够经过pub/sub主题订阅模式实现一个生产者,多个消费者,固然也存在必定的缺点,当消费者下线时,生产的消息会丢失。
  
十一、缓存穿透、缓存击穿、缓存雪崩、缓存预热
缓存穿透:指查询一个必定不存在的数据,因为缓存是不命中时查询数据库。若流量大时,数据库可能会宕机。
解决方案:
1.布隆过滤器:将全部可能存在的key放到一个足够大bitmap中。必定不存在的数据直接被bitmap拦截掉。
2.短时缓存:若数据库查询的数据为空,扔把key缓存起来,设置一个短期的过时时间。数据插入后清理。
缓存击穿:某个热点key失效后,大并发访问,致使数据库宕机。
解决方案:
1.加锁排队:互斥锁对某个key只容许一个线程查数据写缓存,其余线程等待。
缓存雪崩:缓存时集中在某一时段同时失效,请求所有转发到数据库,数据库瞬时压力太重致使雪崩效应。
解决方案:
1.缓存时间增长随机值:每一个缓存时间不同,避免集体失效。
缓存预热:系统上线前把热点数据加入redis缓存中。
十一、redis LRU算法知道吗?写一下java代码实现?
 使用 LinkedHashMap(int initialcapacity,float loadfactor,boolean accessorder) 第三个参数设置为true,表明按访问顺序排序,可做为LRU缓存。设置为false 表明按插入顺序排序,可做为fifo缓存。
LRU算法实现:
1.经过双向链表来实现,新数据插入到链表头部;2.每当缓存命中(即缓存数据被访问),则将数据移到链表头部;3.当链表满的时候,将链表尾部的数据丢弃。
12.redis如何实现延时队列
     使用sortedset,使用时间戳作score, 消息内容做为key,调用zadd来生产消息,消费者使用zrangbyscore获取n秒以前的数据作轮询处理。 
13.redis缓存数据域数据库不一致性问题解决方案
采用 先更新数据库,再删除缓存
1.主从引发数据库不一致的解决方案
主库更新后,redis设置一个短有效期(主从同步延时时间)缓存,当业务查缓存时,先判断是否有这个缓存,有这个缓存直接读主库,不然读从库数据。
2. 缓存与数据库不一致
a线程删除缓存,操做数据库,b线程查询,将数据库数据插入缓存,因为并发问题,致使脏数据被拉长。
解决方案:订阅数据库binlog,获取并判断操做的数据。另起程序进行删除缓存数据,从新写入数据。
    

14. redis集群方案
redis-cluster采用无中心结构,每一个节点保存数据和整个集群状态,每一个节点都和其余全部节点链接。其redis-cluster架构图以下:
    

客户端与redis节点直连,不须要中间proxy层.客户端不须要链接集群全部节点,链接集群中任何一个可用节点便可。
redis-cluster选举:选举过程当中全部master参与,超过半数以上master间节点通讯,认为当前master节点挂掉。若是集群任意master挂掉且没有slave节点,集群不可用。超过半数以上master挂掉,也不可用。
相对于单机redis,功能上有一些限制:
1)key批量操做支持有限;
2)只支持多key在同一节点上的事务操做,当多个key分布在不一样节点时,不支持事务操做;
3)key做为数据分区的最小粒度,不能将一个大的键值对象如hash, list等映射到不一样的节点;

15.redis的持久化方案
save 同步保存操做,将redis数据快照以rdb文件形式保存到硬盘,阻塞客户端,影响性能
bgsave 异步保存数据
bgrewriteaof 异步优化aof文件
master主:主开启
AOF模式

slave从:从开启RDB模式
RDB(redis database:在不一样的时间点将 redis 的数据生成的快照同步到磁盘等介质上):内存到硬盘的快照,按期更新。缺点:耗时,耗性能(fork+io 操做),易丢失数据。
AOF(append only file:将 redis 所执行过的全部指令都记录下来,在下次 redis 重启时,只 须要执行指令就能够了):写日志。缺点:体积大,恢复速度慢。

16.redis经常使用命令及介绍
字符串:
setnx(key,value) 只在键 key 不存在的状况下, 将键 key 的值设置为 value 。key存在,不作任何操做。
setex(key,seconds,value) 将key设置及生存时间seconds秒,原值存在覆盖。
psetex(key,milliseconds,value) 与setex一样,只是单位是毫秒。
getset(key,value) 设置新值并返回旧值,不存在返回nil
setrange(key,offset,value) 从偏移量开始offset开始
mset 同时给多个key复制
哈希表(map):
hset(hash field value) 将哈希表 hash 中域 field 的值设置为 value
hmset key field value [field value …] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
hget hash field 返回哈希表中给定域的值。
hgetall key 返回哈希表 key 中,全部的域和值。
队列(queue):
lpush key value [value …] 将一个或多个值 value 插入到列表 key 的表头
lpop key 移除并返回列表 key 的头元素,不存在返回nil
lset key index value 将列表 key 下标为 index 的元素的值设置为 value 。
brpop key [key …] timeout 在超时时间内移除列表尾元素,阻塞的。
集合:
sadd key member [member …] 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
sismember key member 若是 member 元素是集合的成员,返回
1 。 若是 member 元素不是集合的成员,或 key 不存在,返回 0
spop key 移除集合key的随机元素
smembers key 返回集合 key 中的全部成员。
sdiff key [key …] 返回给定多个集合之间的差集。
有序集合:
zadd key score member [[score member] [score member] …] 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
zscore key member 返回有序集 key 中,成员 member 的 score 值。
zcount key min max score 值在 min 和 max 之间的成员的数量。
zrange key start stop [withscores] 返回有序集 key 中,指定区间内的成员(从小到大)。
zrank key member 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
zrem key member [member …] 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
时效性:
expire(key,seconds) 为给定 key 设置生存时间,当 key 过时时(生存时间为
0 ),它会被自动删除。
expireat( key,timestamp) 设置过时时间戳,expireatcache1355292000# 这个 key 将在
2012.12.12 过时
ttl(key) 返回剩余时间
persist key 移除key有效期,转换成永久的
数据指令:
keys pattern 符合给定模式的 key 列表。阻塞的
scan 异步的 有重复
 也能够自定义数据结构hyperloglog、geo、pub/sub。
相关文章
相关标签/搜索