Redis学习整理
一 redis 原理
1.1 数据存取
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
- 解决了select哪些问题
采取的链表存储,而不是bitmap,解决了1024长度限制问题
采取结构体每次置位结构体内的revents字段,而不破坏fd本身,所以可重用,不需要每次都创建新的fd。 - 缺点
用户控件态拷贝rset到内核态也需要时间,虽然内核态执行比用户态快,但是copy也需要开销
O(n)再次遍历问题。因为rset里的fd被置位后,select函数并不知道哪个被置位了,需要从头遍历到尾,逐个对比。
1.1.3 epoll
- epoll的模型是 红黑树模型
- 每一次的置为,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 所储存的值的类型。 |