IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis总结 其一 概述 安装 类型 -> 正文阅读

[大数据]Redis总结 其一 概述 安装 类型

为什么要用Redis?

数据库 磁盘IO太慢(原因需了解磁盘,磁道,扇区,操作系统) 内存级别数据库还太贵, 折中就是缓存

关系型数据库和非关系型数据库的区别:
关系型数据库是依据关系模型来创建的数据库,数据和数据之间有联系,非关系型数据库数据之间就没有联系
非关系型模型:列模型(Hbase),键值对模型(redis,MemcacheDB),文档类模型(mongoDB)

memcached和Redis的区别

memcached和Redis都是键值对模型,但是memcached没有类型的概念.
而redis中有,还有对应的方法
所以, 相对于memcached来说redis是计算向数据移动了

Redis怎么存储数据的

任何数据类型 Redis都不会直接将它放在内存中存储, 而是转而内部使用redisObject来存储以及表示所有类型的key-value.
redisObject
type表示一个value对象具体是何种数据类型(如果你对这个key的操作和type支持的操作不匹配就之间返回),encoding是不同数据类型在redis内部的存储方式。
比如:type=string表示value存储的是一个普通字符串,那么encoding可以是raw或者int,而关于其他数据类型的内部编码实现如下图
引自https://baijiahao.baidu.com/s?id=1718316080906441023&wfr=spider&for=pc

Redis安装

准备下篇博客总结

安装的位置如下
redis各文件位置

Redis中的类型

String

  1. 字符类型
    不带什么开头的操作:
    set操作,get操作, getset操作(相对于get以后set减少一次io操作), mget操作, mset操作, msetnx操作(原子性操作), append操作,strlen操作, getrange(有正反向索引), setrange

    set结尾如果加上nx就是无数据时才赋值
    加上xx就是只能更新值,如果有就不更新
    使用场景 nx 实现 分布式上锁

  2. 数值类型
    incr, incrby, incrbyfloat, decr, decrby…
  3. bitmaps
    setbit, bitpos, bitcount, bitop(and, or)
    8位是一个字节, setbit x 8 1的strlen也是1
    场景: 1. 统计随机窗口内用户登陆天数
    2. 统计随机窗口天数内用户登录数量

hashes

解决存储对象的问题, value中再存键值对
hget, hgetall, hincrby, hincrbyfloat, hkeys, hlen, hmget, hmset, hset, hvals

hkeys操作查询对应的表头, hvals查询出内容, hgetall查询出全部(包括表头和内容)

hincr 可以支持对内容数值数值计算, 可以支持点赞, 收藏等数据计算

lists

链表, redis中的key中还有指向list的头和尾两个指针.
L: List 或者 Left
R: Right
B: Block阻塞
命令:

  1. lpush, rpush左侧右侧推数据
  2. lpop(从右侧弹出), rpop

lpush和lpop同向的压入弹出就是栈
lpush和rpop反向压入弹出就是队列

  1. lrange, lindex, lset, 类似数组
  2. lrem, linsert, ltrim
  3. blpop, brpop 阻塞, 单播队列

sets

去重, 不维护排序(无序),
方法:

  1. sadd(添加元素, 自动去重), srem(移除)
  2. sdiff, sdiffstore, sunion, sunionstore, sinter, sinterstore (inter交集, union并集, diff差集(有方向的), store是返回一个sets类型的目标)
  3. sismember, smembers查询有多少元素
  4. srandmember随机事件, spop也是随机取出
    例: 后接正数 取出一个不重复的结果集(不能大于已有的)
    后接负数 取出一个带重复的结果集(满足数量)
    解决: 抽奖 正数: 抽中过就不能再中了
    负数: 中过还能中(奖品大于人数)

sorted sets

Z开头的是sorted sets
在sorted之后还要有sorted sets是为什么?
要排序的功能
问题来了, 你存的东西按照什么规则排序?

每个存入的sorted sets元素包含信息还有分值和正负向索引.
方法:

  1. zadd
  2. zincrby
  3. zcount(分值区间内有多少个元素)
  4. zrange(通过排名查看元素 分值从小到大)[方法后可加 withscores顺便看分值], zrangebyscore(正序看分值内的元素), zrevrangebyscore(倒序看)
  5. zrank 查看排名
  6. zunion[store]… 需要给出 权重weights, 和aggregate聚合参数(默认: 权重*分值求和, 还有max取最大值)

底层数据结构, 怎么实现排序? 速度怎样?
数据结构: skip list跳表(牺牲一些存储空间换速度)
涉及概念: 层数(0层是原数据), 元素插入时随机造层, 增和删还需要修改指针, 改=删+增

redis是二进制安全的(只传输字节流), 所以一定要沟通好客户端的编码.

其他类型包括

hyperloglogs、地理空间( geospatial)、消息(Streams)

还有些其他的操作:
flushall , flushdb , keys * , type , object encoding xx ,
redis默认16个区 可以通过select 区域号选择

Redis是单线程 单进程的

如何处理并发请求?
linux系统内核提供的 epoll这个方法(谁有数据处理谁)

内核的发展史

BIO时期

系统内核提供read方法, 是阻塞的
问题: 多个请求, 其中一个请求如果产生阻塞的话, 就只能通过抛出更多的线程处理多个请求, cpu资源会浪费, 内存也会被浪费

看系统内核方法:
man 2 方法名
查询文件描述符
cd /proc/进程号/fd
进程号怎么看
ps -fe [| grep 搜索名]

NIO时期(同步非阻塞 多路复用 epoll)

不阻塞, 一个线程就可以处理, 但是发生轮询(发生在用户空间)

  1. 同步非阻塞时期
    死循环监控
    问题: 用户态和内核态频繁切换, CPU保护现场恢复现场, 轮询调用次数太多
    解决这个问题: 内核发展 -> select
  2. 仍然是:同步非阻塞
    内核系统调用 select方法 多路复用
    内核监控 有数据内核再调read方法 减少了内核态和用户态的切换
    问题: 仍然还是需要内核和用户态的切换并且需要返回哪些可以调用read
    解决这个问题: 内核再发展 epoll(epoll_create, epoll_ctl, epoll_wait三个系统调用) 和 mmap(用户态和内核态 共享空间) -> 这样就不用经常拷贝数据了
  3. 共享空间中存放的数据结构是: 红黑树 和 链表
    伪AIO时期

详细Redis和I/O多路复用的博客推荐:
https://blog.csdn.net/HD243608836/article/details/102849388

AIO Windows可以实现AIO
0拷贝 sendfile方法
nginx也是使用多路复用epoll

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-14 21:14:25  更:2022-02-14 21:16:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:44:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码