1、传统中间件
nginx,web服务器
php,转发动态请求
tomcat,既是web页面,也可以转发动态请求
springboot,自导tomcat
数据库都不支持高并发,一旦访问量激增,数据库很快就会崩溃
2、Redis简介
Redis:远程字典服务器
是开源的,c语言写的nosql数据库
Redis是基于内存运行,所有的数据不是保存在硬盘而是内存
持久化的功能——定期或者人为的把数据保存到硬盘
3、Redis的作用
减轻数据库的压力
Redis不单单是一个缓存工具,也是一个数据库
是非关系型数据库,nosql(not only sql 不仅仅是sql),键值对形式key value,数据的类型不是定义好的类型
4、Redis的优点
1、极高的读写速度,读速度可以达到110000次/s,写速度81000次/s
2、支持丰富的数据类型,键值对可以定义多种数据类型(string、list、hash、set)
3、支持数据持久化,把内存当中的数据保存到硬盘
4、原子性,Redis的所有操作都是原子性
5、支持主从模式和高可用模式(哨兵模式),以及集群
5、应用场景
Redis基于内存运行的数据库,缓存是最常应用的场景
其他应用场景:排行榜、计数器、存储关系、实时分析记录,日志系统
6、缓存
6.1概念
缓存是一种用于存储临时数据副本的技术,目的是提高访问速度和性能
缓存通常位于数据的访问路径上,数据的必经之路,可以在不直接访问原始数据的情况下,直接获取数据
6.2缓存的应用场景
web缓存、数据库缓存、对象缓存(大数据应用)
7、Redis的安装
systemctl stop firewalld
setenforce 0
#安装依赖环境
yum -y install gcc gcc-c++ make
#解压
tar -xf redis-5.0.7
cd redis-5.0.7/
#指定4个cpu进行安装
make -j 4
#指定安装路径
make PREFIX=/usr/local/redis install
cd utils
#直接运行脚本
./install_server.sh
一直回车,在"select the redis executable path"这一行输入/usr/local/redis/bin/redis-server
#软连接
ln -s /usr/local/redis/bin/* /usr/local/bin
#查看端口是否开启
netstat -antp | grep 6379
#配置主机
vim /etc/redis/6379.conf
70行添加ip bind 127.0.0.1 192.168.230.21
#开启redis
/etc/init.d/redis_6379 restart
#查看状态
/etc/init.d/redis_6379 status
#查看日志
tail -f /var/log/redis_6379.log
#进入redis
redis-cli -h 192.168.230.21 -p 6379
-h:指定ip地址
-p:指定端口
-a:密码(没有密码可以不加)
redis-cli:命令行工具
redis-server start/stop/restart:控制redis
redis-benchmark:检测redis在本机的运行效率
redis-check-aof:修复aof持久化的文件
redis-check-rdb:修复rdb持久化的文件
redis-benchmark -h 192.168.230.21 -p 6379 -c 100 -n 100000
#向redis的主机模拟发送100个并发连接,同时发送十万个请求
redis-benchmark -h 192.168.230.21 -p 6379 -q -d 100
#模拟存储100个数据包的性能测试
8、Redis基础数据类型
8.1string
字符串
是redis的基础类型,最大能够存储512MB的数据,数字、图片等都是默认string类型
#创建数据
set test1 10
#获取数据
get test1
#查看保存的键值对
keys *
#判断键值对是否存在
exists test1(存在返回1,不存在返回0)
#查看键值对值的类型
type test1
#删除键值对
del test1
#改键名
rename test1(旧名) xy102(新名)
#添加密码
config set requirepass 123456
#密码登录
auth 123456
#对键值进行追加,如果没有直接添加
append
#值自加1
incr
#值自减1
decr
#指定加值
incrby
#指定加10
incrby mykey 10
#指定减10
decrby mykey 10
#设置键名mykey,存活时间为15秒,值为hello,到期之后键从当前库删除
setex mykey 15 hello
#查看
ttl mykey
#当前库中有几个键值对
dbsize
#查看有几个库,一共16个库,第一个库从0开始,最后一个库15
config get databases
#切换库
#每个库都是独立的,彼此之间互不影响
select
#移动键值对到1库
move mykey 1
#清空当前库
flushdb
#清空所有库
flushall
#一次性创建多个键值对
mset
#一次性查看多个键值对
mget
8.2list
列表
#创建list类型
lpush
lpush mykey a b c d(顺序是d c b a)
rpush
rpush mykey a b c d(顺序是a b c d)
#查看列
lrange
#获取索引0到-1的元素,索引是从0开始的,-1是列表当中的最后一个元素
lrange mykey 0 -1
#添加列(从头插入元素)
lpushx
#移除元素,从第一个开始移除
lpop
#查看有几个元素
llen
#删除2个等于a的值(返回1表示成功,返回0表示失败)
lrem mykey 2 a
#用索引打印指定的位置
lindex
#根据索引位置进行值的替换
lset
#将索引为5的元素替换成10
lset mykey 5 10
#指定的值进行前后替换(在10的前/后插入9)
linsert mykey before 10 9
linsert mykey after 10 9
8.3hash
散列,键对集合
用来存储对象,对象类别和ID构成键名
hash存储的空间很小,占用的内存和持久化后的磁盘空间都很少
hash是一个键值对包含多个对象和对象的值,对象名不可重复
#创建hash
hset myhash id 1
#查看
hget myhash id
myhash就是一个hash值,一个hash值可以存储4294967295个键值对
#查看存储的对象
hlen myhash
#删除
hdel myhash id
#一次查看多个对象
hmget myhash id1 id2
#查看所有
hgetall myhash
#查看对象名
hkeys myhash
#查看对象对应的值
hvals myhash
#添加对象
hsetnx myhash id1 1
8.4set
集合,不重复的无序集合
元素类型只能是string,无序集合当中元素具有唯一性,不允许重复
应用场景:set的数据来追踪唯一性的数据,比如ip地址,或者根据客户的id区分不同客户购买的同一产品
#创建
sadd myset a b b c
#查看元素
smembers myset
#添加
sadd myset a d e
#获取元素的个数
scard myset
#随机获取一个元素
srandmember myset
#指定删除
srem myset a
#随机删除
spop myset
#将集合1的数据移到集合2中
smove myset myset2 a(将myset中的a移到myset2中)
8.5zet
有序集合
元素类型都是string,元素唯一不能重复
每个元素都会关联一个double类型的分数score(表示权重),通过权重的大小进行排序,权重可以相同
#创建
zadd myzet 1 "one" 2 "two" 3 "three"(1 2 3为权重)
#查看
zrange myzet 0 -1 withscores
#获取权重大于等于2,小于等于zrangebyscore myzet 2 5
#按照索引倒序排列
zrevrange myzet 1 3