文章目录
一、 Redis介绍安装配置
1、安装
#下载
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
#解压
tar -xzf redis-5.0.7.tar.gz
#建立软连接
ln -s redis-5.0.7 redis
cd redis
make&&make install
#在src目录下可以看到
#redis-server--->redis服务器
#redis-cli---》redis命令行客户端
#redis-benchmark---》redis性能测试工具
#redis-check-aof--->aof文件修复工具
#redis-check-rdb---》rdb文件检查工具
#redis-sentinel---》sentinel服务器,哨兵
#redis作者对windows维护不好,window自己有安装包
# 在任意路径执行redis-server 都能运行起redis服务
-把可执行文件加入环境变量
-用户变量(用户家路径下:.bash_profile)
-系统变量
-把可执行文件在usr路径下建立软链接
####卸载redis
# 1、查看redis进程;
ps aux|grep redis
# 2、kill掉进程;
kill 进程id
# 3、进入到redis目录
cd /usr/local/
# 4、删除redis对应的文件
rm -f /usr/local/redis/bin/redis*
rm -f /usr/local/bin/redis*
# 5、删除对应的文件
rm -rf redis
# 简单启动服务
redis-server
# 动态参数启动
redis-server --port 6380
# 重点:通过配置文件启动
#配置文件启动(6379对应手机按键MERZ,意大利女歌手Alessia Merz的名字)
#####通过redis-cli连接,输入config get * 可以获得默认配置
#在redis目录下创建config目录,copy一个redis.conf文件
#daemonize--》是否是守护进程启动(no|yes)
#port---》端口号
#logfile--》redis系统日志
#dir--》redis工作目录
bind 0.0.0.0
daemonize NO
protected-mode no
requirepass 123456
# 普通客户端链接
redis-cli -h ip -p port
redis-cli
# 带密码的
# 方式一
redis-cli -h 127.0.0.1 -p 6370 -a 123456
# 方式二
redis-cli -h 127.0.0.1 -p 6370
先登陆,再通过auth输入密码
# 注意
CONFIG GET * 一百多对建值
CONFIG SET maxmemory 128M # 设置最大使用的内存
CONFIG set requirepass 123456 # 设置密码
CONFIG REWRITE # 保存到配置文件
2、 API的使用
http://liuqingzheng.top/db/Redis%E7%B3%BB%E5%88%97/01-Redis%E7%B3%BB%E5%88%97%E4%B9%8B-API%E7%9A%84%E4%BD%BF%E7%94%A8/
三、高级用法(优化相关)
1、慢查询相关
# 慢查询相关
慢查询:如果查询时间超过了配置时间
# redis发现变慢了,怎么排除
分析有哪些慢查询命令,避免掉
2、pipeline与事务
pipeline每次只能作用在一个Redis的节点上(如果做了集群,就没有pipline了)
# redis有没有事务啊
通过pipline模拟实现事务
-redis只能实现乐观锁:https://www.cnblogs.com/liuqingzheng/p/9997092.html
# 2 模拟乐观锁
# 在开启事务之前,先watch
wathc age
multi
decr age
exec
# 另一台机器
mutil
decr age
exec # 先执行,上面的执行就会失败(乐观锁,被wathc的事务不会执行成功)
3、悲观锁和乐观锁
# 悲观锁
认为本次修改操作,别人也会去修改操作,所以一开始就加锁,执行完之后加把锁释放,在此之间别人修改不了
# 乐观锁
认为本次修改不会被别人修改掉,在操作的时候判断值有没有被改掉,改掉就不执行了,没改掉就继续执行
# 总结
悲观锁永远会成功,乐观锁不一定成功
在mysql中实现悲观锁
用select...for update实现悲观锁,commit之后就释放了
4、发布订阅
类似于生产者消费者模型
# 发布订阅和消息队列的区别
发布订阅全收到,消息队列有个抢的过程,只有一个能抢到
5、Bitmap位图
统计日活量-->适用于大数量的
set 只适用于小范围的
1 位图类型是string类型,最大512M
2 使用setbit时偏移量如果过大,会有较大消耗
3 位图不是绝对好用,需要合理使用
6、HyperLogLog
极小的空间完成独立数量统计
-pfadd key element 增加(重复了不会增加)
-pfcount key 统计个数
-去重,独立用户统计,有错误率
7、GEO(地理信息定位)
做附近的人需要地理信息,就两种:redis和es
存储经纬度,计算两地距离,范围等
本质:zset
可以使用zset的删除,删除指定member:zrem cities:locations beijing
# 插入
geoadd cities:locations 116.28 39.55 beijing #把北京地理信息添加到cities:locations中
geoadd cities:locations 117.12 39.08 tianjin
geoadd cities:locations 114.29 38.02 shijiazhuang
geoadd cities:locations 118.01 39.38 tangshan
geoadd cities:locations 115.29 38.51 baoding
geopos cities:locations beijing #获取北京地理信息
# 计算北京到天津的距离
geodist cities:locations beijing tianjin km
# 计算北京方圆150km内的城市
georadiusbymember cities:locations beijing 150 km
四、持久化
1、介绍
-rdb:缓存
-aof:对数据准确性要求高一些
2、rdb方案
rdb就是把数据以快照的形式保存在磁盘中
rdb持久化是指在指定时间间隔内将内存中的数据集快照写入磁盘
# rdb:触发方式三种
-手动 save(同步) 会造成redis的阻塞(数据量非常大的时候)
-手动 bgsave(异步) 会在后台异步进行快照操作,快照同时还可以响应客户端请求
-配置文件
配置 seconds changes
save 900 1
save 300 10
save 60 10000
# 最佳配置redis.conf中配置
save 900 1
save 300 10
save 60 10000
dbfilename dump-3306.rdb #以端口号作为文件名,可能一台机器上很多reids,不会乱
dir /bigdiskpath #保存路径放到一个大硬盘位置目录
stop-writes-on-bgsave-error yes #出现错误停止
rdbcompression yes #压缩
rdbchecksum yes #校验
## 3、aof方案
客户端每写入一条命令,都记录一条日志,放到日志文件中,如果出现宕机,可以将数据完全恢复
# AOF 重写
本质就是把过期的,无用的,重复的,可以优化的命令,来优化
这样可以减少磁盘占用量,加速恢复速度
# aof的最佳配置redis.conf中配置
appendonly yes #将该选项设置为yes,打开
appendfilename "appendonly-3306.aof" #文件保存的名字
appendfsync everysec #采用第二种策略
dir /data #存放的路径
no-appendfsync-on-rewrite yes #在aof重写的时候,是否要做aof的append操作,因为aof重写消耗性能,磁盘消耗,正常aof写磁盘有一定的冲突,这段期间的数据,允许丢失
五、主从复制原理与优化
主库要开启持久化
# 方式一:手动配置
在6380上执行(去从库配置,配置主库)
# 127.0.0.1 6379主库
# 127.0.0.1 6380 从库 redis-cli -p 6380 开启一个redis实例
每个redis实例都配有data存储库,名字不一致
# 在从库上执行,就建立了主从(搭建主从)
slaveof 127.0.0.1 6379 #异步 端口是主库的端口
# 取消主从
slaveof no one #取消复制,不会把之前的数据清除
# 方式二:配置文件配置
daemonize no
pidfile redis.pid
bind 0.0.0.0
protected-mode no
port 6379
timeout 0
logfile redis.log
dbfilename dump.rdb
dir /data
# 指定主库为10.0.0.101 6379
slaveof 10.0.0.101 6379
# 从库只读
slave-read-only yes