Redis学习

Redis实战

Redis定义:redis是一个key-value类型的内存数据库。支持数据持久化和快速操作。

一、

Redis提供了5种不同类型的数据结构。

1.String 。常用命令GET、SET、DEL

2.List 。常用的命令RPUSH、LRANGE、LINDEX、LPOP

3.Set 。常用的命令SADD、SMEMBERS、SISMEMBER、SREM、SINTER、SUNION、SDIFF

4.zSet 。 常用的命令ZADD、ZRANGE、ZREVRANGE、ZRANGEBYSCORE、ZREM、ZINTERSTORE

5.Hash 。常用的命令HSET、HGET、HGETALL、HDEL

memcached和Redis比较:两者都可用于存储键值映射,彼此的性能也相差无几,但是Redis能够自动以两种不同的方法将数据写入硬盘,并且Redis除了能存储普通的字符串之外,还可以存储其他4种数据结构,而memcached只能存储普通的字符串键。

Redis拥有两种不同的持久化方法,它们都可以用小而紧凑的格式将存储在内存中的数据写入硬盘。

第一种持久化方法为时间点转储(point-in-time-dump),转储操作既可以在"执行时间段内有指定数量的写操作执行"这一条件被满足时执行,又可以通过调用两条转储到硬盘(dump-to-disk)命令中的任何一条来执行;

第二种持久化方法将所有修改了数据库的命令都写入一个只追加(append-only)文件里面,用户可以根据数据的重要程度,将只追加写入设置为不同步(sync)、每秒同步一次或者每写入一个命令就同步一次。

Redis主从复制的过程:1.从服务器连接主服务器,发送SYNC命令。2.主服务器接受到SYNC命令,开始执行BGSAVE命令。并使用缓存区记录BGSAVE之后执行的所有写命令;这时候从服务器根据自己的配置选项来决定继续使用现有的数据(如果有的话)来处理客户端的命令请求,还是返回错误。 3.主服务器BGSAVE执行完毕,向从服务器发送快照文件,并在发送期间继续使用缓冲区记录被执行的写命令;从服务器丢弃所有旧数据,开始载入主服务器发来的快照文件。4.主服务器快照发送完毕,开始向从服务器发送存储在缓冲区里面的写命令;从服务器完成对快照文件的解释操作,像往常一样开始接受命令请求。5.主服务器缓冲区存储的写命令发送完毕,从现在开始,每执行一个写命令,就向从服务器发送相同的写命令;从服务器执行主服务器发来的所有存储在缓冲区里面的写命令;并从现在开始,接收并执行主服务器传来的每个写命令。Redis不支持主主复制。

可以通过命令redis-check-aof和redis-check-dump两个命令分别检查AOF文件问题和Redis数据库文件问题

Redis的事务以MULTI为开始,之后是用户需要执行的操作命令,最后以EXEC为结束。

WATCH命令对键进行监视,在未执行EXEC命令的这段时间里面,如果有其他客户端抢先对任何被监视的键进行了操作,这时候执行的EXEC就会执行失败并返回一个错误。

UNWATCH命令可以在WATCH命令执行之后,MULTI命令执行之前对连接进行重置(reset);

DISCARD命令也可以在MULTI命令执行之后,EXEC命令执行之前对连接进行重置(reset);

这里引入了一个二阶提交的概念,像是事务就是采用了二阶提交,删除包裹,,二阶提交的前提是必须可以以一致的形式读取数据。

为了扩展Redis的读性能,并为Redis提供故障转移(failover)支持,Redis实现了主从复制特性:执行复制的服务器会连接上主服务器,接受主服务器发送的整个数据库的初始副本(copy);之后主服务器执行的写命令,都会被发送给所有连接着的从服务器去执行,从而实时地更新从服务器的数据集。因为从服务器包含的数据会不断地进行更新,所以客户端可以向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。

StackExchange.redis项目下面的ConnectionMultiplexer类是该项目的核心对象。它在调用者之间被设计为共享和重用的,该对象是完全线程安全的。

 

计数信号量是锁的一种,当我们需要让多个客户端同时访问相同的信息时,技术信号量就是完成这项任务的最佳工具。

 

降低内存占用

1.短结构(short structure)。Redis为列表、集合、散列和有序集合提供了一组配置选项,这些选项可以让Redis以更节约空间的方式存储长度较短的结构(短结构)

在列表、哈希和有序集合的长度较短或者体积较小的时候,Redis可以选择使用一种名为压缩列表(ziplist)的紧凑存储方式来存储这些结构。

正常情况下Redis存储列表使用双链表来表示、存储散列和集合使用散列来表示、存储有序集合使用散列加上跳跃表来表示。但是压缩列表会把这三种数据格式以一种非结构化(unstructured)表示。压缩列表会议序列化的方式存储数据,这些序列化数据每次被读取的时候都要进行解码,每次被写入的时候也要进行局部的重新编码,并且可能需要对内存内的数据进行移动。

 

type-max-ziplist-entries 128 --表示列表、有序集合或者哈希最大只能有128条数据

type-max-ziplist-value 64 --表示列表、有序集合或者哈希最大字节数为64

set-max-intset-entries 512 --标识整形集合最大只能有512条数据

set-max-intset-value 64 --表示整形集合最大字节数为64

超过上述的范围,就不会进行压缩列表处理。

2.分片结构(shared structure)

分片是一种广为人知的技术,很多数据库都使用这种技术来扩展存储空间并提高自己所能处理的负载量。分片本质上就是基于某些简单的规则将数据划分为更小的部分,然后根据数据所属的部分来决定将数据发到哪个位置上面。这里只是描述了一个概念,需要我们通过对这个概念的理解,存储和获取的时候自己手动处理分片。

 

3.打包存储二进制位和字节

 

Q0.Hash和键值对?

Hash和键值对得到的数据是一样的,只是可能存储和展示的数据结构会比较不一样。

Q1.多台服务器弄成一个数据库服务叫什么?

集群

Q2.分片?

基于某些简单的规则,把数据划分为更小的部分,然后根据数据所属的位置,把数据分发到目标位置上存储起来。

Q3.复制的特性扩展读取的性能?

主从复制的特性,另外增加一个从库进行读取的操作,所以可以提升性能。

Q4.客户端分片来扩展写的性能?

分片可以扩展写的性能。 一个比较简短的键的数据写入,永远要比一个比较大的键的数据写入速度要快。

Q5.故障转移服务

TODO

Q6.签名Cookie和令牌Cookie

对于用来登录的cookie','有两种常用的方式可以将登录信息存储在cookie里面:

1.签名(Signed)cookie,通常会存储用户名,可能还有用户ID、用户最后一次成功登录的时间,以及网站觉得有用的任何信息。

优点:验证cookie所需的一切信息都存储在cookie里面。cookie可以包含额外的信息(additional information),并且对这些信息进行签名也很容易。

缺点:正确地处理签名很难。很容易忘记对数据进行签名,或者忘记验证数据的签名,从而造成安全漏洞

 

2.令牌(Token)cookie,通常存储一串随机字节作为令牌,服务器可以根据令牌在数据库中查找令牌的拥有者。

优点:添加信息非常容易,cookie的体积非常小,因此移动终端和速度较慢的客户端可以更快地发送请求。

缺点:需要在服务器中存储更多信息。如果使用的是关系数据库,那么载入和存储cookie的代价可能会很高

 

Q7.锁和计数信号量

锁是为了控制并发的时候,唯一操作的进行。

计数量是为了控制并发的时候,只能目标个数的操作在同时进行。

 

主从服务器连接的过程。

1.从服务器连接(或者重连接)主服务器,发送SYNC命令。

2.主服务器接受到命令,开始执行BGSAVE,并使用缓冲区记录BGSAVE之后执行的所有写命令。执行完BGSAVE命令之后,向从服务器发送快照文件,并在发送期间继续使用缓冲区记录被执行的写命令。

3.从服务器丢弃所有旧数据(如果有的话),开始载入主服务器发来的快照文件。

4.主服务器确定快照发送完毕,开始向从服务器发送存储在缓冲区里面的写命令,从服务器开始接受命令请求。

5.主服务器把缓存区存储的写命令发送完毕,从现在开始,每执行一个写命令,就向从服务器发送相同的写命令。

redis-benchmark -c l -1 (-c l选项让程序只使用一个客户端来进行测试,-q选项可以让程序简单输出结果)

特别注意,需要共享redis连接,因为每次连接redis都会耗费大量的性能(连接池)

 

 

 

上一篇:redis缓存穿透、缓存击穿、缓存雪崩区别和解决方案


下一篇:远程字典服务 — Redis 札记(十九:Redis缓存穿透和雪崩)