1. redis的数据类型可以是:string, hash, set, list, set, sorted set.
2.redis两种文件格式:全量数据和增量数据请求。全量数据格式将内存中的数据写入磁盘,下次读取文件进行加载;增量请求文件把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化操作包括set, rpush,sadd,zadd.
3. redis存储分为内存存储,磁盘存储,log文件存储。在配置文件中有3个参数对其进行配置。
save seconds update:指出多长时间内有多少次更新操作,就将数据同步到数据文件;
appendonly yes/no:指出是否再每次更新操作后进行日志记录,如果不开启,可能会子啊断电时导致一段时间内的数据丢失;
appendfsync no/always/everysec :no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。
4. redis是一个tcp服务用CS模型和request/response协议。
5. clinet传送一个查询到服务端,从socket读取数据,通常为等待服务端的响应需要block.
6.服务端处理command后sands response back to client。
7.pipeline提供缓冲,解决了RRT (round trip time)慢的问题。
8.一次性不宜传很多commands给服务端,因为如果有pipelining传送的话,会强行转为queue.
9. redis client是线程安全的。
10. 如果用多个redis数据库在同一个应用中,必须为每个数据库建立独立的客户端。
11.pipelines基于redis class的子类,提供多个命令缓冲。
r.pipeline()保证所有命令是个原子操作,如果不想是原子操作,则可以r.pipeline(transactioin=False)。
13.如果可能尽量用hash结构来存储,因为hash会被encoded in a very small space。
14. redis监控:
a. redis-benchmark -h localhost -p 6379 -c 100 -n 100000
100个并发,100000个请求,检测host为localhost端口为6379的reids服务器性能。
b.
redis-cli -h localhost -p 6380 monitor
Dump all the received requests in real time;
监控host为localhost,端口为6380,redis的连接及读写操作。
c.redis-cli -h localhost -p 6380 info
Provide information and statistics about the server ;
提供host为localhost,端口为6380,redis服务的统计信息
d.redis-stat host localhost port 6380 overview
Print general information about a Redis instance;
实时打印出host为localhost,端口为6380,redis实例的总体信息
15.大数据包括:线下数据——在持久化的介质中存储的、用于数据挖掘的、结构化的数据;线上数据——在内存中存储的、用于在线服务的、结构化或半结构化或混合结构的数据。
如果数据处理要求比单台机器能力高一个数量级的话,这样的数据就称为大数据。
16.缺点是容量受物理内存限制,不能用作海量数据的高性能读写。
没有可扩展机制,依赖客户端实现分布式读写,因此reids适合的场景主要局限在较小数据量的高性能操作和运算上。
17. aof性能比rdb 低,但数据丢失方面比rdb 安全。
18. 单线程异步处理事件,多线程处理I/O。
19. 代码结构:
anet.c网络通信
ae.c ae_select.c ae_epoll.c ae_kqueue.c事件处理
adlist.c dict.c zipmap.c主数据结构
zmalloc.c内存分配
sds.c动态字符串处理
reids.c主函数
代码骨架:
-main
--initServerConfig(reids.c)——初始化redisServer中的一部分fields的value
--initServer
20. reids宣言:
a. redis是一个操作数据结构的语言工具,提供tcp协议以操作丰富的数据结构。
b. reids是一个内存数据库,redis会尝试其他存储方面的选择,但永远不会改变它是一个内存数据库的角色。
c. reids使用基础的api操作基础的数据结构,reids的api与数据结构一样,都是一些最基础的元素。
d. reids有着诗一般优美的代码,经常有不太了解redis原则的人会建议采用一些其他人的代码,以实现redis未实现的功能,但这队我们来说就像非要给《红楼梦》接上后四十回一样。
e. redis始终避免复杂化,我们认为设计一个系统的本质,就是雨复杂化作战。我们不会为了一个小功能而往源码里添加上千行代码,解决复杂问题的方法就是让复杂问题永远不要提复杂的问题。
f. redis支持两个层的api,第一个层面包含部分操作api,但它支持用于分布式环境下的redis。第二个层面的api支持更复杂的multi-key操作。它们各有所长,但是我们不会推出两者都支持的API,但我们希望能够提供实例间数据迁移的命令,并执行multi-key操作。
g. 我们以优化代码为乐,我们相信编码是一件辛苦的工作,唯一对得起这辛苦的就是去享受它。如果我们在编码中失去了乐趣,那最好的解决办法就是停下来。我们决不会选择让Redis不好玩的开发模式。
21. redis:under the hood(后台)
a. startup(main in reids.c)
b. beginning global server state initialization
initServerConfig() is called, initializes a variable server(type struct redisServer), the server as the global server state.
c. setting up command table
these are defined in a global variabel readonlyCommandTable(an array of struct redisCommands).
d. loading config file
server初始化工作开始于initServerConfig(),结束于initServer()
e. Event loop
ae.h 提供了一个独立的平台封装了I/O event notification loops。封装机制用epoll on linux , kqueue on BSD, and falls back to select if the respective first choice is not available。
f. Databases
initServer() alse initializes a number of redisDb objects. default 16 separate databases.
g. TCP socket
initServer() is where the socket that redis listens for connections is set up.
anet.h is another redis-local wrapper, defines anetTcpServer() and a number of other functions that simplify the usual complexity of setting up a new socket, binding and listening to a port.
22. reids在处理请求时是用单线程异步模式,通过epoll监听所有连接的读写事件,并通过相应的响应函数处理。采用这种设计原因是redis服务是高并发的短连接,且请求处理事件非常短暂。 缺点是一旦有请求阻塞了服务,整个redis将受影响。 优点是可以避免系统上下文切换的开销。
23. redis无前滚和回滚。