当前位置:   article > 正文

狂神说redis学习笔记_狂神说redis笔记

狂神说redis笔记

Redis

笔记来源
bilibili狂神说-redis学习视频

历史演进

  • 90年代单机版,servlet+jsp+mysql,存储在一台服务器上。
  • 后来随着访问量上升,出现性能问题,增加数据库垂直拆分(读写分离),在三个服务器上安装三个mysql,其中写操作只往其中专门写的服务器上进行,然后将写完的数据同步到其他读服务器上。
  • 后来发现大部分都是读操作,因此增加缓存,将一个已经读取过的数据加入缓存中,下次直接从缓存中取,这样就减轻了数据库的压力
  • mysql单表超过300w必须使用索引
  • 读写混合
  • 阿里巴巴架构演进

nosql数据模型

nosql四大分类

  • KV键值对:
    • 新浪:redis
    • 美团:redis+tair
    • 阿里、百度:redis+memecache
  • 文档型数据库(bson格式和json一样)
    • MongoDB(重要)
      • MongoDB是一个基于分布式文件存储的数据库,c++编写,主要用来处理大量文档的存储
      • MongoDB是一个介于关系型数据库和非关系型数据库中间产品,是非关系型数据库中功能最丰富的,最像关系型数据库的
    • ConthDB
  • 列存储数据库
    • HBase
    • 分布式文件系统
  • 图关系数据库(存储数据关系,不是保存图片)
    • Neo4j、infoGrid

redis属于键值对nosql数据库,与文档相关的MongoDB,大数据领域的HBase,了解图数据库Neo4j。
在这里插入图片描述

CAP

BASE

Redis入门

Redis安装

下载

访问官网,点击首页的download it即可下载,Windows要去github上下载,但是已经停更很久了,redis官网不建议使用Windows系统,存在兼容问题。

Windows

  • redis GitHub Windows下载安装包
    点击官网这里,在介绍中有说不支持Windows,但是Windows官方在支持redis,可以点击这个Windows支持的版本去GitHub上下载安装包。在GitHub上点击Releases,选择对应版本下载即可。

  • 解压安装包,解压后如下图,可以发现这个包大小只有5M
    在这里插入图片描述

  • 启动redis服务,双击redis-server.exe,如下图
    在这里插入图片描述

  • 使用redis客户端连接服务,双击redis-cli.exe,发现黑窗口127.0.0.1:6379,表示已经连接,输入命令ping,响应pang表示连接成功。

Linux

  • 下载安装包,访问官网,点击download it即可。中文网和英文网的版本有点区别

  • 使用xftp或其他软件将安装包上传至服务器

  • 移动压缩包到opt目录下

  • 使用命令tar -zxvf redis-5.0.8.tar.gz 解压,解压后如图,这里需要注意的是这个redis.conf这个文件和sentinel.conf,这两个一个是redis-server的配置文件,另一个是哨兵模式的配置文件在这里插入图片描述

  • 安装gcc环境,执行命令yum install gcc-c++

  • 使用命令gcc -v查看是否安装成功

  • make命令加载依赖库,等待一段时间,大概几分钟。完成之后再执行make命令,就会发现很快。完成之后就会发现redis已经安装成功,再执行make install(可以不执行,只是为了确认),就会发现都已经安装成功了。

  • redis的默认安装路径/usr/local/bin,安装完成后在该目录下可以查看,文件与Windows是一样的,如图,下图中的redisredis-sentinel就是哨兵,哨兵是一个单独的进程。在这里插入图片描述

  • 将解压后的文件内redis.conf文件拷贝到当前目录下 cp /opt/redis-5.0.8/redis.conf /usr/local/bin,这样就即保留了原始的配置文件在解压目录中,又可以更改当前目录下的配置文件自定义配置启动redis。

  • redis默认不是后台启动的,因此需要修改配置

  • 修改配置文件,vim redis.conf,这里需要修改的是usr/local/bin下的配置文件,

    • 修改配置文件中 daemonize 为yes,意思是改为后台1启动
  • 启动redis服务redis-server redis.conf表示使用该配置文件启动redis服务

  • 使用客户端连接redis服务redis-cli -p 6379回车后发现连接成功。如图在这里插入图片描述

  • 查看redis进程是否开启

    • ps -ef|grep redis
  • 关闭redis服务,shutdown命令表示停止服务,exit表示退出。

    • shutdown
    • exit

性能测试工具

redis-benchmark 使用命令与redis-server类似,使用redis-benchmark -h 127.0.0.1 -p 6379 ....
在这里插入图片描述
测试结果如下:
在这里插入图片描述

基础知识补充

  • redis默认有16个数据库,配置文件redis.conf 中database项=16
  • select 数据库索引 :切换数据库
  • dbsize:查看数据库存储数
  • 使用redis-cli 连接其他redis服务.\redis-cli.exe -h 192.168.0.113 -p 6379 win10默认不用当前目录命令,因此前面添加.\。
  • flushdb:清空当前库
  • flushall:清空所有库
  • redis 为什么快?
    redis是单线程的,官方表示,redis是基于内存操作,CPU不是性能瓶颈,机器的内存和网络带宽才是性能瓶颈,既然可以使用单线程来实现,就用了。为什么单线程还这么快?单线程并且基于内存,单线程没有多线程的切换开销,因此最快。并且redis内部采用多路复用技术实现, 减少IO的重复操作。

五大基本数据类型

其他命令行命令

  • exists key 判断某个key是否存在
  • expire key 设置key过期时间,如果设置10秒,则expire key 10
  • ttl key 查看key还剩多久过期,如果已经过期,则返回-2
  • move key 移除key
  • type key 判断当前key是什么类型,string还是list等等

小提示:使用redis-cli工具连接服务时,输入的命令会有提示

string

  • append key value 在字符串后面追加value,返回数字,如果key不存在,就相当于set key
  • strlen key 返回key的值的字符串长度
  • incr key 给这个key的值+1。如果这个key不存在,则相当于set key 1.如果这个key的值不是一个数字,则返回 ERR value is not an integer or out of range。value不是一个数字或超出范围,范围是多大我也不知道,应该是integer的取值范围2147483648。
  • decr key 给这个key减一
  • incrby key 10 给这个key设置每次增加10,设置步长,指定增量
  • decrby key 5 给这个key设置每次自减5.
  • getrange key 0 3 获取key对应字符串的部分,相当于java的substring,如果是getranger key 0 -1 则表示获取key的所有=GET KEY,而不是截取的部分
  • setrange key 2 xx 将字符串中下标为2的值替换为xx,例如set key1 abcde setrange key1 2 xx get key1返回abxxcd。相当于java的replace
  • setex key second value 表示设置后多少秒过期,seconds表示过期时间。ex就是expire
  • setnx key value 表示如果这个key不存在才设置,如果存在则不设置。nx就是 not exist
  • mset k1 v1 k2 v2 k3 v3 ... 表示同时设置多个键值对
  • mget k1 k2 k3 同时获取多个
  • msetnx k1 v1 k2 v2 k3 v3 k4 v4.. 如果不存在则设置,如果key有一个存在的,则所有的都设置不成功。这是一个原子性的操作,redis的事务是不保证原子性操作的,但是msetnx是保证原子性操作的。

    举例:
    当我们要在redis中保存一个用户的信息的时候,一般情况下是将user对象转为json串保存到redis中
    mset user:1 {name:zhangsan,age:10...},表示设置id为1的用户信息是一个json,同时也可以mset user:1:name zhangsan user:1:age 10 ... 这相当于将这个user的每个属性都分开设置到redis中了。

  • getset key value 先get 再set,当key不存在时,返回null 并设置这个key和value,当key存在时,返回key的值并用value覆盖之前的value

string类型的使用场景,value除了可以是字符串还可以是数字,因此可以用到以下场景:

  • 计数器:比如浏览量、粉丝数等等,当该对象被浏览了之后,可以使用incr article
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/673639
推荐阅读
相关标签