redis学习

1.说明是redis?
    redis本质上是一个key-value类型的内存数据库,很像memcached,整个数据库都是加载在内存当中进行操作,
定期通过异步操作把数据库flush到硬盘进行保存,因为是纯内存操作,redis的性能非常出色,
每秒可以处理超过10万次的读写操作,是已知性能最快的key-value DB,redis的出色不仅仅是性能,
redis最大的美丽是支持保存多种数据结构,此外单个value的最大限制是1GB,不像memcached只能保存1M的数据
因此redis可以用来实现很多有用的功能,比如说用他的list来做FIFO双链表,实现一个轻量级的、高性能消息队列服务
,用它的set可以做高性能的tag系统等等,另外redis也可以对存储的key-value设置expire时间,
因此也可以被当做一个功能加强版的memcached来用,redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的
高性能读写,因此redis适合的场景主要局限在较小数据量的高性能操作和运算上
2.redis相比memcached 有哪些优势?
    1.memcached所有的值均是简单的字符串,redis作为其代替者,支持更为丰富的数据类型
    2.redis的速度比memcached块很多
    3.redis可以持久化其数据
3.redis支持哪些数据类型?
    String,list.set,sorted set .hashes
4.redis主要消耗什么物理资源
    内存。
5.redis有哪几种数据淘汰策略?
    noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令
        (大部分的写入指令,但del和几个例外)
    allkeys-lru:尝试回收最少使用的键(lru),使得新添加的数据有空间存放。
    volatile-lru:尝试回收最少使用的键(lru),但仅限于在过期集合的键。使得新添加的数据有空间存放
    allkeys-random:回收随机的键使得新添加的数据有空间存放
    volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于在过期的集合的键
    volatile-ttl:回收再过期集合的键,并且有限回收存货时间(ttl)较短的键,使得新添加的数据有空间存放,
6.redis官方为什么不提供windows版本?
    因为目前linux版本已经相当稳定,而且用户量很大,无需开发window版本,反而会带来兼容性等等问题 
7.一个字符串类型的值能存储最大容量是多少?
    512M
8.为什么redis需要把所有数据放到内存中?
    redis为了能达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘,所以redis具有快速和数据
持久化的特征,如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能,在内存越来越便宜的今天,redis将会
越来越受欢迎,如果设置了最大使用的内存,则数据已有激励数达到内存限制后不能继续插入新值
9.redis集群方案应该怎么做,都有哪些方案
    1.twemproxy,大概概念是,它类似以一个代理方式,使用方法和普通redis无任何区别,设置好它下属的多个redis实例后,
使用时在本需要连接redis的地方改为连接twemproxy,它会以一个代理的身份接受请求并使用一致性hash算法,将请求转接到具体
redis,将结果在返回twempeoxy。使用方式简单(相对redis只需要修改连接端口),对旧项目扩展的首选,问题:twemproxy自身端
口实例的压力,使用一致性hash后,对redis节点数量改变时候的计算值的改变,数据无法自动移动到新的节点
    2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数量改变情况下,
旧节点数据可恢复到新的hash节点。
    3.rediscluster3.0自带的集群,特点在于它的分布式算法不是一致性hash,而是hash槽的概念,
以及自身支持节点设置从节点,具体看官方文档介绍
    4.在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key进行hash计算,然后对对应的redis实例操作数据,
这种方式 对hash层代码要求比较高,考虑部分包括,节点失效后的代替算法方案,数据震荡后的自动脚本恢复,实例的监控,等等 
10.redis集群方案什么情况下回导致整个集群不可用
    有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽不可用
11.mysql里面有2000W数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
    redis内存数据集大小上升到一定大小的时候,就会实施数据淘汰策略。
12.redis有哪些适合的场景,
    1.会话缓存
    最常用的一种使用redis的情景是会话缓存,用redis缓存会话比其他存储的优势在于:redis提供持久化,
当维护一个不是严格要求一致性的缓存时,随着redis近几年的改进,很容易找到怎么恰当的使用redis来缓存会话文档,
    2.全页缓存(fpc)
    除基本的会话token外,redis还提供很简单的fpc平台,回到一致性问题,即使重启了redis实例,异常有磁盘的持久化,用户也不会
看到页面加载速度的下降,这是一个很大的改进,再次以magento为列,magento提供一个插件来使用redis作为全页面缓存后端
此外,对wordPress的用户来说,pantheon 有一个非常好的插件,wp-redis,这个插件能帮助最快速度加载浏览过的页面
    3.队列
    redis在内存存储引擎领域的一大优点是提供list和set操作,这使得redis能作为一个很好的消息队列平台来是用,redis作为队列使用的操作
就类似于本地程序语言对list的push/pop操作,如果你快速的在google中搜索redis queues,你马上就能找到大量的开源项目,这些项目就是利用redis
创建非常好的后端工具,以满足各种队列需求,例如,celery有一个后台就使用redis作为broker,
    4.排行榜/计数器
    redis在内存中对数字进行递增或递减的操作实现非常好,集合set和有序集合sorted set 也使得我们在执行这些操作的时候变得非常简单,
redis只是正好提供了这两种数据结构,所以我们要从排序集合中获取到排名最靠前的10 个用户,我们称之为user_scores,我们只需要像下面一样执行
ZRANGE user_scores 0 10 withscores
agora ganems 就是一个很好的例子,用ruby实现的,它的排行榜就是使用redis来存储数据的,你可以在这里看到
    5.发布/订阅
    最后redis的发布/订阅功能,使用长期非常多,可以在社交网络连接中使用,可以做为脚本触发器,建立聊天系统。
13.redis支持的java客户端
    redisson,jedis ,lettuce,
14.redis和redisson的关系
    redisson是一个高级的分布式协调redis客服端,能帮助用户在分布式环境中轻松实现语言对象
15.redis设置密码和验证密码
    设置密码 : fonfig set requirepass 123456
    授权密码: auth 123456
16.redis哈希槽
    redis集群没有使用一致性hash,而是引入了哈希槽的概念,redis集群有16384个哈希槽,每个key通过crc16x
校验后对16384取模来决定放置那个槽,集群的每个节点负责一部分hash槽
17.redis集群的主从复制模型
    为了使在部分节点失败或者大部分节点无法通信的情况下集群任然可用,所以集群使用了主从
复制模型,每个节点都会有n-1个复制品
18.redis集群会不会有写操作是丢失情况
    redis不能保证数据的强一致性,这意味着在实际集群在特点的条件下可能会丢失写操作
19.redis是如何复制的
    异步复制。
20.redis集群最大的节点数有16384个
21.redis集群是怎么选择数据库
    redis集群目前无法做数据库选择,默认在0数据库
22.redis中的管道有什么用
    一次性请求/响应服务器能实现处理新的请求即使旧的请求还未被响应,这样就可以将多个命令发送到服务器,而不用等待回复,
最后一个步骤中读取该答复,
23.redis事务
    事务是一个单独的隔离操作,事务中的所有命令都会被序列化,按照顺序执行,事务在执行的过程中,
不会被其他用户端发送来的命令请求所打断,事务是一个院子操作,事务中的命令要么全部被执行,要么都不执行
24.redis事务相关的命令
    multi,exec,discard,watch
25.redis key的过期时间和永久有效设置
    expipe和persist命令
26.redis如何做内存优化
    尽可能使用散列表(hashes),散列表使用内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面,
27.redis回收进程工作方式
    一个客户端运行了新的命令,添加了新的数据,redis检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收,
所以我们不断穿越内存限制的边界,通过不断达到边界然后不断回收到边界一下,
如果一个命令的结果导致大量的内存被使用,不用多久内存限制就会被这个内存使用量超越
28.redis回收使用的算法
    lru算法
29.redis做大量数据插入
    redis2.6开始redis-cli支持一种新的被称之为pipe-mode的新模式用于执行大量数据插入工作
30.redis分区的意义
    分区可以让redis管理更大的内存,redis将可以使用所有机器的内存,如果没有分区,最多只能使用一台机器的内存,
分区使redis的计算能力通过简单的增加计算机的到成倍的到提升,redis的网络带宽也随着计算机和网卡的增加而成倍增长
31.redis分区的方案如下
    客户端分区就是客户端就已经决定数据会被存储到那个redis节点或者从那个redis节点读取,
大多数客户端已经实现了客户端分区
    代理分区,以为者客户端将请求发送给代理,然后代理决定去那个节点写数据或者读数据,代理根据分区规则决定请求哪些redis实例,
然后根据redis的响应结果返回给客户端,redis和memcached的一种代理实现就是twemproxy,
    查询路由,的意思是客户端随机地请求任意一个redis实例,然后由redis将请求转发给正确的redis节点,redis-cluster实现了一个
混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是客户端的帮助下直接redirected到正确的redis节点
32.redis分区缺点
    涉及多可key的操作通常不会被支持,例如-你不能对两个集合求交集因为他们可能被存储到不同的redis实例,同时操作多个key,则不能使用redis事务
分区使用的粒度是key,不能使用一个非常长的排序key存储一个数据集,当使用分区的时候,数据会非常复杂,例如为了设备你必须从不同的redis实例和
主机同时手机RDB/AOF文件,分区时动态扩容或者缩容是非常复杂,redis集群在信息时增加或者删除redis节点,能做到最大程度对用户透明地数据在平衡,
但其他一些客户端分区或者代理分区方法则不支持这种特性,然而,有一种预分片的技术也可以较好的解决这个问题
33.redis持久化数据和缓存是怎么扩容的
    如果redis被当做缓存使用,使用一致性哈希实现动态扩容缩容,如果redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,
节点数量一旦确定不能变化,否则redis节点需要动态变化情况,必须使用可以在运行时进行数据在平衡的一套系统,而当前的只有redis集群可以做
34.分布式redis什么时期做较好
    既然redis是轻量级的,为了防止以后扩容,最好的办法就是一开始启动较多实例,即便你只有一台服务器,也可以一开始就让redis以分布式的方式运行,
使用分区,在同一台服务器上启动多个实例,一开始就多设置几个redis实例,操作起来可能比较麻烦,但是从长期发展来看,有利有弊,当数据不断增长,
需要跟多的redis服务器时你需要做的就仅仅是将redis实例从一台服务器迁移到另一台服务器,不需要考虑分区,如果需要添加一台服务器,
需要将另一半redis实例迁移过去就好了
    35.twemproxy是什么玩意,
它是twitter维护的代理系统,代理memcached的ascii协议和redis协议,它是单线程程序,使用c语言编写的,运行起来非常快,它是采用apache2.0license的
开源软件,twemproxy支持自动分区如果其代理的其中一个redis节点不可用时,会自动将该节点排除,twemproxy本身是不存在单点问题,因为可以启动多个
twemproxy实例,然后让客户端去连接任意一个twmproxy实例,twemproxy是redis客户端和服务器中的中间层,
由它来处理分区功能比价可靠地,
    36.支持一致性哈希的客户端有哪些,
redis-rb,predis
    37.redis与其他的key-value存储的不同点
redis更为复杂的数据结构并提供对他们的原子性操作,这是一个不同于其他数据库的进化路径,redis的数据类型都是基于基本数据结构的同时对程序员也是透明的
redis运行在内存中但是,可以持久化到银盘,所以对不同数据集进行高速读写是,需要考虑内存,因为数据量不能大于内存,在内存数据库方便是一个优点,
相比在磁盘上的相同的复杂的数据结构,在内存中操作起来非常简单,这样redis可以做到很多内部复杂性很强的事情,同时,在磁盘格式化方面,他们是紧凑的以追加
的方式产生的,因为他们不需要进行司机访问
    38.redis的内存占用情况
举个例子,100万个键值对,在我的32为的笔记本上,用了100m同样的数据放到key只需要16m,这是因为键值有一个很大的开销,
    39.都有哪些办法可以降低redis的内存使用
如果使用的时32位的redis实例,可以好好利用hash,list,sorted,set,set等集合数据,通常情况下有很多的key-value可以更竞走的方式放在一起
    40.怎么查看redis使用情况
info
    41假如redis的内存用完会发生什么情况
如果达到设置的上限,redis的写命令会返回错误信息,或者将你reis会限时冲刷掉旧的内容
    42.redis是单线程的,怎么提高cpu的利用率呢
可以在同一台服务器部署多个redis的实例,并把它们当做不同的服务器来使用,在某个时候,乌龙演一个cpu不够,如果想要使用多个cpu,也可以考虑一下分片
    43.一个redis智力最多能存放多少个keys,list,set,sorted-set他们最多能存放多少元素,
理论上redis可以处理多大232的keys,每个实例最少存放存放2.5亿个keys,
redis存储的极限就是内存可用的内存值,可用内存值多少,nameredis存储就有多少
    44.redis常见的性能问题和解决方案
    1.master最好不要做任何持久化工作,如rdb内存快照,和aof日志文件
    2.如果数据比较重要,某个slave开启aof备份数,设置每秒同步一次
    3.为了主从赋值的速度和连接的稳定性,master和slave最好在同一个局域网内
    4.尽量避免在压力很大的主库上增加从库
    5.主从赋值不要用图状结构,用单向链表结构更为稳定,即:<<slave1<-slave2
    这样的结构方便解决单点故障问题,实现slave对master的替换,如果master挂了,可以立即启用slave1作为master,其他不变
    44.redis提供哪几种持久化方式、
    rdb持久化方式能够在指定的时间间隔能对你的数据进行快照存储
aof持久化方式记录每次对服务器写操作,当服务器重启的时候会重新指向这些命令来恢复原始的数据,aof命令以redis协议追加
保存每次写的操作到文件末尾,redis还能对aof文件进行后台重写,使得aof文件的额体积不至于过大,如果只是希望数据在服务器允许的时候存在,
也可以不使用任何持久化,也可以同时开启两种持久化方案,当这种情况下,redis重启的时候会有限载入aof文件来恢复原始的数据,因为在通常情况下
aof文件保存的数据集要比rdb文件保存的数据集要完整,最重要的时了解rdb和aof持久化的方式不同,让我们一rdb持久化方式开始
    45.如何选择持久化方式
    如果想达到与postgreSQL的数据安全性,应该同时使用两种持久化功能,如果非常关心数据,但任然可以承受数分钟以内的数据丢失,name可以使用rdb持久化,
有大部分用户还是只是用aof持久化,但并不推荐这种方式,因为定时生生rdb快照,非常便于进行数据流备份,并且rdb恢复数据集的速度要比aof恢复的速度要快,
除此之外,使用rdb还可以避免之前提到的aof的bug
    46.修改配置不重启redis梦不能实时生效
    针对运行的实例,有许多配置选项可以通过 config set命令进行修改,而无需指向任何形式的重启,从redis2.2开始,可以从aof切换到rdb的快照持久或其他
    方式而不需要重启redis,config get* 命令获取更多的信息
        但是偶尔重启是必须的,如果要升级redis程序到新的版本,或者当你需要修改某些目前config 命令还不支持的配置参数的时候

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值