redis入门基础《详细总结》

Redis初识

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

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

其中缓存系统就是采用redis来完成的

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的整个执行流程来看看(如下图所示)
在这里插入图片描述
这里简单说一下mysql的执行流程:

  • 1.有sql语句请求查询的时候,首先到查询缓存cache中查找,如果有立刻返回,这是速度最快查询,因为查询缓存在内存中,不了解的可以看下图
    在这里插入图片描述

  • 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 (1)

这里由于我没有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

linux安装redis (2)

1、解压文件件
tar -zxvf  redis.*.tar.gz
2、进入到解压后的文件夹 修改为后台启动方式
vim redis.cof      
将daemonize no 改成daemonize yes
3、安装redis 所需依赖
yum install gcc-c++
然后执行 make 即可 待完成后执行  make install
4、最好备份一下配置文件,然后将该文件移动到自己方便查看的目录 
5、cd /usr/local /bin/ 
6、启动redis :
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 
7、进入客户端
redis-cli 
输入ping   返回PONG则安装成功

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

第一种启动方式

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

第二种后台启动
Ctrl+c退出刚才的启动程序
返回上级目录:cd …/
在这里插入图片描述
在这里插入图片描述
vim redis.conf
在这里插入图片描述
cd src
通过配置文件启动redis: ./redis-server …/redis.conf
查看进程已经启动
cd src
通过配置文件启动redis: ./redis-server …/redis.conf
查看进程已经启动
在这里插入图片描述
第三种将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的常用命令及基础知识

Dbsize查看当前数据库的key的数量
Flushdb:清空当前库
Flushall;通杀全部库
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解压文件夹



redis的自带压力测试工具

redis做压测可以用自带的redis-benchmark工具
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000
在这里插入图片描述

压测需要一段时间,因为它需要依次压测多个命令的结果,如:get、set、incr、lpush等等,所以我们需要耐心等待,如果只需要压测某个命令,如:get,那么可以在以上的命令后加一个参数-t(红色部分):

1、redis-benchmark -h 127.0.0.1 -p 6086 -c 50 -n 10000 -t get

C:\Program Files\Redis>redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000 -t get

====== GET ======
10000 requests completed in 0.16 seconds
50 parallel clients
3 bytes payload
keep alive: 1

99.53% <= 1 milliseconds
100.00% <= 1 milliseconds
62893.08 requests per second

2、redis-benchmark -h 127.0.0.1 -p 6086 -c 50 -n 10000 -t set

C:\Program Files\Redis>redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000 -t set

====== SET ======
10000 requests completed in 0.18 seconds
50 parallel clients
3 bytes payload
keep alive: 1

87.76% <= 1 milliseconds
99.47% <= 2 milliseconds
99.51% <= 7 milliseconds
99.74% <= 8 milliseconds
100.00% <= 8 milliseconds
56179.77 requests per second

这样看起来数据很多,如果我们只想看最终的结果,可以带上参数-q,完整的命令如下:

3、redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000 -q

C:\Program Files\Redis>redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000 -q
PING_INLINE: 63291.14 requests per second
PING_BULK: 62500.00 requests per second
SET: 49261.09 requests per second
GET: 47619.05 requests per second
INCR: 42194.09 requests per second
LPUSH: 61349.69 requests per second
RPUSH: 56818.18 requests per second
LPOP: 47619.05 requests per second
RPOP: 45045.04 requests per second
SADD: 46296.30 requests per second
SPOP: 59523.81 requests per second
LPUSH (needed to benchmark LRANGE): 56818.18 requests per second
LRANGE_100 (first 100 elements): 32362.46 requests per second
LRANGE_300 (first 300 elements): 13315.58 requests per second
LRANGE_500 (first 450 elements): 10438.41 requests per second
LRANGE_600 (first 600 elements): 8591.07 requests per second
MSET (10 keys): 55248.62 requests per second

7、redis的5种数据类型

7.1、String数据类型

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

常用命令:
设置值:set key value
获取值:get key
在这里插入图片描述
删除key:del key
批量插入:mset key1 value1 key2 value2
批量获取:mget key1 key2
Value自增:incr key (相当于i++)
自减:decr key
指定增加多少:incrby key 10 (增加10)
指定减少多少:decrby key 10

在这里插入图片描述
获取原来的值并设置新值:getset key newValue
在这里插入图片描述
获取value的长度:strlen key
如果key值存在则在key对应的value后面追加字符,不存在则创建:append key value
获得部分value值: getrange key start end (左右包含,算下标)

setnx key value:如果key存在就不设置值,返回0,如果不存在key就设置值
在这里插入图片描述
expire key:为key设置过期时间
ttl:查看key过期时间
在这里插入图片描述
在这里插入图片描述
注意:这儿创建一个key 然后给key设置过期时间,是两步,不是原子操作。

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

7.2、hash类型

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

常用命令:
hset key field value: 可以设置多个
hget key field:获得值,首先指定key,然后指定获得该key的那个属性
在这里插入图片描述
hmget key field1 field2…… :获得多个属性的值
在这里插入图片描述
hgetall key:获得key的所有属性与值
在这里插入图片描述
hlen key:获得key中属性的个数
hdel key field:删除key中某个属性,可以删除多个
在这里插入图片描述
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
在这里插入图片描述
hkeys key:获得所有的key
在这里插入图片描述
hvals key:获得所有的value
hexists key field:判断key中是否存在某个field

在这里插入图片描述
hincrby key field step:为key中的field值基础上增加step
在这里插入图片描述
hincrbyfloat key field step:类似上面 小数

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

可以为整个hash设置过期时间:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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表示到最后
在这里插入图片描述
rpush key value [value…]:右边插入数据 r是right的缩写
在这里插入图片描述
lpop key:弹出左边第一个元素
在这里插入图片描述
rpop key:弹出右边第一个元素
llen key:查看链表的总长度
在这里插入图片描述
blpop key [key…] timeout–左侧阻塞式弹出

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

lpushx: 和lpush类似,但是lpushx会校验key是否存在,若key不存在则不进行任何操作
在这里插入图片描述
rpushx与上面类似

rpoplpush list1 list2:弹出list1的右边的元素 放入list2左边(医院体检业务,排队做了一项,继续排队做第二项)
在这里插入图片描述
brpoplpush :阻塞版本

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

7.4、set类型

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

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

在这里插入图片描述
在这里插入图片描述
spop key –弹出一个元素
在这里插入图片描述
sinter key1 key2 …… — 多个集合的交集

在这里插入图片描述
sdiff key1 key2…… — 返回第一个集合有 后面集合都没有的元素(差集)
sunion key1 key2 key3…. ----所有集合的并集

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

应用场景
QQ共同好友推荐(交集)、抽奖系统、网站登录人数(去掉重复登录的)、匹配度计算等等
在这里插入图片描述

7.5、zset类型

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

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

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

在这里插入图片描述

在这里插入图片描述
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的个数

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

在这里插入图片描述

7.6、通用命令

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020071214445543.png

为什么redis 这么快?

首先我们要明确一个问题reidis它是一个单线程的工作模型。至于它为什么这么快我们分析一哈他的内部机制。‘
为毛这么快呢:

  1. 因为他是纯内存的操作
  2. 他是单线程的操作,看可以避免频繁的上下文切换。(单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。单线程较多线程来说,系统稳定、扩展性极强、软件丰富。多用于点对点的服务。
  3. 采用了非阻塞I/O多路复用机制

解释一哈非阻塞I/O多路复用机制:
先给个链接(https://blog.csdn.net/hcmony/article/details/80694560)
就是当前线程收到socklet请求后去内存中查 ,每次轮询的过程中都返回信息 这样就不会导致线程阻塞。

我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。
单进程模型来处理客户端的请求。对读写等事件的响应
是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主进程的执行效率
Epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,
它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

redis默认有16个库

设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
databases 16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值