redis的一点小总结

来源:互联网 发布:ubuntu ant android 编辑:程序博客网 时间:2024/05/16 07:29

redis的发展也是近几年的事,对于做互联网项目的开发人员还是很好用的一项技术,这里我主要是记录一些重点知识,详细的内容网上一搜一大堆,开始了~

主要搞清楚以下几个问题就可以了:

1、redis为什么可以做缓存?

2、redis都是怎么用的?

3、都用来存什么了?

4、redis的存储结构?

5、Redis集群会搭?

6、redis的事务?

7、redis丢失问题?

8、与其他非关系型数据库的区别?

9、与其他缓存服务的区别?

1、  能够作为缓存是因为:它是一种内存型数据库,具有

  多样的数据模型    能比其他缓存存储的数据结构更具有多样性。

·       持久化 

·       主从同步:   在搭集群时,一个redis  master 具有slave(可以不止一个)

这几种性质,相比某些缓存来说,它的持久化特性使其具有更高的可靠性。

Redis的持久化机制:通过两种方式可以实现数据持久化:一种是使用RDB快照的方式,将内存中的数据不断写入磁盘,通常是定时写入,每一次写入时可能写入了大量的数据;第二种是使用类似MySQLAOF日志方式,记录每次更新的日志,每操作一次都写入一次。前者性能较高,IO读写次数较少,但是可能会引起一定程度的数据丢失;

后者相反IO读写次数较高,效率较低。默认使用RDB方式,从缓存的角度建议使用RDB方式。


2 、redis一般作为缓存使用,利用的是String和hash这样的数据结构较多;其中还有那些朋友圈关系网之类的、排行榜之类都可以使用(暂时没用过)

3、Redis的数据类型:字符、散列、队列、集合、有序集合。

port 6379指定redis运行的端口,默认是6379

这里插播一个常用命令网页,写的很详细,自己在这就不写了:http://www.cnblogs.com/kevinws/p/6281395.html

4、Redis集群

a)      rediscluster集群最少的集群数量是3台,因为它们要使用投票机制进行选举(超过半数规则)

b)      rediscluster集群内节点可以互相通信,通过ping-pong机制。

c)      rediscluster集群被客户端连接时,只需要连接上任一节点即可。

d)      rediscluster集群是如何分配hash槽的呢?

                   i.           16384除以节点数,得到每个节点应该分配的hash槽数目

                  ii.           根据内置规则,将计算好的hash槽数目,分配给对应的redis节点中。

e)      rediscluster集群是什么时候分配hash槽的呢?

                   i.           通过redis-trib.rb脚本创建集群时,分配的。

f)       rediscluster集群是如何分配key-value数据存储到哪个节点呢?

                   i.           crc16(key)= hash数值

                  ii.           hash数值对16384取余,余数就对应slot槽下标

                iii.           注意:一个slot槽不只是存储一对key-value数据。

g)      rediscluster集群内有投票机制

                   i.           节点fail ?

                  ii.           集群fail !

5、redis与MongoDb的区别

mogodb是一种文档性的数据库。先解释一下文档的数据库,即可以存放xml、json类型的数据。呈现分层的树状数据结构。redis可以用hash存放简单关系型数据。适合一些博客平台,比如评论系统。而redis的数据类型更丰富

6、redis与Memache的区别

Redis和Memcache的对比,Redis和Memcache数据都是存储到内存中的,但是Redis存储的数据类型更加丰富,而且Redis可以通过集群策略提升性能。

7、数据丢失问题

一般来说这涉及到持久化的两种机制,如果数据很重要,官方建议两种持久化方式都启用

8、redis的事务问题

Redis事务的实现需要用到 MULTI  EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。

举个例子,使用redis-cli连接redis,然后在命令行工具中输入如下命令:

1234567891011121314151617181920
127.0.0.1:6379> MULTIOK127.0.0.1:6379> set url http://qifuguang.meQUEUED127.0.0.1:6379> set title winwill2012QUEUED127.0.0.1:6379> set desc javaQUEUED127.0.0.1:6379> EXEC1) OK2) OK3) OK127.0.0.1:6379>127.0.0.1:6379> get url"http://qifuguang.me"127.0.0.1:6379> get title"winwill2012"127.0.0.1:6379> get desc"java"127.0.0.1:6379>

从输出中可以看到,当输入MULTI命令后,服务器返回OK表示事务开始成功,然后依次输入需要在本次事务中执行的所有命令,每次输入一个命令服务器并不会马上执行,而是返回”QUEUED”,这表示命令已经被服务器接受并且暂时保存起来,最后输入EXEC命令后,本次事务中的所有命令才会被依次执行,可以看到最后服务器一次性返回了三个OK,这里返回的结果与发送的命令是按顺序一一对应的,这说明这次事务中的命令全都执行成功了。



9、另外一个知识点就是Spring整合了Redis,可以实现普通项目的redis缓存操作,具体可参考其他网络资源


10、这里摘抄一点网上分享的面试题

10.1、 使用redis有哪些好处?

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

(2) 支持丰富数据类型,支持string,list,set,sorted set,hash

(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除


10.2 redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据


10.3 redis常见性能问题和解决方案:

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。


10.4 

mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

 相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:

voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据

写的有点粗糙,具体的细节知识再补充~

原创粉丝点击