redis的学习整理

一 redis 原理

1.1 数据存取

fds的处理图

1.1.1 select

1.select模型每次都直接将rset(fds)全部拷贝到内核态,因为内核态速度比用户空间态快很多。
2.如果没有数据,select函数会阻塞。如果有数据的话:将有数据的fds标记,select不在阻塞,整体遍历fds,找到数据的fd读取数据做处理。fd不能重用,每一次都需要重新创建新的fds且将用户空间太的fds拷贝到内核态。
缺点:

  • 因为fds最大支持1024
  • 因为fd不可重用,所以导致为了标记fd,必须创建一个新的rset从而导致fds在用户态内存态多次拷贝。
  • copy以后,再次遍历。因为rset里的fd被置位以后,select函数并不知道哪个被置位了,需要从头遍历到尾,逐个对比

1.1.2 poll

  1. 解决了select哪些问题
    采取的链表存储,而不是bitmap,解决了1024长度限制问题
    采取结构体每次置位结构体内的revents字段,而不破坏fd本身,所以可重用,不需要每次都创建新的fd。
  2. 缺点
    用户控件态拷贝rset到内核态也需要时间,虽然内核态执行比用户态快,但是copy也需要开销
    O(n)再次遍历问题。因为rset里的fd被置位后,select函数并不知道哪个被置位了,需要从头遍历到尾,逐个对比。

1.1.3 epoll

  1. epoll的模型是 红黑树模型
  2. 每一次的置为,nfds都会加一。且会回调epoll_wait,所以epoll_wait执行完会返回有几个fd有数据,只需for直接遍历nfds次即可。
nfds = epoll_wait(epfd, events, 5, 10000);
for(i=0;i<nfds;i++){
    
    
	memset(buffer, 0, MAXBUF);
	read(events[i].data.fd, buffer, MAXBUF);
	puts(buffer);
}

1.2 持久化

RDB: 通过bgsave命令触发,然后父进程执行fork操作创建子进程,子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换(定时一次性将所有数据进行快照生成一份副本存储在硬盘中)
AOF: 开启后,Redis每执行一个修改数据的命令,都会把这个命令添加到AOF文件中

二 redis 操作

2.1 redis 数据类型

数据类型
string
Hash
list
set

2.2 redis的命令

2.2.1 redis客户端的基本语法

./redis-cli

命令 简述 描述
DEL DEL key 该命令用于在 key 存在时删除 key。
DUMP DUMP key 序列化给定 key ,并返回被序列化的值。
EXISTS EXISTS key 检查给定 key 是否存在。
EXPIRE EXPIRE key 为给定 key 设置过期时间,以秒计。
EXPIREAT EXPIREAT key EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
PEXPIRE PEXPIRE key 设置 key 的过期时间以毫秒计。
PEXPIREAT PEXPIREAT key 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
KEYS KEYS pattern 查找所有符合给定模式( pattern)的 key 。
MOVE MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中。
PTTL PTTL key 以毫秒为单位返回 key 的剩余的过期时间。
TTL TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
RANDOMKEY RANDOMKEY key 从当前数据库中随机返回一个 key 。
RENAME RENAME key newkey 修改 key 的名称。
RENAMENX RENAMENX key newkey 仅当 newkey 不存在时,将 key 改名为 newkey 。
SCAN SCAN cursor [MATCH pattern] [COUNT count] 迭代数据库中的数据库键。
TYPE TYPE key 返回 key 所储存的值的类型。

猜你喜欢

转载自blog.csdn.net/m0_37111373/article/details/114064801
今日推荐