redis学习笔记

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无前滚和回滚。

你可能感兴趣的:(存储)