除了早先的字符串、列表、哈希、集合、有序集合,最新的版本还提供了位图(BitMaps)、HyperLogLog:超小内存唯一值计数、GEO:地理信息定位。
主服务器的数据可以同步到从服务器上面。
./redis-server
./redis-server --port 6380
./redis-server configPath
一般我们会创建一个config
目录,里面放了redis服务器多个配置文件,每个配置文件对应一个redis服务器。
查看redis配置文件的方法:
cat redis-6381.conf | grep -v "#" | grep -v "^$"
其中参数-v
代表过滤掉的意思。所以会过滤掉#
和空格。
执行上面的命令,得到如下结果:
bind 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
注意:后面还省略了一些
然后,我们可以把去掉注释的配置文件重定向另一个配置文件,达到复制的效果:
cat redis-6381.conf | grep -v "#" | grep -v "^$" > redis-6382.conf
基本配置:
假设这是redis-6382.conf配置文件:
bind 127.0.0.1
daemonize yes
port 6382
dir "/downloads/redis-4.0.8/data"
logfile "6382.log"
(其中,logfile是与dir相对应的,也就是说,6382.log
是在目录/downloads/redis-4.0.8/data
下的)
启动:
./redis-server config/redis-6382.conf
因为是以守护进程的方式启动的,所以在终端上面看不到启动成功的画面,可以使用命令:
ps -ef | grep redis-server | grep 6382
keys命令一般不在生产环境使用,因为它的时间复杂度是O(n)。
dbsize可以在生产环境中使用,因为它的时间复杂度是O(1)
exists可以在生产环境中使用,因为它的时间复杂度是O(1)
ttl的结果如果是 -1,代表key存在,并且没有过期。
用空间换时间的话,可以使用压缩列表结构。比如元素个数比较小的时候。
setxx可以理解为更新操作(因此需要key存在才可以更新)
使用一次mget和n次get的区别:
所以关键是多出了n次网络时间。
1、记录网站每个用户个人主页的访问量。
例如:
单线程无竞争,意思是Redis是天然适合做计数器的,所以在并发执行incr的时候,不会发生竞争问题。
2、缓存视频的基本信息(视频的数据源在MySQL中)
伪代码:
Mapmap(即map的map)
都是h开头的
1、抽奖系统
2、Like、赞、踩
3、标签
1、共同关注
客户端请求Redis服务器的一个完整生命周期:
因为Redis是单线程的,所以第二个步骤需要排队。
两点说明:
- 慢查询是发生在第3阶段
- 客户端超时(即客户端很久都没有得到Redis的响应结果)不一定慢查询,但慢查询是客户端超时的一个可能
这种模型类似于生产者与消费者模型。
每个订阅者是可以订阅多个频道的:
注意一个问题,加入一个发布者已经发布了一条消息到一个频道,一个新的订阅者去订阅这个频道,它是收不到之前的消息的。
发布订阅是发布者发布一条消息,所有的订阅者都可以收到消息。而消息队列是一个抢的功能,也就是说,只有一个消息订阅者可以收到(Redis没有去实现消息队列这样的功能)。
例子:
每个字节是字母对应的ASCII值。
通过位图,我们可以取到每一个位对应的值。
基于HyperLogLog算法:用极小空间完成独立数量统计。
它的本质还是字符串。
因为HyperLogLog只能够用来统计数据量,无法取出单条数据。
而且如果我们需要精确统计的话,用HyperLogLog可能不太好,因为它很难得到精确的答案。
GEI(地理信息定位):存储经纬度,计算两地距离,范围计算等。
可以算出指定范围内的member。
1、类似微信摇一摇的功能。
2、外卖定位的功能。
redis所有数据保持在内存中,对数据的更新将异步保持在磁盘上。
假如说现在数据库里有10条数据,那我相当于拍一张照片,把数据拷贝出来,作为一个快照。即某时某点数据的一个备份。
例如,MySQL的Dump、Redis的RBD就是这种方式。
就是说,我们的数据库只要做任何数据的更新,我们就将它记录在日志当中。当某时候,我们需要将数据进行一个恢复的时候,我们只需要把这个日志拿过来,重走一遍完整的过程,就可以获取完整数据的一个变化。
例如,MySQL的 Binlog、Redis的 AOF。
它是阻塞的。
图中代表的含义是,如果在60秒内,对数据进行了10000次改变,那么会自动生成RDB文件;如果在300秒内,对数据进行了10次改变,那么会自动生成RDB文件;如果在900秒内,对数据进行了1次改变,那么会自动生成RDB文件。
一般我们不会去配置自动生成RDB。
- 全量复制
- debug reload
- shutdown
- 耗时、耗性能
- 不可控、丢失数据
因为生成RDB文件的本质是往硬盘中写数据,所以非常耗时。
如果在T4时间点Redis服务器发生了宕机,那么在T3时间点写入的数据,就会丢失。(但是在T1时间点写入的数据,还是会被保留下来)
每次写入一条命令,就会在AOF文件里面追加一条日志(实际上会先写在缓冲区当中)。
这种方式(no 策略)是由操作系统决定什么时候把数据写入AOF文件中。
- 减少磁盘占用量
- 加速恢复速度
这种方式会创建一个子进程,然后子进程去完成AOF重写的操作。
其中,启动优先级的意思是当Redis服务器启动的时候,既有RDB文件又有AOF文件的时候,优先加载AOF文件;体积小指的是RDB文件下,因为会对数据进行压缩;轻重指的是产生RDB文件这个过程是很重的,因为需要把数据完整的写入到磁盘中(比如,第二次产生RDB文件需要从头开始)。而产生AOF文件是一个追加的过程(也就是说,不需要从头开始产生)。
单机的意思是在一台机器上去部署一个Redis节点。
主从复制是实现高可用的方式。
图片的意思是右边的Redis节点(从)去复制左边的Redis节点(主)的内容。
- 数据副本
- 扩展读性能
可以实现流量的分流、负载均衡、读写分离(主节点负责写,然后从从节点读出数据)
注意,一个从只能有一个主,而一个主可以有多个从。
左边的主Redis节点做出的修改,会在右边的从Redis节点反映出来。
- 一个master可以有多个slave
- 一个slave只能有一个master
- 数据流向是单向的,master到slave
这条命令的意思是让redis-6380成为redis-6379的从,也就是说,redis-6379是主,而redis-6380是从。
其中:
slave-read-only yes
的意思是只能对这个从节点进行读的操作。这样做是为了保证主从之间数据一致,以防从节点写入了数据,而主节点没有这个数据。
info replication
当把一个redis节点作为另一个redis节点的从时候,这个从原来的数据会被全部清空,以保证从的数据与主的数据一致。
也就是说,从节点通过主节点传过来的RDB文件和buffer的数据,来实现对主节点数据的全量复制。