随着时代的进步,互联网使用的人越来越多,像淘宝,天猫,京东,拼多多这样的大型网站每时每刻都会受到巨大的访问量,如何处理这些大量的访问,防止服务器不会宕机,这成为了当代程序员的使命之一,为了解决这些问题,我们引进了redis。
redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合] hash(hash表))
当我们做了一个项目,比方说个人博客,我们把这个项目发布到自己的服务器,一般来说,我们做的这个项目没有商用,访问量会很小,这个时候,我们不使用redis也可以,可以要访问量直接经过mysql,我们都知道,mysql是在磁盘上面,读取需要一点时间,访问量小的时候,这些时间我们可以忽略不及。
但是,当我们做了一个大型的商用项目,例如淘宝,那么访问量就会成几何数上升,特别是双十一的时候,并发量更是达到顶峰,这个时候,如果我们还是用mysql,那么大量的访问会让服务器处理速度非常的慢,甚至宕机,所以这个时候我们就要使用redis
redis是在内存上面,我们知道内存读取数据非常的快,当大量的访问量余姚访问某一个数据的时候,我们把这个数据存放在redis里面,那么这样,我们的服务器就不会宕机。
当大量的redis失效的时候,大量的访问直接打在我们的数据库上面,于是导致服务器访问变慢甚至宕机。
解决方法:
当出现一个热点数据,譬如说当年鹿晗和关晓彤谈恋爱的时候,这个就是一个热点数据,当有大量的访问同时访问一个数据,然后这个热点数据在某个时进段过期了,那么大量的请求就会打在我们的数据库上面,便会造成服务器的宕机。
解决方法:
当我们访问是需要携带参数的,比方说携带id=1这样的参数,访问后就在内存里面存下查询到的数据,但是有些人会发起一些恶意请求,比方说id=-1000,id=sadasdsa这样的,那么这些是不存在的,当这样的请求一旦多了起来,那么数据库就很有可能被打爆。
解决方案
前面给大家介绍了一下redis,那么需要怎么使用呢?那么我们先安装一下redis。
所需条件
获取安装包
进入redis官网
redis官网
我们把下载好的redis压缩包,通过xftp传送到服务器的/opt文件夹下面
通过命令,进入/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
安装完成
进入 /usr/local/bin的目录下,穿件一个属于自己的环境文件夹
重返回/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
注意:
进入redis79.conf
vim redis79.conf
将配置修改成如图样式
继续修改配置
注意,这里的配置要对应我们之前复制的三个环境,redis79便是6379,redis80便是6380,redis81便是6381
注意:
启动服务
进入/usr/local/bin/你新建的文件夹 目录
redis-server redis79.conf
进入redis
输入下面指令
redis-cli -h 你服务器的公网ip -p 6379(我是用的是6380端口)
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
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
总结
list就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消
息排行等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工
作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删
除List中某一段的元素。
Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部
添加或者删除元素,这样List即可以作为栈,也可以作为队列。
Set类型
常用命令
命令 | 说明 |
---|---|
sadd | 为集合添加元素 |
smembers | 显示集合中所有元素 无序 |
scard | 返回集合中元素的个数 |
spop | 随机返回一个元素 并将元素在集合中删除 |
smove | 从一个集合中向另一个集合移动元素 必须是同一种类型 |
srem | 从集合中删除一个元素 |
sismember | 判断一个集合中是否含有这个元素 |
srandmember | 随机返回元素 |
sdiff | 去掉第一个集合中其它集合含有的相同元素 |
sinter | 求交集 |
sunion | 求和集 |
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为
集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功
能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集
合中
内存存储模型
Zset类型
常用命令
命令 | 说明 |
---|---|
zadd | 添加一个有序集合元素 |
zcard | 返回集合的元素个数 |
zrange 升序 zrevrange 降序 | 返回一个范围内的元素 |
zrangebyscore | 按照分数查找一个范围内的元素 |
zrank | 返回排名 |
zrevrank | 倒序排名 |
zscore | 显示某一个元素的分数 |
zrem | 移除某一个元素 |
zincrby | 给某个特定元素加分 |
内存存储模型
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 hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
存储部分变更的数据,如用户信息等。