一、redis介绍
Nosql非关系型数据库key => value键值对
Redis是Remote Dictionary Server(远程数据服务)的缩写
由意大利人 antirez(Salvatore Sanfilippo)开发的一款内存高速缓存数据库该软件使用C语言编写,它的数据模型为key-value
它支持丰富的数据结构,比如""String list(双向链表) hash(哈希)set(集合) sorted set(zset有序集合)大
可持久化(保存数据到磁盘中),保证了数据安全
业务使用场景:
①[Sort set]排行榜应用,取top n操作,例如sina微博热门话题
②[List]获得最新N个数据或某个分类的最新数据
③[string]计数器应用
④[Set]Jsns(social network site)获得共同好友
⑤[Set]防攻击系统(ip判断)黑白名单等等
对比memcached
①Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。②Redis支持master-slave(主一从)模式应用。
③Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。④Redis单个value存储string的最大限制是512MB,memcached只能保存1MB的数据
⑤redis是单核,memcached是多核
由于redis只能使用单核,而memcached可以使用多核,所以在比较上,平均每一个核上redis在储存小数据时比memcached性能更高。而却100K以上数据中,memcached性能要高于redis,虽然redis最近也在储存大数据的性能上进行优化,但是比起memcached还是有点逊色。结论是无论你使用那个,每秒处理请求的次数都不会成为瓶颈。
你需要关注内存使用率。对于key-vlaue这样简单的数据储存,memcached的内存使用率更高,如果采用hash结构,redis的内存使用率会更高,当然这都依赖于具体的应用场景。
二、redis源码编译安装和客户端测试启动
官方网址: https://redis.io/
github: https://github.com/antirez/redis
源码编译安装
①上传软件到目录中
redis-4.3.0.tgz php扩展 server01和server03安装
redis-5.0.5.tar.gz redis软件 server08安装
②解压编译安装
tar xvf redis-5.0.5.tar.gz
cd redis-5.8.5
make PREFIX=/usr/local/redis install //这个配置目录
使用文件/usr/local/redis/bin
redis-cli命令行客户端
redis-server服务端
③测试启动
cd /usr/local/redis/bin
./redis-server //启动服务端
2、后台启动配置
①复制配置文件到软件目录下
②修改编辑配置文件
vim /usr/local/redis/bin/redis.conf
/daemonize 守护进程
③启动redis-server加入redis.conf参数
cd /usr/local/redis/bin
./redis ./redis-server //启动redis后台服务
3、命令行客户端简单使用
redis-cli -h
客户端帮助参数
三、数据结构类型操作
key
像“my key”和“mykey\n”这样包含空格和换行的key是不允许的。
Key不要太长。占内存,查询慢。
Key不要太短。
像u:1000:pwd:123456就不如user:1000:password:123456可读性好
2、String
string是redis最基本的类型
redis的string可以包含任何数据。包括jpg图片base64或者序列化的对象单个value值最大上限是512MB
如果只用string类型,redis就可以被看作加上持久化特性的memcached
真实业务环境中只需要获取key有没有数据,是否存在key
3、List
key value(value1,value2,value3)
list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素这使得list既可以用作栈,也可以用作队列
同一端进出 先进后出 栈 糖葫芦,先插进去的最后才能吃到
—端 另外—端出 先进先出 队列 排队,先来的先到
首部(左left)
尾部(右right)
需求:显示最后登录的几个用户
设计实现:
①登录一个用户,把用户名称或者id存储在list中
②从头部(左部)存,从头部取(左部)
用户: xiaoming
xiaohua
xiaobaitu
rpop 删掉list右边的第一个元素,返回 也就是第一个登录的用户 列
xiaobaitu xiaohua xiaoming
lpop 删掉list左边的第一个元素,并返回 也就是最后一个登录的用户 栈
xiaobaitu xiaohua xiaoming
4、set
redis的set是string类型的无序集合。集合里不允许有重复的元素
set元素最大可以包含(2的32次方-1)个元素。
关于set集合类型除了基本的添加删除操作,其他常用的操作还包含集合的取并集(union),交集(intersection),集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能。
Tip:mysql连表文氏图
https: //www.cnblogs.com/sunjie9606/p/4167190.html
需求:实现朋友圈的存储和共同好友的计算
设计:
key value
xiaomingFR xiaohong xiaoqiang xiaogang xiaohei xiaobai
xiaohongFR xiaoming xiaolv xiaolan xiaobai xiaohei
l set类型操作
添加一个string元素到key对应的set集合中,成功返回1,如集元素已经在集合中返回0,
key对应的set不存在返回错误
srem key member [ menber]
从key对应set中移除给定元素,成功返回1
smove p1 p2 menber
p1对应set中移除menber并添加到p对应set中
scard key
返回set 的元素个数
sismenber key menber
断menber是否在set 中
sinter key1 key2- --keyN
返回所有给定key的交集
sunion key1 key2 ---.kegH
返回所有给定key的并集
sdiff keg1 key2---keyN
返回所有给定key的差集
smenbers key
无序返回key对应的所有元素
5、zset
zadd key score menber
添加元素到集合,元素在集合中存在则更新对应score
zren keg menber
删除指定元素,1表示成功,如果元素不存在返回0
zincrby key incr menber
按照incr幅度(正负都可以)增加对应menber 的score值,返回score值
zrank key menber
返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的
zrevrank key nenber
同上,集合中元素是按score从大到排序
zrange key start end
类似lrange操作从集合中去指定区间的元素。返回的是有序结果
zrevrange key start end
同上返回结果是按score逆序的
zcard key
返回集合中元素个教
zscore key element
返回score
zrenrangebyrank key min max
删除集合中在给定区间的元素
6、Hash
使用redis做缓存,可以使用hash结构,压缩效率和使用效率更高,比string Hash存储数据和关系型数据库(mysql),存储的一条数据的结构极为相似Key: value (field: value)
hash类型
hset key field value
设置hash field为指定值,如果key不存在,则先创建
hget key field
获取指定的hash fieid
hmget key filed1---FieldN
获取全部指定的hash filed
hnset key filed1 value1 --
filedN valueN
同时设置hash的多个field
hincrby key field integer
将指定的hash filed加上给定值
hexists key field
测试指定fie1d是否存在
hdel key field
删除指定的hash field
hlen key
反回指定hash的field数量
hkeys key
返回hash的所有field
hvals key
返同hash的所有value
hgetall key
返回hash的所有filed和value
devops: (username:devops,phone:15313131313,email:123456@qq.com)
hash数据类型:存储和取值都是通过key,关系型数据 string存储的数据没有关系,是独立的
17301296261:(username:17301296261,phone:17301296261,email:devops@qq.com)
四、数据持久化操作
数据持久化(数据在服务或者软件重启之后不丢失)
如果数据只存在内存中,肯定会丢失,实现持久化,就需要把数据存储到磁盘中(hdd ssd)
1、snapshoting(快照)
snap提前 shoting拍照
默认snapshoting是开启的,有一个备份的频率
通过查看配置文件可以看到
set num1 1一直存储10个key才能触发snapshoting的备份频率
手动数据备份
存储完数据之后直接save
127.0.0.1:6379> save
数据恢复需要先停掉redis服务 killall redis-server shutdown redis-cli
如果需要恢复数据,只需将备份文件(dump.rdb)移动到redis安装目录并启动服务即可
server08 bin]# cp /root/dump.rdb
重新启动服务,数据就恢复了
2、append only file
aof的备份频率
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但
是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做
了很好的折中 推荐(存一个备份一个)
#appendfsync no //完全依赖os,性能最好,持久化没保证
①开启aof
开启aof后,之前的redis里的数据会丢失
appendfilename "appendonly.aof" //数据存储位置
总结:
snapshoting一般的数据持久化使用,效率高,数据迁移方便
aof适合于备份、数据实时性备份要求更高的情况
六、案例使用
1、主从模式
1、master配置
shell > vim /usr/local/redis/bin/redis.conf
开启监听,在网络中与其他服务器进行网络交互的网卡,默认eth0
bind的ip指的是其他的主机需要和这个主机通讯的ip (本机对外通讯的ip)
master:192.168.17.107
重启服务器并查看是否启动成功
./redis-cli -h 192.168.17.107
slave远程连接master
2、slave配置
vim /usr/local/redis/bin/redis.conf
yy复制光标所在行,p粘贴到光标所在行 n往下找 N往上找/查找内容
redis5.0版本之前是修改slaveof
重启服务器并查看是否启动成功
slave服务器是不允许写操作的,配置文件设置了
2、安全配置
给master配置远程连接密码
Tip:如果开启了密码限制,搭建主从需要在slave配置中填写master密码
3、PHP扩展安装
查看phpinfo,需要编写一个php文件内容如下
<?php
phpinfo();
?>
phpinfo()函数会输出关于 PHP 配置的信息。
session存储到redis
与之前session存储到memcached的方式一样,将session存储到redis中,也可以实现session的共享和实现单点登(sso)的操作。
2、Nginx+lua+redis实现访问攻击黑名单WAF
https://www.cnblogs.com/huligong1234/p/4163832.html
①安装openresty和之前安装一致
通过lua脚本在负载均衡服务器计算同一个ip的访问次数,连续访问太多次就加入黑名单