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快照的方式,将内存中的数据不断写入磁盘,通常是定时写入,每一次写入时可能写入了大量的数据;第二种是使用类似MySQL的AOF日志方式,记录每次更新的日志,每操作一次都写入一次。前者性能较高,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(驱逐):禁止驱逐数据
写的有点粗糙,具体的细节知识再补充~- redis的一点小总结
- 最近的一点小总结
- Ajax的一点小总结
- c++的一点小总结
- RelativeLayout的一点小总结
- 数据库的一点小总结
- springCloud的一点小总结
- sql load的一点小总结
- 调试GMS项目的一点小总结
- sql load的一点小总结
- TinyXML类的一点小总结
- 小公司创业的一点总结
- 关于Json的一点小总结,
- 关于优化的一点小总结
- fr3报表的一点小总结
- 关于输入的一点小总结
- 于udp通信的一点小总结
- 关于内存管理的一点小总结
- poj 3494 Largest Submatrix of All 1’s(单调栈)
- QT Base64 编解码
- 程序的多文件组织
- 如何在spring中等价配置得到原本由jndi配置实现的数据源?
- 第二周——项目三(1)—体验复杂度-两种排序算法的运行时间
- redis的一点小总结
- sklearn上使用集成算法
- 组合博弈游戏
- VXLAN协议基础知识
- Java编程思想:吸血鬼数字
- JavaWeb应用基础一
- UE4:UMG挂小视口并自主键控相机
- 【模板】最长递增公共子序列
- 2.Java并发编程实战--第二章