redis入门基础《详细总结》

Redis学习

  • Redis初识
  • 1、什么是redis
  • 2、redis与mysql
      • 2.1、为什么有了mysql还需要redis?
    • 2.2、有了redis还需要mysql吗?
  • 3、linux安装redis
    • 3.1、redis3种启动方式,及正常关闭
  • 4、正常关闭redis
  • 5、客户端链接
  • 6、Linux中使用redis的常用命令
  • 7、redis的5种数据类型
    • 7.1、String数据类型
    • 7.2、hash类型
    • 7.3、list类型
    • 7.4、set类型
    • 7.5、zset类型
    • 7.6、通用命令

Redis初识

本篇博客目的:
学习了解redis是什么?能干什么?怎么在linux上安装并使用,作出对常用的数据类型的讲解和应用场景的描述。

相信大多数企业和公司都会用到redis数据库,当然我们主要是用它来做缓存比较多下面附图一张,说明一下它在项目中的位置,然后本篇博客系统的学习 一下redis这个组件。

redis入门基础《详细总结》_第1张图片

1、什么是redis

简单官方的概述一下:
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、nosql数据库。

  • 1.redis是c语言编写
  • 2.redis可以基于内存,也可以持久化
  • 3.nosql(not only a sql),非关系性数据库
    个人的话来说:
    redis它是一个非关系型数据库,是客户端服务端模式的一个组件,我们用来作为项目的缓存中间件来使用,我们开启服务端,然后用客户端来连接服务端就可以使用来做增删改查了。

2、redis与mysql

2.1、为什么有了mysql还需要redis?

要想知道这个也不难,但是具体什么原因呢?我们可以通过简单的看一下mysql的整个执行流程来看看(如下图所示)
redis入门基础《详细总结》_第2张图片
这里简单说一下mysql的执行流程:

  • 1.有sql语句请求查询的时候,首先到查询缓存cache中查找,如果有立刻返回,这是速度最快查询,因为查询缓存在内存中,不了解的可以看下图
    redis入门基础《详细总结》_第3张图片

  • 2.如果缓存没有,进入查询解析器,生成解析树(了解即可)

  • 3.查询优化器(mysql对一些sql语句进行优化)

  • 4.生成执行计划(explain)

  • 5.进入存储引擎,索引是存储引擎决定的,如果索引能返回数据就不需要去表里面查询了。

  • 6.没有找到,进入表中全表扫描
    <这里对mysql不作过多概述>
    结论:通过mysql的执行流程可以看出,如果在内存中存在数据返回,是效率最高、速度最快的。因为mysql的核心是注重于数据的持久安全,因此能够基于内存的数据库(nosql)应运而生,我们学习其中最流行的redis。

2.2、有了redis还需要mysql吗?

  • 在之前介绍redis时候,redis既能基于内存,也能持久化到磁盘,但是主打内存效率的redis,持久化功能远远比不上mysql。而大量数据都放入内存,需要很高的硬件支持,不太现实。
  • Mysql有完善的事务机制,能满足项目需求,redis虽然也有事务,但是很多场景无法满足。
  • Redis虽然有5种数据结构,但是过于复杂的数据关系,还是无法清晰表现,mysql通过行和列、表与表的关系,让数据与数据直接之间的关系一目了然。
    所以在使用中都是redis+mysql。redis主管数据缓存到内存,用于提高查询效率,mysql主管数据存储到磁盘,用于保存重要不能丢失的数据

3、linux安装redis

这里由于我没有Linux服务器所以只是使用虚拟机环境下安装的,有条件建议还是自己买服务器比较好。
环境:VirtualBox+centos7
linux安装常用命令:给出常用linux命令各取所需
(https://blog.csdn.net/qq_36485859/article/details/93968478)

这里没有给出具体的安装虚拟机和linux的步骤,可以自行百度。
下面展示一些 安装命令方式有多种这里只说一种。


准备
cd /usr/local           #进入任意目录
yum install wget –y  #安装下载工具
wget http://download.redis.io/redis-stable.tar.gz 
tar xzvf redis-4.0.8.tar.gz  #解压文件
开始安装
cd redis-stable
make
cd src
make install PREFIX=/usr/local/redis
移动配置文件到安装目录下
cd ../
mkdir /usr/local/redis/etc
mv redis.conf /usr/local/redis/etc
配置redis为后台启动
vi /usr/local/redis/etc/redis.conf //将daemonize no 改成daemonize yes
在根目录启动redis
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 
安装关闭防火墙:
yum install firewalld
systemctl stop firewalld.service

3.1、redis3种启动方式,及正常关闭

第一种启动方式

就是进入redis解压的src目录下的./redis-server,这个需要一直保持启动,当其他操作的时候,ctrl+c退出,redis也退出了。不太方便

第二种后台启动
Ctrl+c退出刚才的启动程序
返回上级目录:cd …/
在这里插入图片描述
redis入门基础《详细总结》_第4张图片
vim redis.conf
redis入门基础《详细总结》_第5张图片
cd src
通过配置文件启动redis: ./redis-server …/redis.conf
查看进程已经启动
cd src
通过配置文件启动redis: ./redis-server …/redis.conf
查看进程已经启动
redis入门基础《详细总结》_第6张图片
第三种将redis加入到开机启动

vim /etc/rc.local //在里面添加内容:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf (意思就是开机调用这段开启redis的命令)

4、正常关闭redis

在这里插入图片描述

5、客户端链接

在src目录下执行:
在这里插入图片描述
-h是ip地址 -p是端口号,这儿是默认本机加6379可以省略
./redis-cli

6、Linux中使用redis的常用命令

redis-server /usr/local/redis/etc/redis.conf //启动redis
pkill redis  //停止redis
#卸载redis:
rm -rf /usr/local/redis //删除安装目录
rm -rf /usr/bin/redis-* //删除所有redis相关命令脚本
m -rf /root/download/redis-4.0.4 //删除redis解压文件夹

7、redis的5种数据类型

7.1、String数据类型

String类型,类似于java的Map
Key—value都是字符串类型。

常用命令:
设置值:set key value
获取值:get key
redis入门基础《详细总结》_第7张图片
删除key:del key
批量插入:mset key1 value1 key2 value2
批量获取:mget key1 key2
Value自增:incr key (相当于i++)
自减:decr key
指定增加多少:incrby key 10 (增加10)
指定减少多少:decrby key 10

redis入门基础《详细总结》_第8张图片
获取原来的值并设置新值:getset key newValue
redis入门基础《详细总结》_第9张图片
获取value的长度:strlen key
如果key值存在则在key对应的value后面追加字符,不存在则创建:append key value
获得部分value值: getrange key start end (左右包含,算下标)

setnx key value:如果key存在就不设置值,返回0,如果不存在key就设置值
redis入门基础《详细总结》_第10张图片
expire key:为key设置过期时间
ttl:查看key过期时间
redis入门基础《详细总结》_第11张图片
在这里插入图片描述
注意:这儿创建一个key 然后给key设置过期时间,是两步,不是原子操作。

setex key seconds value:原子操作创建key并设置过期时间
在这里插入图片描述
附图一张(下面xmind总结来源于网络,个人只是借鉴学习):
ximind百度云地址:
链接:https://pan.baidu.com/s/1C30PTuW7_ITQfQLBEUkQrw
提取码:px86
redis入门基础《详细总结》_第12张图片

7.2、hash类型

Redis hash 是一个string类型的field和value的映射表,类似于java中的map或者bean对象。为了更好的理解该数据结构,先使用基本命令在redis中插入一条数据
打开虚拟机,启动redis,进入客户端,插入一条数据
在这里插入图片描述
Hset为hash的设置命令,该数据类似于java中的map:
在这里插入图片描述
或者是Student对象,有name与age属性
redis入门基础《详细总结》_第13张图片

常用命令:
hset key field value: 可以设置多个
hget key field:获得值,首先指定key,然后指定获得该key的那个属性
redis入门基础《详细总结》_第14张图片
hmget key field1 field2…… :获得多个属性的值
在这里插入图片描述
hgetall key:获得key的所有属性与值
redis入门基础《详细总结》_第15张图片
hlen key:获得key中属性的个数
hdel key field:删除key中某个属性,可以删除多个
redis入门基础《详细总结》_第16张图片
hmset key filed value [field value…]:设置多个属性,与hset类似
两者返回值不同:
Hset: 如果field是哈希表中的一个新建域,并且值设置成功,返回1。如果哈希表中域field已经存在且旧值已被新值覆盖,返回0。
Hmset:命令执行成功,返回OK。当key不是哈希表(hash)类型时,返回一个错误
hsetnx key field value --原key的field不存在则set成功,返回1,否则失败,返回0
redis入门基础《详细总结》_第17张图片
hkeys key:获得所有的key
在这里插入图片描述
hvals key:获得所有的value
hexists key field:判断key中是否存在某个field

redis入门基础《详细总结》_第18张图片
hincrby key field step:为key中的field值基础上增加step
redis入门基础《详细总结》_第19张图片
hincrbyfloat key field step:类似上面 小数

hstrlen key field:
在这里插入图片描述
没有API为hash中某个属性设置过期时间,那么我们可以在java层面,在某个属性的value上做文章,将value的值设置为一个map,用一个key-value表示值,一个key-value表示过期时间

可以为整个hash设置过期时间:
redis入门基础《详细总结》_第20张图片
redis入门基础《详细总结》_第21张图片
在这里插入图片描述

7.3、list类型

在redis中,list数据结构是按照插入顺序的字符串链表,和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库删除,list中可以包含最大元素数是4294967295.

在reids中list数据结构就是java的链表结构,应该很好理解。

常用命令:

lpush key value [value…]:l是left的缩写 表示从链表左边(链表头)放入数据
lrange key start end:查看start—end中的数据,左包右包 end -1表示到最后
redis入门基础《详细总结》_第22张图片
rpush key value [value…]:右边插入数据 r是right的缩写
redis入门基础《详细总结》_第23张图片
lpop key:弹出左边第一个元素
redis入门基础《详细总结》_第24张图片
rpop key:弹出右边第一个元素
llen key:查看链表的总长度
在这里插入图片描述
blpop key [key…] timeout–左侧阻塞式弹出

BLPOP 是阻塞式列表的弹出原语。 它是命令 LPOP 的阻塞版本,这是因为当给定列表内没有任何元素可供弹出的时候, 连接将被 BLPOP 命令阻塞。 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
Timeout 是超时时间
掌握下图的几种情况就可以了
redis入门基础《详细总结》_第25张图片
redis入门基础《详细总结》_第26张图片
在这里插入图片描述
在这里插入图片描述
redis入门基础《详细总结》_第27张图片
brpop key [key…] timeout --右侧阻塞式弹出 类似上面

lpushx: 和lpush类似,但是lpushx会校验key是否存在,若key不存在则不进行任何操作
redis入门基础《详细总结》_第28张图片
rpushx与上面类似

rpoplpush list1 list2:弹出list1的右边的元素 放入list2左边(医院体检业务,排队做了一项,继续排队做第二项)
redis入门基础《详细总结》_第29张图片
brpoplpush :阻塞版本

lindex key index:获取key中index位置的值,负数就反过来数,-1为最后一个
在这里插入图片描述
lrem key count value:
count>0从左边删除count个value
count<0从右边删除count个value
count=0删除所有的value
redis入门基础《详细总结》_第30张图片
应用场景
排队业务、商城商品浏览记录、评论里面的最新评论、qq空间的我的访客、消息队列等
redis入门基础《详细总结》_第31张图片

7.4、set类型

Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

常用命令
sadd key element [element…]:set集合中添加元素
smembers key:查看集合所有的元素
redis入门基础《详细总结》_第32张图片
sismember key element --查看元素是否属于该集合
在这里插入图片描述
srem key element [element…] –删除集合元素
在这里插入图片描述
scard key --查看集合元素数量
在这里插入图片描述
srandmember key --随机获取集合中某一个元素

redis入门基础《详细总结》_第33张图片
redis入门基础《详细总结》_第34张图片
spop key –弹出一个元素
在这里插入图片描述
sinter key1 key2 …… — 多个集合的交集

redis入门基础《详细总结》_第35张图片
sdiff key1 key2…… — 返回第一个集合有 后面集合都没有的元素(差集)
sunion key1 key2 key3…. ----所有集合的并集

sinterstore set set1 set2 —找到set1与set2的交集 存放在set中
在这里插入图片描述

应用场景
QQ共同好友推荐(交集)、抽奖系统、网站登录人数(去掉重复登录的)、匹配度计算等等
redis入门基础《详细总结》_第36张图片

7.5、zset类型

zset在set集合的基础上给每一个元素一个分数描述,从而使元素变得有序可循,默认按分数升序排序。
zadd key score member1 score member2… — 添加元素 每个元素都会携带一个分数
zrange key start end [withscores] —根据下标查看元素 默认分数升序排序
redis入门基础《详细总结》_第37张图片

zrevrange key start end [withscores] —类似上面,反取

zrangebyscore key score1 socre2 ----取score1到score2分数 之间的元素

redis入门基础《详细总结》_第38张图片

redis入门基础《详细总结》_第39张图片
zrevrangebyscore key max min [withscores] ----反取
zrem key member ----删除元素
zcard key ----个数
zscore key member —查看某个元素的分数
zrank key member ----查看某个元素在集合中的排名,默认按分数升序(排名从0开始的)
zrevrank key member ---- 反排名
zincrby key increment member --为某个元素加分
在这里插入图片描述
zcount key min max —统计min到max分数间的个数
在这里插入图片描述
zremrangebyscore key min max —根据分数段删除
zremrangebyrank key start end — 根据排名删除

了解:
zinterstore destination numkeys key [key…] --这里numkeys表示需要做交集的key的个数
zunionstore destination numkeys key [key…] --这里numkeys代表需要做并集的key的个数

应用场景
王者里面的经济排行、微博热搜的点击率、主播刷礼物排行、商城商品热度等等

redis入门基础《详细总结》_第40张图片

7.6、通用命令

redis入门基础《详细总结》_第41张图片
以上是对redis基础的一个简单介绍,欢迎学习指正。。。。

你可能感兴趣的:(redis,linux,redis面试)