nosql及redis介绍
nosql介绍
nosql:
非关系型数据库、key-value存储形式、不支持sql、没有表结构、读写性能高等...
优点:高并发读写强、大数据量扩展、配置简单、成本低
缺点:无统一标准、没有官方支持
常见nosql:redis、MongoDB、tair、simpleDB...
redis介绍
redis介绍:
远程数据服务、c编写、key-val数据模型、支持多种数据类型string、hash、list、set、zset、效率高存储内存、读写性能高...优势:
高性能缓存、多类型数据结构、redis分布式、高并发海量数据处理、数据持久化存储硬盘。
与memcache比较数据类型(str、list、set、hash、zset、set)、持久化(文件)、海量数据(1GB)
redis和memcache区别:持久化存储、五种数据类型(字符串、列表、集合、哈希、有序集合)、集群(主从集合)、6379 & 11211
优势:单进程单线程、性能高、数据丰富、原子性(成功执行完全不执行)、事务(multi、exec)、api支持面向对象
redis-server:服务端、redis-cli:客户端安装:
下载、解压、进入目录、编译、安装、复制配置文件
daemonize=yse (后台运行)启动:
服务端:./redis-server ./redis.conf
客户端:./redis-cli -h ip -p port (第三方图形化连接工具RDM、ip + port配置)
检测:netstat -tunpl | grep 6379关闭:
客户端:
./redis-cli shutdown、
服务端:
pkill redis-server
killall redis-server
pkill -9 redis
配置文件(*.conf):
端口(port)
守护进程(daemonize yes)
允许任意ip访问(bind 0.0.0.0)
ip限制:bind 多个ip逗号分割
密码:requirepass 密码 (命令:auth 密码)
终端命令&数据类型:
数据类型
数据类型:
字符串、列表、集合、有序集合、哈希值
string:字符串,基本类型(可存储任何类型、序列化对象、数组)1GB、持久化
常见命令
select 数据库编号 :默认有0-15号数据库,默认是0号数据库
dbsize :返回当前数据库里面键的个数
flushdb :清空当前数据库里面所有的键
flushall :清空所有数据库里面的所有的键
key * :返回当前数据库里面的键
exists 键名.. : 判断一个键是否存在。
del 键名称 :删除指定的键
expire key 有效期(秒数) :设置键的有效期
ttl 键名 :返回一个键剩余的过期时间.
type key :返回数据类型
字符串string
string:字符串,基本类型(可存储任何类型、序列化对象、数组)1GB、持久化
set key val ex nx :设置键 值 生存时间 不存在设置
hmset key value [key value..] :设置多个键值
setex key seconds value :设置为字符串类型,并指定生存时间
setnx key value :存在设置失败、不存在设置成功。
get key :获取键值
hmget key [key..]: :查询所有key的值 nli
strlen key :返回key字符串长度
getset key value :获取旧值设置新值
incr key :加加操作
incrby key val :加指定值
incr、decr key step :自增、自减(key不存在直接创建 步长允许负数)
append key val :追加
哈希hash
hash:hash类型可以看成是具有key和value的容器(对象信息)
hset 键名称 field value :设置键值
hget 键名称 指定的field :获取键值
hmset 键名称 field1 value1 … :设置多个键值
hmget 键名称 field1 field2……. :获取多个键值
hgetall 键名称 :获取全部、获取指定哈希中所有的field和value
hlen key :返回key元素数量
hexists key field :判断key有没有filed字段
hincrby/hdecrby key field step :自增自减
hkeys key :返回所有key的filed
hvals key :返回所有key的value
链表list
list:链表,字符串的双向链表,按照插入顺序排序。(队列,特点:数据 先进先出)
lpush 键名称 元素 :头部(左边)添加一个或多个元素
rpush 键名称 元素 :尾部(右边)添加元素
lpop 链表名称 :删除并返回头部的元素
rpop :删除并返回尾部的元素
llen 链表名称 :返回列表的长度
lragne 键名称 start end(-1) :获取链表里面的元素
rpoplpush : 移除第一个添加第二个
linsert kye before|after 链表元素 新元素 :元素插入到链表中某个元素之前或之后
lset 链表名称 下标 新值 :修改链表中指定下标的元素
lindex 链表名 下标 :返回链表中指定下标的元素
lrem key count value :删除链表中的元素
ltrim 链表的名称 开始下标 结束下标 :保留指定范围的元素
集合set
set:集合,set是string类型的无序集合。
set元素最大可以包含(2的32次方-1)(整型最大值)个元素 添加、删除、并集、交集、差集操作 每个集合中的各个元素不能重复
sadd 键名 元素1 元素2 :向集合中添加元素(一个或多个)
smembers 键名 :获取集合中的元素
scard 集合名称 :获取集合中元素的个数
srem key val1 :删除key集合val1元素
spop key :随机生成key集合一个元素
sismember key val1 :判断key中val元素是否存在
hmove :删除源集合添加目标集合
sdiff 集合1 集合2 :获取集合中的差集
sinter 集合1 集合2 :获取交集
sunion 集合1 集合2 :求并集
有序集合
有序集合:set的一个升级版本,他在set的基础上增加了一个顺序属性(权值)
zadd 集合名 序号 元素 :有序集合中添加元素
zrem key val1 :删除
zrange 集合名 开始下标 结束下标 -withscore :默认是升续排列
zremrangebyrank key 开始下标 结束下标 :删除集合中排名在指定范围的元素
zcard key :返回有序集合中元素的个数
zscore key 元素 :返回给定元素对应的score
zincryby key score 元素 :指定成员增量
zcount :分值统计个数:zcount
z(rev)range key startIndex endIndex :返回有序集合指定范围
zremrangebycore :分值删除
发布与订阅
publish/subscribe 消息通信模式。
发送者publish发布消息、订阅者接受消息
publish 频道 发送消息
subscribe 频道
psubscribe 名称*
安装认证及持久化、php安装redis扩展
安装认证&持久化机制
安装认证 vim打开redis的配置文件(redis.conf) #requirepass 设置的密码 重启redis服务,让密码生效。 pkill redis-server && ./redis-server ./redis.conf 客户端如果没有通过验证,则无法操作 客户端登录到服务器: redis-cli –a 密码 auth 密码
持久化机制
内存中的数据以文件形式保存到硬盘、服务器重启自动读取内存 snapshotting(快照)、append-only file(缩写aof)
快照:(默认)save、dbfilename、dir
默认、dump.rdb一次性把全部数据保存到硬盘
触发时机: 每隔N分钟或N次操作,内存数据形成rdb文件。
save 900 1 # 900秒 1个key修改 发起快照
save 300 10 # 300秒 30个key修改,弄起快照 屏蔽触发条件即关闭快照。
保存位置、备份位置: dir ./、dbfilename dump.rdb
手动触发:
登录:bgsave 未登录:./redis-cli bgsave -a 密码
缺点: 有一定间隔时间操作、redis意外down容易丢失快照。
其他配置项: dir ./ 目录 dbfilename dump.rdb rdb文件名
Rdbchecksum yes 检验数据
rdbcompression yes 完整性
stop-writes-on-bgsave-error yes 备份出错、主进程不停继续写入
aof: append-only-file 追加方式持久化AOF(appendfsync always|everysec|no)全局记录 性能消耗大
配置 appendonly yes # 开启
appendfilename appendonly.aof # 文件名
触发: appendfsync always # 每次收到写命令就立即强制写入磁盘
appendfsync everysec # 每秒钟强制写入磁盘一次
appendfsync no # /完全依赖 os,性能最好,持久化没保证 重写: 把内存中的数据,逆化成命令,写入到.aof日志
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写
no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof 手动执行:
登录:bgrewriteaof 未登录:./redis-cli -a 密码
bgrewriteaof 其他问题说明: dump rdb过程中,aof如果停止同步,会不会丢失: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作
aof重写是指什么: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里. 以解决 aof日志过大的问题.
如果rdb文件,和aof文件都存在,优先用谁来恢复数据:
aof 2种是否可以同时用:可以,而且推荐这么做 恢复时rdb和aof哪个恢复的快: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行
php支持redis安装扩展
php支持redis安装扩展: 下载扩展、添加ext目录、php.ini引入扩展、重启apache、phpinfo php常见code: new Redis()->connect(ip)、->auth(密码) set、hmset、lpush、incr、setTimeout get、hmget、hgetall、lrange、 无法添加:查看是否是防火墙造成的。 tp5使用redis:/application/config、cache、6379 Cache::set、get、rm、inc\dec、pull、clear、remember
linux下安装php的redis扩展、外网连接redis、主从复制、redis事务、电商秒杀原理:
php安装redis扩展
linux下安装php的redis扩展
下载、解压、进入目录、执行phpize(php7.0/bin/phpize)
进行配置指定安装在哪个PHP中:
./configure --with-php-config=/usr/local/php7.0/bin/php-config
编译安装 安装成功、提示扩展位置(redis.so) 修改php.ini添加扩展。
linux:
yum
yum serach redis|grep ^php
yum install -y xxx
源码安装:
下载、解压、生成配置文件、php-devel、执行phpize、配置php扩展、编译安装、配置、重启
外网连接redis
php -m
phpinfo()
外网php客户端连接redis bind 127.0.0.1改为 #bind 127.0.0.1
protected-mode yes 改为 protected-mode no (禁止外网访问)
主从复制
网站运行,mysql的写入((添加、修改、删除))、读取操作的sql语句比例:1:7
mysql为了降低每个服务器负载,可以设置读写分类 主服务器数据会“自动”同步给从服务器
Redis支持简单易用的主从复制(master-slave replication)功能,该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制品。主要作用: 主从备份,防止主服务器宕机;
读写分离,分担主服务器的任务; 任务分离,从服务器分别担任备份工作和计算工作。 主:slaveof 主服务器ip 端口号
从:slave-read-only yes 、replicaof ip 端口 设置连接主服务器口令 masterauth 密码 netstat -tunpl
验证:info replication
redis主从复制的缺陷: 同步的过程都要重新执行一遍,所以要记住如果是多台从服务器时,不要一下子都启动起来
redis事务
redis中事务 Redis支持简单的事务
Redis与 mysql事务的对比mysql: start transaction sql语句 rollback 回滚 commit 提交 redis: multi 开启事务 discard 回滚 exec 提交 watch命令:监听 watch命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到exec命令、unwatch(取消监听)
秒杀原理(redis队列)
使用redis链表中队列,进行pop操作,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用。
redis项目
后台:
用户登录、登录成功发送邮件功能(异步发送)
文章管理:列表、增加、修改、删除
前台:热门文章推荐 数据库redis
用户登录与邮件发送:
用户表:key设计 账号密码
hash、user:username:admin、id、username、password、hgetall
登录与任务队列: 登录接受消息处理、redis比较(账号、密码、发送任务发给队列、生产与消费跳转文章列表)
邮件发送:phpmailer/phpmailer
文章设计:
zset、 hash、字段:id、string
artile:key string:key
artile:id:1 hash key
article:zset:id zset 降序