缓存中间件分布式redis

文章介绍了Redis这款内存高速缓存数据库,强调其作为NoSQL数据库支持丰富的数据结构,如String、List、Set、SortedSet和Hash,并对比了Redis与Memcached的区别。还详细讲述了Redis的数据持久化方法,包括快照和AOF日志。此外,文中提到了Redis的主从复制配置和在PHP中的使用,以及结合Nginx+Lua实现访问攻击防护的场景。
摘要由CSDN通过智能技术生成

一、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

  1. 源码编译安装

①上传软件到目录中

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

客户端帮助参数

三、数据结构类型操作

  1. 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 配置的信息。

  1. session存储到redis

与之前session存储到memcached的方式一样,将session存储到redis中,也可以实现session的共享和实现单点登(sso)的操作。

2、Nginx+lua+redis实现访问攻击黑名单WAF

https://www.cnblogs.com/huligong1234/p/4163832.html

①安装openresty和之前安装一致

通过lua脚本在负载均衡服务器计算同一个ip的访问次数,连续访问太多次就加入黑名单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值