redis从入门到放弃
redis介绍
redis是一个开源的使用ANSI C语言编写的,支持网络,可基于内存亦可持久化的日志型的,key-value数据库,并提供多种语言的API.从2010年3月15日起,redis的开发工作由VMware主持,从2013年5月开始,redis 的开发由pivotal的赞助
redis与mencached都是为了应付网络上的高并发,大流量而存在.
redis与mencached可以同时接收到的并发请求,都已经过W,对服务器来说,他们两基本上不会成为瓶颈. 称为服务器瓶颈的最重要的是网络和硬盘IO
redis是什么
redis是可以持久化的,memcached是不能持久化的
redis是支持多种数据类型的,memcached只支持字符串
redis读速度没有memcached快,写速度与memcached差不多
redis的value值最大为512M,而memcached是1M
redis是支持主从服务器的,memcached是不支持主从服务器.
redis在存储数据的时候,主要是把mysql里面的数据取出来,把它的中间结果集数据放到redis里,使得mysql的连接数减少
redis安装
- 下载安装包, 官网
www.redis.cn
- 解压
tar -zxf redis-4.0.6.tar.gz
- 进入到解压目录
cd redis-4.0.6
- 编译安装(需指定安装路径)
make PREFIX=/安装路径 install
- 复制解压包里的
redis.conf
配置文件到redis的安装路径下的conf
文件夹下,没有的话手动创建一个 - redis的服务启动文件为
bin/redis-server
,配置文件中默认配置服务启动是以前台程序运行,修改配置文件中的启动为后台运行
vi conf/redis.conf
默认配置中 域名绑定到了127.0.0.1 只能本机适用,端口号绑定到6379 daemonize no
配置是否后天运行yes
为后台运行requirepass xxxx
配置密码,如果注释则不使用密码bind 127.0.0.1
启用则只能这个ip的访问,如果注释掉则所有ip都可以访问, 但是必须启用密码使用配置文件启动redis服务
redis-server conf/redis.conf
入门
启动客户端redis-cli
启动之后输入info
可打印出redis的版本等信息
redis支持的数据类型
redis是一个开源的,内存中的数据结构存储系统,可用作数据库,缓存和消息中间件,它支持多种类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets) 与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)**redis内置了复制(replication),LUA脚本(Lua scripting),LRU驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化(persistence),并通过redis哨兵(sentinel)和自动分区(cluster)提供高可用性(high availability).
1. string(字符串)
- set : 添加值,存在时修改,不存在时添加
- get : 获取字符串
- mset : 同时设置多个
- mget : 同时获取多个
- del : 删除,可以同时删除多个
- incr : 增加数值1,
redis是的最大值为2^64
,最小值为2^64
,是有符号的,如果超出最大值则会报错,memcached达到最大值后继续加会变为0- incrby : 增加指定的值
- decr : 减1
- decrby : 指定减少多少,
incrby和decrby都可以使用负值;
2. hash(哈希表)
- hset : 设置一个hash
hset key field value
- hget : 获取hash的值
- hmset : 设置多个值
hmset key field value field value field value ...
字段不能重复 ,重复后就覆盖- hmget : 获取多个值
- hgetall : 获取一个key里面的所有的值包括field和对应的value
- hkeys : 获得一个key里面的字段(field)名
- hlen : 获得长度
- hdel : 删除字段
hdel key field
- del key 删除key
3. list(列表)
列表分为: 单向列表和双向列表:
- lpush : 从左边插入值
- lpop : 从左边弹出一个值
- rpush : 从右边插入值
- rpop : 从右边弹出值
- lrange : 获得list中的值
lrange key start end
如果要获取所有的可以使用lrange key 0 -1
, -1表示倒数第一个,-2 表示倒数第二个.- llen : 获得列表的长度
4. set(无序集合)
- sadd : 添加值
- smembers : 获得所有的成员值
- spop 随机弹出一个值
spop key [num]
后面不指定num
时只随机弹出一个 ,指定num
时随机弹出num
个- scard : 检查长度
- sinter : 取两个key的交集
- sdiff : 取两个key的差集
* 差集以第一个key 的差为结果输出*- sunion : 并集
5. sortedset(有序集合)
- zadd : 添加值
zadd key int value [int value] ...
* 集合会通过int
这个整形数值进行排序*- zcard : 有序集合的长度
- zrange : 获得有序集合里的值
zrange key 0 -1 withscores
带有整形索引的查看- zrevrange : 倒序
- zincrby : 增加指定的值
对key(键)
keys : 获取所有的keys
keys *s
获取以s
结尾的key
keys s*
获取以s
开头的key
redis-cli keys "*"
获取这个redis-cli del 1
删除索引为1的key
对key的说明
redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如’foo’的简单字符串到一个JPEG文件的内容都可以,空字符串也是有效的key值
key 的原则:
- 太长的key值不是好主意,不仅消耗内存,而且在数据中查找这类键值的计算成本很高
- 太短的键值通常也不是好主意,影响阅读
- 最好坚持一种模式,例如: “object-type id field”
其他操作
- exists : 判断是否存在
- expire : 设置过期时间
expire key second
- ttl : 查看过期时间
过期之后返回 -2
永久存在是-1- type : 判断类型
- select : 选择库
redis默认是16个库,每个库都是独立的,默认是0号库- ping : 检查客户端与服务器之间连接是否正常
- flushdb : 清空当前库
- flushall : 清空所有的库
- auth : 开启密码认证
密码配置需要在redis.conf配置文件中配置requirepass xxxx
,设置密码后需要用auth命令输入密码认证,
持久化功能
snap shotting 快照持久化
配置快照持久化
配置文件中:
save 900 1 #如果900s有至少一个keys改变,就持久化
save 300 10 #如果300s至少有10个keys改变,就要持久化
save 60 10000 #如果60s至少有10000keys改变,就持久化
持久化是把内存里面的所有数据压缩一次,一次性把数据全部存储,每次持久化都需要对全部数据操作,所以需要合理配置存储的时间.
开启持久化功能需要配置一个数据持久化的文件,
配置文件中配置如下:
dir /xxx
append only file(AOF持久化,精细持久化)
- 配置开启或者关闭AOF持久化:
appendonly no
关闭AOF持久化
appendonly yes
打开AOF持久化 - 配置持久化数据的文件名:
appendfilename "appendonly.aof"
- 配置持久化的保存方式
appendfsync always
总是保存.有任何改变立即保存,
appendfsync everysec
每秒保存一次,推荐这种
appendfsync no
根据系统的io进行保存,随机保存,不推荐.
持久化保存说明:
1. AOF持久化保存的数据是执行的命令
2. 快照持久化保存的是二进制
3. 使用快照持久化的时候,在redis启动的时候会自动读取数据到内存,一次性就读取到位,所以非常快,
4. AOF持久化是redis启动的时候会一行一行执行命令,这个过程比较慢,
5. 快照持久化在持久的时候每一个都是覆盖的写,持久所需资源大
6. AOF持久的时候,是把执行命令记录下俩,再写到文件里
redis的主从模式
redis replication 的特点和优势
- 同一个Master可以同步多个Slaves .
- Slave同样可以接受其他Slaves的连接和同步请求, 这样可以有效的分载Master的同步压力.
- Master Server是以非阻塞的方式为Slaves提供服务. 所以在Master-Slaver同步期间, 客户端依然可以提交查询或者修改请求.
- Slave Server同样是以非阻塞的方式完成数据同步. 在同步期间, 如果有客户端提交查询请求,redis则返回同步之前的数据
- 为了分载master的读操作压力,Slave服务器可以为客户端提供只读操作的服务, 写服务仍然必须由Master来完成. 即便如此, 系统的伸缩性还是得到了很大的提高.
- Master可以将数据保存操作交给Slaves完成, 从而避免了在Master中要有独立的进程来完成此操作
- 主从模式的架构图如下:
redis replication 的工作原理
在Slave启动并连接到Master之后, 它将主动发送一个SYNC命令. 此后Master将启动后台存盘进程, 同时收集所有接收到的用于修改数据集的命令, 在后台进程执行完毕后, Master将传送整个数据库文件到Slave, 以完成一次完全同步. 而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中. 此后, Master继续将所有已经收集到的修改命令, 和新的修改命令依次传送给Slaves, Slave将在本次执行这些数据修改命令, 从而达到最终的数据同步.
如果Master和Slave之间的链接出现断链现象, Slave可以自动重连Master, 但是在连接成功之后, 一次完全同步将自动执行.
总结:
1. 从服务器连接上主服务器的时候, 主服务器会一次性把自己的所有的数据传给从服务器.
2. 之后主服务器有了新数据, 主服务器就会把新数据传给从服务器,这个时候就是增量同步.
3. 如果主从服务器之间断开, 那再一次连接的时候,主从服务器会使用* 全量同步*
配置replication
准备工作: 两台redis服务器, 或者同一台电脑上启动两个redis服务,但是要保证端口号, 配置文件, pid文件 数据文件 这四样不能一样.
- 创建一份新的配置文件:
cp conf/redis.conf conf/slave.conf
- 创建新的数据目录:
mkdir /slave-data
- 修改配置:
打开从服务器的配置文件slave.conf
vi conf/slave.conf
修改端口号:
port 6380
修改pid配置存储位置
pidfile /var/run/redis_6380.pid
修改数据文件位置
dir /working/redis-4.0.6/slave-data
启动redis服务器
./redis-4.0.6/bin/redis.server ../conf/slave.conf
两台服务器准备好, 接下来正式主从配置
- 主服务器不需要任何配置
- 从服务器打开配置文件
vi redis-4.0.6/conf/slave-conf
- 指定连接到主服务器的端口号与IP地址
slaveof 127.0.0.1 6379
- 如果主服务器设置了密码,则需要指定主服务器的登录密码
masterauth xxxx
- 保存退出并重启从服务器
这个时候主从模式就配置成功,可以测试了, 主服务器写入数据查看从服务器是否有同步
注意 :
- 从服务器是只读的, 不能写操作
- 主服务器 : 可读可写;
PHP操作redis
安装PHP的redis扩展
- 下载php-redis的php扩展程序包,
- 查看PHP的版本号
方法: 输出phpinfo(); 输出信息里找到PHP Extension Build
- 解压
tar -zxf redis-3.1.6.tgz
- 进入到目录
- [ ] 4. 执行PHP扩展的安装步骤