redis基础篇

1.redis常见的数据结构

    redis是一种以键值对存储的高性能内存数据库,有五种常用的数据类型,string,list,hash,set,zset。

2.redis的过期时间

  redis中的key可以设置过期时间,方式有两种,第一种是通过expire命令来设置,expire key seconds。第二种方式是使用setex(string key,int seconds,string value)。

3.过期键的删除策略

  在redis中,对于过期的键,删除策略有两种,第一种是被动删除,就是在访问设置了过期时间的key时,首先判断该key是否过期,如果该key已经过期,则删除。但是这种方式存在的问题就是没法删除长时间没访问到的key。第二种是主动删除,redis从设置了过期时间的键中选取一部分,将过期的键删除。

4.redis的持久化

  在redis中支持两种持久化的方式,一种是RDB,另一种是AOF(append-only-file)。其中RDB的方式是根据指定的规则将数据库中的数据存储下来,而AOF的方式是定时的将数据库的操作命令记录下来。

  RDB方式:当满足一定的条件时,redis会fork一个子进程来进行持久化,会先将数据存储在一个临时文件中,等到持久化过程结束后,替换原先的持久化文件。该方式的优点是持久化的线程是fork出来的,不会对服务的性能产生影响。但是缺点是最后一次持久化的数据可能会丢失。RDB会在下面几种条件下对数据进行快照,第一是根据配置规则进行自动快照,第二是执行save或bgsave命令,第三是执行flushall命令,第四是执行复制(replication)命令。

  AOF方式:当使用redis存储非临时文件时,为了防止数据的损失,采用AOF的方式是必要的。这种方式是将redis的每一条写命令追加到硬盘文件中,这种方式对redis的性能会有影响,但是这种性能损耗在一定条件下是可以接受的,另外使用较快的硬盘可以提高redis的性能。

5.redis的内存回收策略

扫描二维码关注公众号,回复: 5761727 查看本文章

    随着redis中存储的数据增多,当内存不足时,就需要淘汰一部分的数据,具体的淘汰规则有下面几种。

  第一种:noeviction,默认的策略,当内存不足时,所有申请内存的相关操作都会报错。

  第二种:allkeys-lru,从数据集(server.db[i].dict)中挑选最近最少使用的数据进行淘汰。使用场景:如果我们对缓存的访问都是热点数据,可以使用这个策略。

  第三种:allkeys-random,随机移除某个key。使用场景:如果我们的应用对于缓存key的访问频率相等,可以使用这个策略。

  第四种:volatile-random,从已设置过期时间的数据集(server.db[i].expires)中选取任意的数据进行淘汰。

  第五种:volatile-lru,从已设置过期时间的数据集(server.db[i].expires)中选取最近最少使用的数据进行淘汰。

  第六种:volatile-ttl,从已设置过期时间的数据集(server.db[i].expires)中选取将要过期的数据进行淘汰。

  总结:实际上Redis实现的LRU并不是可靠的LRU,也就是名义上我们使用LRU算法淘汰内存数据,但是实际上被淘汰的键并不一定是真正的最少使用的数据,这里涉及到一个权衡的问题,如果需要在所有的数据中搜索符合条件的数据,那么一定会增加系统的开销,Redis是单线程的,所以对于耗时的操作会谨慎一些。为了在一定成本内实现相对的 LRU,早期的Redis版本是基于采样的LRU,也就是放弃了从所有数据中搜索解改为采样空间搜索优解。Redis3.0 版本之后,Redis作者对于基于采样的LRU进行了一些优化,目的是在一定的成本内让结果更靠近真实的LRU。 

6.redis单线程效率高的原因

  redis是单线程的,通过单线程来处理所有来自客户端的请求。redis把所有的任务封装在了一个线程之中,从而避免了线程安全问题。至于为什么要使用单线程,官网认为redis的主要瓶颈在于内存和带宽,而不是cpu。

  redis是跑在单线程中的,所有的操作都是按照顺序线性执行的。但是由于读写操作等待用户的输入输出都是阻塞的,所以IO操作在一般情况下不能够直接返回,这会导致某一文件的IO阻塞,从而使整个进程无法对外提供服务,而IO的多路复用就是为了解决这个问题而出现的。

  几种简单的IO模型,第一种是同步阻塞IO(Blocking IO),即传统IO模型。第二种是同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO需要设置socket为NONBLOCK。第三种是多路复用(IO Multiplexing),即经典的reactor设计模式,也称为异步阻塞IO,java中的selector和linux的epoll都是这种模型。第四种是异步IO(Asynchronous IO),即经典的Proactor设计模式,也称为异步非阻塞IO。

  同步和异步指的是用户线程和内核的交互方式。阻塞和非阻塞指用户线程调用内核IO操作是阻塞还是非阻塞。

7.lua脚本在redis中的使用

  在redis中我们会面临一个问题

猜你喜欢

转载自www.cnblogs.com/code-star/p/10648221.html