数据库 磁盘IO太慢(原因需了解磁盘,磁道,扇区,操作系统) 内存级别数据库还太贵, 折中就是缓存
关系型数据库和非关系型数据库的区别:
关系型数据库是依据关系模型来创建的数据库,数据和数据之间有联系,非关系型数据库数据之间就没有联系
非关系型模型:列模型(Hbase),键值对模型(redis,MemcacheDB),文档类模型(mongoDB)
memcached和Redis都是键值对模型,但是memcached没有类型的概念.
而redis中有,还有对应的方法
所以, 相对于memcached来说redis是计算向数据移动了
任何数据类型 Redis都不会直接将它放在内存中存储, 而是转而内部使用redisObject来存储以及表示所有类型的key-value.
type表示一个value对象具体是何种数据类型(如果你对这个key的操作和type支持的操作不匹配就之间返回),encoding是不同数据类型在redis内部的存储方式。
比如:type=string表示value存储的是一个普通字符串,那么encoding可以是raw或者int,而关于其他数据类型的内部编码实现如下图
准备下篇博客总结
set结尾如果加上nx就是无数据时才赋值
加上xx就是只能更新值,如果有就不更新
使用场景 nx 实现 分布式上锁
解决存储对象的问题, value中再存键值对
hget, hgetall, hincrby, hincrbyfloat, hkeys, hlen, hmget, hmset, hset, hvals
hkeys操作查询对应的表头, hvals查询出内容, hgetall查询出全部(包括表头和内容)
hincr 可以支持对内容数值数值计算, 可以支持点赞, 收藏等数据计算
链表, redis中的key中还有指向list的头和尾两个指针.
L: List 或者 Left
R: Right
B: Block阻塞
命令:
lpush和lpop同向的压入弹出就是栈
lpush和rpop反向压入弹出就是队列
去重, 不维护排序(无序),
方法:
Z开头的是sorted sets
在sorted之后还要有sorted sets是为什么?
要排序的功能
问题来了, 你存的东西按照什么规则排序?
每个存入的sorted sets元素包含信息还有分值和正负向索引.
方法:
底层数据结构, 怎么实现排序? 速度怎样?
数据结构: skip list跳表(牺牲一些存储空间换速度)
涉及概念: 层数(0层是原数据), 元素插入时随机造层, 增和删还需要修改指针, 改=删+增
redis是二进制安全的(只传输字节流), 所以一定要沟通好客户端的编码.
hyperloglogs、地理空间( geospatial)、消息(Streams)
还有些其他的操作:
flushall
,flushdb
,keys *
,type
,object encoding xx
,
redis默认16个区 可以通过select 区域号选择
如何处理并发请求?
linux系统内核提供的 epoll这个方法(谁有数据处理谁)
系统内核提供read方法, 是阻塞的
问题: 多个请求, 其中一个请求如果产生阻塞的话, 就只能通过抛出更多的线程处理多个请求, cpu资源会浪费, 内存也会被浪费
看系统内核方法:
man 2 方法名
查询文件描述符
cd /proc/进程号/fd
进程号怎么看
ps -fe [| grep 搜索名]
不阻塞, 一个线程就可以处理, 但是发生轮询(发生在用户空间)
详细Redis和I/O多路复用的博客推荐:
https://blog.csdn.net/HD243608836/article/details/102849388
AIO Windows可以实现AIO
0拷贝 sendfile方法
nginx也是使用多路复用epoll