内存缓存数据库 nosql之redis
一、介绍及其安装
1、介绍
nosql 非关系数库
memcache redis 内存缓存数据库
mongodb 比较接近mysql的一种数据 可以完整的实现大部分业务需求
Redis是Remote Dictionary Server(远程数据服务)的缩写
由意大利人 antirez(Salvatore Sanfilippo) 开发的一款 内存高速缓存数据库
该软件使用C语言编写,它的数据模型为 key-value
它支持丰富的数据结构,比如 String(字符串) list(双向链表) hash(哈希) set(集合) sorted set(有序集合)。可持久化(数据会定时存储到硬盘),保证了数据安全。
2、什么场合使用
①[Sort Set]排行榜应用,取top n操作,例如sina微博热门话题
②[List]获得最新N个数据 或 某个分类的最新数据
③计数器应用
④[Set]sns(social network site)获得共同好友
⑤[Set]防攻击系统(ip判断、黑白名单)等
3、对比memecache
①Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
②Redis支持master-slave(主—从)模式应用。
③Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
④Redis单个value的最大限制是1GB, memcached只能保存1MB的数据
4、redis安装
官方网址:https://redis.io/
源码地址:https://github.com/antirez/redis
linux编译安装redis
①上传并查看压缩包文件
②解压压缩包,安装redis软件
shell > tar zxvf redis-4.0.1.tar.gz
shell > cd redis-4.0.1
shell > make PREFIX=/usr/local/redis install
③查看软件的安装目录
④启动redis服务器
默认启动redis-server只能前台启动,使用上很不方便
可以设置配置文件,进行后台启动,启动时指定配置文件地址
复制配置文件到软件运行目录
修改配置文件
shell > vim +136 /usr/local/redis/bin/redis.conf
指定配置文件地址。重新启动redis
5、命令行客户端使用
redis本身命令行客户端
服务器状态查看
二、操作使用
1、Key
key的命名规则不同于一般语言,键盘上除了空格、\n换行外其他的大部分字符都可以使用。像“my key”和“mykey\n”这样包含空格和换行的key是不允许的。
我们在使用的时候可以自己定义一个Key的格式。
例如 object-type?field
Key不要太长。占内存,查询慢。
Key不要太短。像u:1000:pwd 就不如 user:1000:password 可读性好
在redis默认有16库可以使用,不同的业务使用不同的库,或者不同的数据value格式,使用存储到不同库。
查看配置文件信息
2、String
string是redis最基本的类型
redis的string可以包含任何数据。包括jpg图片或者序列化的对象。
单个value值最大上限是1G字节。
如果只用string类型,redis就可以被看作加上持久化特性的memcache
3、List
list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。
这使得list既可以用作栈,也可以用作队列。
栈 先进后出 一端进 同一端出
队列 先进先出 一端进 另外一端出
需求:存储当前比较流行的编程语言
设计:key LA
value: c c++ c# java php html css javascript python ruby go nodejs
4、Set
redis的set是string类型的无序集合。不允许有重复元素
set元素最大可以包含(2的32次方-1)个元素。
关于set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能。
需求:存储朋友圈信息,并计算出共同好友
设计:
xiaomingFR xiaowang xiaoli xiaohei xiaobai xiaolv
xiaohongFR xiaohei xiaolan xiaohua xiaoben xiaotuzi
5、Zset
和set一样sorted set也是string类型元素的集合,
不同的是每个元素都会关联一个权(score)。
通过权值可以有序的获取集合中的元素
score权是数字
需求:存储一个手机应用排行榜
设计:
key AppTop
value
score值 1-9
id | score | name |
---|---|---|
1 | 6 | |
2 | 8 | |
3 | 4 | taobao |
4 | 2 | jd |
5 | 5 | king |
分析:score从大到小排序 第一名 wechat
score从小到大 jd
king 想要在score从大到小排名中 排第一 把它score加4
6、Hash
hash数据类型存储的数据与mysql数据库中存储的一条记录极为相似。
key:value(feild:value)
需求:存储两个人的信息
id name age job
1 tom 4 php
2 jerry 2 java
三、优化操作(了解)
redis提供了两种数据化持久技术:
①snappshoting 快照
②aof 文件追加写方式
1、snappshoting
快照技术会自动进行定时的数据写入到磁盘中
快照技术备份频率,查看配置文件
测试备份操作
①查看当前备份文件的修改时间
②添加测试key数据
③查看备份后的文件
2、append only file
redis提供了备份频率更快的方式,aof 文件追加写的形式。默认不开启。
手动开启后,原来的数据就丢失了。
①开启aof,修改配置文件
②重启redis
③查看备份效果
四、php操作redis
1、安装拓展
安装拓展步骤:1>获取拓展 2>php.ini开启拓展 3>重启服务查看phpinfo
1)windows下安装
①选择对应拓展文件
php版本号 运行方式(ts nts) 运行平台(vc6,vc9,vc11,vc14,vc15) 软件位数(x86)
②解压文件放入ext拓展目录
③在php.ini里开启拓展,并重启服务,查看phpinfo
2)linux下安装
①编译生成.so拓展文件
shell > tar zxvf redis-3.1.4RC1.tgz
shell > cd redis-3.1.4RC1
进入目录之后,没有发现configure,需要使用phpize生成configure
shell > /usr/local/php/bin/phpize
shell > ./configure --with-php-config=/usr/local/php/bin/php-config && make && make install
②开启php.ini的拓展项,启动服务
shell > /usr/local/http2/bin/apachectl start
2、代码操作
默认redis是不允许远程登录的。如果有需求使用远程登录,可以设置一个简单密码。
①开启linux防火墙端口
重启防火墙
②redis配置文件修改远程登录和密码
注意修改配置之后,重启redis服务
可以设置一个密码提高连接安全性
③在window下写代码连接linux的redis服务器
https://github.com/phpredis/phpredis
3、消息队列操作
消息队列(mq) 一些列的操作,把它保存到一个容器中,这个结构的特点,是一个一个进行排队操作。
①添加任务消息到队列中
②消费(消耗)队列中的消息 (执行任务操作)
redis实现消息队列的结构:list 一端进,另外一端出 同步阻塞 原子性(一个一个操作)
需求:实现秒杀抢购
分析:总共有20件商品,一件一件被抢到,需要进行排队操作。
①把商品件数添加到list中
②消耗队列中的商品
③限制同一ip只能抢购一次
先判断用户的ip,如果此时抢购成功,那么不允许再抢购(不允许再出队列操作)
使用set集合结构,记录已经抢购成功的用户ip
五、redis主从
主从最起码两台服务器 从服务器同步主服务器数据
搭建主从,建议使用同配置、同版本的服务器及其软件
注意点:
①主服务器要允许从服务登录使用 bind 0.0.0.0 防火墙的问题
主服务器 linux
从服务器 windows
操作步骤:
①安装window下的redis服务器
使用管理cmd命令行
使用windows服务的方式启动,先安装windows服务
redis-server --service-install redis.conf //安装
redis-server --service-uninstall //卸载
查看服务并启动
②注意修改linux主服务器bind配置
④使用一台linux的redis从服务器
修改从服务器的配置文件
启动从服务器的redis
⑤操作查看效果