Redis
什么是Redis?
就是一个数据库,但是数据存在内存中
Redis的优势
- 性能极高:读写11万次/s ,写8.1万次/s左右
- 支持数据持续化 (服务器重启后数据不会丢失)
- 支持丰富的数据结构: string, hash, list,set, sorted set
Redis和memcache的区别
- 相同点 : 都是基于内存以键值对形式存储
- 不同点 : 支持数据持久化
- 不同点 : Redis数据类型比memcache多
Redis的安装
官方下载地址 : http://redis.io/download
一 :
下载并上传到服务器
二 :
通过连接工具(例 : putty) 进入上传到的目录(/php/tools)
三 :
解压源代码包 tar -zxvf redis-4.0.9.tar.gz
四 :
进入解压目录 cd /php/tools/redis-4.0.9
五 :
将源代码文件编译成可执行文件 make
安装
#创建redis目录
mkdir -p /php/server/redis
#复制配置文件
\cp -rf /php/tools/redis-4.0.9/redis.conf /php/server/redis
#复制redis客户端
\cp -rf /php/tools/redis-4.0.9/src/redis-cli /php/server/redis
#复制redis服务端
\cp -rf /php/tools/redis-4.0.9/src/redis-server /php/server/redis
启动redis
#进入安装目录
cd /php/server/redis
#打开配置文件
vi ./redis.conf
#修改配置文件
daemonize = no /改为 yes (#改为后台启动
#修改配置后启动服务
./redis-server ./redis.conf
验证登录
./redis-cli -h 127.0.0.1 -p 6379 #可缩写 ./redis-cli
常见的五种数据类型
- 字符串 ( String
- 哈希 ( hash
- 字符串列表 ( list
- 字符串集合 ( set
- 有序字符串集合 ( sorted set
字符串类型
设置 一个 或 N个键 (set / mset)
语法 : set 键 值 / mset 键1 值1 ... 键n 值n
set php1 1/ mset php2 2 php3 3 .....
键存在则修改,不存在则创建
获取一个 或 N个键 (get /mget)
语法 : get 键 / mget 键1 键2 .... 键N
get php1 / mget php2 php3 php4 ....
键存在则返回值 , 不存在则返回nil(无值)
递增递减( incr 和decr )
语法 : incr/decr 数字
incr 键 /decr 键
返回递增/递减后的数字
键不存在则创建并递增1 / 递减为0
增减指定值 ( incrby 和 decrby )
语法 : incrby /decrby 键 数字
incrby / decrby php1 2
返回递增递减后的值
键不存在则创建并递增值 / 递减为0
字符串追加(append)
语法 : append 键 值
append php1 55
返回 : 追加后的长度
字符串截取(substr)
语法 : substr 键 起始位置 结束位置
substr php1 0 -1 (-1 代表最后一位)
下标从0开始 -1代表最后一位 -2代表最后2位 ...
哈希 (Hash)类型
可以用来存储复杂的数据结果,如存储人信息...商品信息..
hash.png设置/获取hash字段
语法 : hset/hmset 键 字段1 值1 字段2 值2...
hset php1 name 张三 /hmset php1 name 张三 age 18 add 上海 sex
语法 : hget/hmget 键 字段1 字段2...
hget php1 name /hmget php1 name age add ...
字段增值(hincrby)
语法 : hincrby 键 字段 数字
hincrby php1 age 2
返回增值后的数值
检测键字段(hexists)
语法 : hexists 键 字段
hexists php1 name
存在返回1 不存在返回0
删除键字段(hdel)
语法 : hdel 键 字段1 ... 字段N
hdel php1 name ...
删除成功返回1 无值或者删除失败返回0
字段个数 (hlen)
语法 : hlen 键
hlen php1
返回字段个数
查询键 哈希查询
hkeys key #返回全字段
hvals key #返回全值
hgetall key #返回全字段和值
hkeys php1
hvals php1
hgetall php1
列表类型 (list)
概念 : 先进后出 先进先出
先进后出 lpush lpop
先进先出 lpush rpop
左进(lpush) 和 右进(rpush)
语法 : lpush 键 数据
说明 : 从左/右压入数据,返回压入后数据长度
lpush php1 1;lpush php1 3;lpush php1 2; #3
rpush php2 1;rpush php2 3;rpush php2 2; #3
查询(lrange)
语法 : lrange 键 起始位置 结束位置
lrange php1 0 -1 //321 #根据上面数据
lrange php2 0 -1 //132 #根据上面数据
头出和尾出(lpop/rpop)
lpop/rpop 键
返回弹出后的数据 lpop php1 //3
集合(set)类型
差集 : 我有你没有
并集 : 合并去重
交集 : 大家共有的
添加(sadd)
sadd 集合名 数据
sadd s1 1;sadd s1 2;sadd s1 3;
给指定的集合添加数据
查看(smembers key)
语法 : smembers 集合名
smembers s1 //123
移除(srem)
语法 : srem 集合名 "数据"
srem s1 "2"
成功返回1
差集(sdiff)
语法 : sdiff 集合名1 集合名2 .. 集合名n
作用查询 集合名1有其他没有的
sdiff s1 s2 s3..
返回其他没有的值
并集(sunion)
语法 : sunion 集合1 .. 集合n
作用 : 合并去重
sunion s1 s2
返回 s1 s2 所有的并去除重复的
交集(sinter)
语法 : sinter 集合1 .. 集合n
作用:取集合公共部分
sinter s1 s2
返回s1和s2共有的值
有序集合(Sorted set) 类型
添加( zadd )
语法 : zadd 集合名 数据 成员
给指定集合添加数据
zadd user1 1 php;zadd user1 2 java;zadd user1 3 ccc;
查看 (zrange)
语法 : zrange 集合名 起始位置 结束位置 [WITHSCORES]
zrange user1 0 -1 [WITHSCORES]
作用 : 获取集合中的成员 WITHSCORES:既显示成员又显示数据
移除(arem)
语法 : zrem 集合名 成员
从指定集合移除数据
zrem user1 ccc
成功返回1
升降序排名 (zrange & zrevrange)
语法 : zrange 键 起始位置 结束位置 [WITHSCORES]
语法 : zrevrange 键 起始位置 结束位置 [WITHSCORES]
键操作(Key)
键是否存在(exists)
语法 : exists 键
键存在返回1 不存在返回0
键类型(type)
type 键
查看键类型
键查询(keys *)
keys * 查看当前数据库所有键
keys php* 查看当前数据库以php开头的所有键
keys *php 查看当前数据库以php结尾的所有键
keys *php* 查看当前数据库包含php的所有键
键更名(rename)
rename 旧键名 新建名
键统计(dbsize)
语法 : dbsize
返回键个数
设置键过期时间(expire / ttl)
语法 : expire 键 秒数
设置指定键过期时间
语法 : ttl 键
检测键是否过期 #过期就不存在 返回-2 未设置返回-1
expire php8 10 #10秒后过期(销毁)
ttl php8 检测php8键是否过期
选择数据库(select)
语法 : select 下标 #默认有16个数据库 0-15 可以通过修改配置来更改
vi ./redis.conf 当datavases 16 改为想要的数据库个数
键删除
键删除-当前库 : flushdb
键删除-所有库 : flushall
小结:
###字符串(string)
设置1个键: set 键 值
设置n个键:mset 键1 值1 .. 键n 值n
获取1个键: get 键
获取n个键:mget 键1 键n
递增递减: incr/decr 键
增减指定: incrby/decrby 键 数字
追加: append 键 内容
截取: substr 键 起始位置 结束位置(注:下标从0开始,含前含后)
###哈希(Hash)
设置1个值: hset 键 字段 值
获取1个值: hget 键 字段
设置n个值:hmset 键 字段1 值1 ... 字段n 值n
获取n个值:hmget 键 字段1 ... 字段n
检测字段: hexists 键 字段
删除字段: hdel 键 字段
字段个数: hlen 键
所有字段: hkeys 键
所有值: hvals 键
所有字段值:hgetall 键
###列表(List)
压入:lpush/rpush 键 值
弹出:lpop/rpop 键
查询:lrange 键 起始位置 结束位置
###集合(Set)
添加:sadd 集合名 数据
删除:srem 集合名 数据
查看:smembers 集合名
差集:sdiff 集合名1 ... 集合名n 我有你没有
交集:sinter 集合名1 ... 集合名n 大家都有的
并集:sunion 集合名1 ... 集合名n 合并去重
###有序集合(Sorted Set)
添加:zadd 集合名 数据 成员
删除:zrem 集合名 成员
查看: zrange 集合名 起始位置 结束位置 [withscores] (升序)
查看: zrevrange 集合名 起始位置 结束位置 [withscores] (降序)
###键(Key)
键是否存在:exists 键
键类型: type 键
键查询: keys *
键更名: rename 旧键 新键
键统计: dbsize
键设置过期:expire 键 秒数
查看过期: ttl 键 (明确:过期则代表不存在,不存在-2,未设置-1)
选择数据库:select 下标(注:通过redis.conf声明数据库个数)
删除当前库:flushdb
删除所有库:flushall
Redis的持久化方式
原理:
redis持久化原理.png快照持久化(Snapshotting)
快照模式将内存中的数据以快照的方式写入二进制文件中(dump.rdb)
快照持久化-1.png
快照存储文件名称
快照持久化-2.png
save 900 1 #900 秒内如果超过 1 个 key 被修改,则发起快照保存
save 300 10 #300秒超过10个key被修改,发起快照
save 60 10000 #60秒超过10000个key被修改,发起快照
AOF持久化(Append only file)
概念 : AOF方式只保存我们的写,修改,删除动作到文件中(appendonly.aof)当系统重启的时候会将该文件中的数据重新加载到内存中
开启AOF方式
关闭快照备份 参考上面开启快照方式将其注释#
打开配置文件 vi ./redis.conf 开启AOF备份
AOF备份.png
重启服务 (1- 杀死进程 2-重启服务)
killall redis-server
./redis-server ./redis.conf
安全性
问题 : 默认安装好redis匿名账号登录危险
解决: 打开redis.conf 将requirepass 注释强调,设置密码即可
redis安全性.png重启服务 ...
开启密码后 需要密码才能登录 登录时添加-a输入密码
或进入后auth 密码..
主从复制
概念 :
主从复制 : 当主服务器有写入/删除/修改数据动作,从服务器会自动同步
主从复制.png
配置
主服务器设置
步骤1:打开配置文件,命令:vi /php/server/redis/redis.conf
步骤2:开启后台启动,操作:daemonize yes
步骤3:设置密码,操作:requirepass 123 #从服务器连接主服务器需要使用
步骤4:开启Redis远程访问,操作:去掉bind 127.0.0.1可以使所有的ip访问redis
步骤5:重启redis服务器
步骤6:关闭防火墙,因为后期从服务器需要请求主,命令:service iptables stop
从服务器设置
步骤1:打开配置文件,命令:vi /php/server/redis/redis.conf
步骤2:开启后台启动,操作:daemonize yes
步骤3:修改端口,操作:port 6380
步骤4:声明需要复制的主服务器IP、端口、密码
步骤5:重启redis服务器
注 : 从服务器端口和主服务器端口不能一致
主服务器必须关闭防火墙,命令:service iptables stop
网友评论