Redis入门教学

随着时代的进步,互联网使用的人越来越多,像淘宝,天猫,京东,拼多多这样的大型网站每时每刻都会受到巨大的访问量,如何处理这些大量的访问,防止服务器不会宕机,这成为了当代程序员的使命之一,为了解决这些问题,我们引进了redis。
Redis入门教学_第1张图片

什么是redis

redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合] hash(hash表))

为什么要使用redis

当我们做了一个项目,比方说个人博客,我们把这个项目发布到自己的服务器,一般来说,我们做的这个项目没有商用,访问量会很小,这个时候,我们不使用redis也可以,可以要访问量直接经过mysql,我们都知道,mysql是在磁盘上面,读取需要一点时间,访问量小的时候,这些时间我们可以忽略不及。
但是,当我们做了一个大型的商用项目,例如淘宝,那么访问量就会成几何数上升,特别是双十一的时候,并发量更是达到顶峰,这个时候,如果我们还是用mysql,那么大量的访问会让服务器处理速度非常的慢,甚至宕机,所以这个时候我们就要使用redis
redis是在内存上面,我们知道内存读取数据非常的快,当大量的访问量余姚访问某一个数据的时候,我们把这个数据存放在redis里面,那么这样,我们的服务器就不会宕机。

什么是redis雪崩

当大量的redis失效的时候,大量的访问直接打在我们的数据库上面,于是导致服务器访问变慢甚至宕机。
解决方法:

  • 设置redis永远不会过期
  • 给每个redis设置随机的过期时间

什么是redis击穿

当出现一个热点数据,譬如说当年鹿晗和关晓彤谈恋爱的时候,这个就是一个热点数据,当有大量的访问同时访问一个数据,然后这个热点数据在某个时进段过期了,那么大量的请求就会打在我们的数据库上面,便会造成服务器的宕机。
Redis入门教学_第2张图片

解决方法:

  • 当redis热点数据失效时,我们把全部的访问量锁住,只通过一个访问,让他去数据库查询,查询到数据之后,redis上便会存在所需要的数据,然后这个时候在放行全部的请求,这样全部的请求就打在redis上面,不会打到我们的数据库了。

Redis入门教学_第3张图片

什么是redis击穿

当我们访问是需要携带参数的,比方说携带id=1这样的参数,访问后就在内存里面存下查询到的数据,但是有些人会发起一些恶意请求,比方说id=-1000,id=sadasdsa这样的,那么这些是不存在的,当这样的请求一旦多了起来,那么数据库就很有可能被打爆。

解决方案

  • 有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
  • 另外也有一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

安装redis

前面给大家介绍了一下redis,那么需要怎么使用呢?那么我们先安装一下redis。

所需条件

  • 一个云服务器,阿里云,腾讯云都可以,我们这里是使用的是阿里云
  • Xshell和Xftp
  • redis安装包,没有的话下面会教你怎么下载

获取安装包
进入redis官网
redis官网

Redis入门教学_第4张图片

我们把下载好的redis压缩包,通过xftp传送到服务器的/opt文件夹下面

Redis入门教学_第5张图片

通过命令,进入/opt文件夹下面

cd /opt

在这里插入图片描述
我这里已经安装好了redis,由于我自己部署的项目使用了redis,在这里我就不删除我自己的redis了,我只会演示操作部分。

通过命令,解压redis压缩包

tar -zxvf redis-5.0.7.tar.gz(注意,这里写的是你下载的压缩包的名字)

解压完成后,会出现redis-5.0.7,进入此目录

依次输入如下命令

make
yum install gcc-c++
make install

安装完成

修改redis的配置文件

进入 /usr/local/bin的目录下,穿件一个属于自己的环境文件夹

Redis入门教学_第6张图片

重返回/redis-5.0.7的目录下,把redis.conf复制到自己新建的文件夹

cp redis.conf /usr/local/bin/znbconf

进入我们创建的文件夹,复制redis.conf文件三份

cp redis.conf redis79.conf
cp redis.conf redis80.conf
cp redis.conf redis81.conf

注意:

  • redis.conf我们不要动它,这是一个备用的配置,当配置被我们改的稀巴烂的时候,复制这份配置就可以了
  • 复制三份是要以后做主从复制,哨兵机制用的,但是现在我们先不提这两个东西
  • 我们现在使用redis79.conf配置作为redis的配置

进入redis79.conf

vim redis79.conf

将配置修改成如图样式

Redis入门教学_第7张图片
Redis入门教学_第8张图片
注意:

  • 我们将bind 127.0.0.1注释掉,是因为这个注释的意思是,只有127.0.0.1才可以访问,所以要把他注释掉
  • daemonize设置为yes,意思是可以后台运行,当我们退出了redis,redis还会继续运行,no则相反

继续修改配置

注意,这里的配置要对应我们之前复制的三个环境,redis79便是6379,redis80便是6380,redis81便是6381
Redis入门教学_第9张图片
Redis入门教学_第10张图片
Redis入门教学_第11张图片
注意:

  • 改好redis79.conf后,保存退出,然后我们在按照这个方法,去修改redis80.conf,redis81.conf
  • 三个配置环境全部改好后,进入阿里云,重启服务器,因为修改了配置需要重启服务器才可以生效

使用redis

启动服务

进入/usr/local/bin/你新建的文件夹 目录

redis-server redis79.conf

Redis入门教学_第12张图片
注意:

  • 我这里将daemonize设置为no,所以我启动redis会有这个动画,如果设置为yes,则没有这个动画
  • 我用的是redis.conf

进入redis

输入下面指令

redis-cli -h 你服务器的公网ip -p 6379(我是用的是6380端口)

Redis入门教学_第13张图片

五大数据类型

1.String: String是redis最基本的类型,你可以理解成Memcached一模一样的类型,一个key对应一个value。
String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
String类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M。
2. Hash(哈希,类似 Java里的Map):Redis hash 是一个键值对集合。
Redis hash 是一个String类型的field和value的映射表,hash特别适合用于存储对象。
类似Java里面的Map
3. List(列表):Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾
部(右边)。
它的底层实际是个链表 !
4. Set(集合):Redis的Set是String类型的无序集合,它是通过HashTable实现的 !
5. ZSet(有序集合):Redis zset 和 set 一样,也是String类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。
Redis正是通过分数来为集合中的成员进行从小到大的排序,zset的成员是唯一的,但是分数(Score)
却可以重复。

String类型基础命令

set name znb  #设置一个值
get name #获取一个值
keys * #查询全部的key
del name #删除一个值
flush db #删除全部的key
append name znb #在‘name’后面追加字符串,如果name不存在,则会新设一个name
Strlen name #查询name的长度



set code qwert 
expire code 300 #设置code有效时间为300s,多数用在验证码
ttl code #查询还有多久失效


set view 1
incr view #数值+1,大多数用在访问量,阅读量上面
decr view #数值-1
incrby view 100 #数值+100
decrby view 100 #数值-100


setnx age 20 #如果不存在就设置,设置成功返回1

内存储存模型
Redis入门教学_第14张图片

String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。
常规key-value缓存应用:
常规计数:微博数,粉丝数等。

列表List

# ===================================================
# Lpush:将一个或多个值插入到列表头部。(左)
# rpush:将一个或多个值插入到列表尾部。(右)
# lrange:返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。
# 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。
# 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此
类推。
# ===================================================

lpush list one
lpush list two
lpush list three
lrange list 0 -1#显示出list全部的数值,0是第一个,-1是最后一个
llent list #显示出list的长度
# ===================================================
# lpop 命令用于移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil 。
# rpop 移除列表的最后一个元素,返回值为移除的元素。
# ===================================================

lpop list
rpop list
# ===================================================
# Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个)
# ===================================================
Lindex list 1
Lindex list 0
Lindex list -1
# ===================================================
# lrem key 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
# ===================================================
lrem list 1 "two"
Lrange list 0 -1
# ===================================================
# Ltrim key 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区
间之内的元素都将被删除。
# ===================================================
RPUSH mylist "hello"
RPUSH mylist "hello"
RPUSH mylist "hello2"
RPUSH mylist "hello3"
ltrim mylist 1 2
lrange mylist 0 -1
# ===================================================
# rpoplpush 移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
# ===================================================
rpush mylist "hello"
rpush mylist "foo"
rpush mylist "bar"
rpoplpush mylist myotherlist
lrange mylist 0 -1
lrange myotherlist 0 -1
# ===================================================
# lset key index value 将列表 key 下标为 index 的元素的值设置为 value 。
# ===================================================
exists list # 对空列表(key 不存在)进行 LSET
lset list 0 item # 报错
lpush list "value1" # 对非空列表进行 LSET
lrange list 0 0
lset list 0 "new" # 更新值lrange list 0 0
lset list 1 "new" # index 超出范围报错
# ===================================================
# linsert key before/after pivot value 用于在列表的元素前或者后插入元素。
# 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
# ===================================================
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2

总结

  • 它是一个字符串链表,left,right 都可以插入添加
  • 如果键不存在,创建新的链表
  • 如果键已存在,新增内容
  • 如果值全移除,对应的键也就消失了
  • 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。

list就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消
息排行等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工
作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删
除List中某一段的元素。
Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部
添加或者删除元素,这样List即可以作为栈,也可以作为队列。

内存存储模型
Redis入门教学_第15张图片

Set类型

常用命令

命令 说明
sadd 为集合添加元素
smembers 显示集合中所有元素 无序
scard 返回集合中元素的个数
spop 随机返回一个元素 并将元素在集合中删除
smove 从一个集合中向另一个集合移动元素 必须是同一种类型
srem 从集合中删除一个元素
sismember 判断一个集合中是否含有这个元素
srandmember 随机返回元素
sdiff 去掉第一个集合中其它集合含有的相同元素
sinter 求交集
sunion 求和集

在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为
集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功
能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集
合中

内存存储模型

Redis入门教学_第16张图片

Zset类型

常用命令

命令 说明
zadd 添加一个有序集合元素
zcard 返回集合的元素个数
zrange 升序 zrevrange 降序 返回一个范围内的元素
zrangebyscore 按照分数查找一个范围内的元素
zrank 返回排名
zrevrank 倒序排名
zscore 显示某一个元素的分数
zrem 移除某一个元素
zincrby 给某个特定元素加分

内存存储模型

Redis入门教学_第17张图片

hash类型

常用命令

命令 说明
hset 设置一个key/value对
hget 获得一个key对应的value
hgetall 获得所有的key/value对
hdel 删除某一个key/value对
hexists 判断一个key是否存在
hkeys 获得所有的key
hvals 获得所有的value
hmset 设置多个key/value
hmget 获得多个key的value
hsetnx 设置一个不存在的key的值
hincrby 为value进行加法运算
hincrbyfloat 为value加入浮点值

和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如
一个存储全班同学成绩的sorted set,其集合value可以是同学的学号,而score就可以是其考试得分,
这样在数据插入集合的时候,就已经进行了天然的排序。可以用sorted set来做带权重的队列,比如普
通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让
重要的任务优先执行。
排行榜应用,取TOP N操作 !

内存存储模型

Redis入门教学_第18张图片
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
存储部分变更的数据,如用户信息等。

你可能感兴趣的:(中间件,redis,java,负载均衡)