redis高级(一)
- 一、redis安装和配置
- 下载、安装
- 关于卸载redis
- 简单启动服务
- 动态参数启动
- 重点:通过配置文件启动redis
- 普通客户端链接
- 带密码的
- 注意
- 二、API
- 三、高级用法
- 模拟乐观锁
- 发布订阅
- 四、持久化
- rbd方案(三种触发方式)
- AOF方案
- 五、主从复制原理与优化
一、redis安装和配置
下载、安装
# 下载
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
重点:通过配置文件启动redis
# 配置文件启动
# 通过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 # 保存到配置文件
二、API
### 1-keys
#打印出所有key
keys *
#打印出所有以he开头的key
keys he*
#打印出所有以he开头,第三个字母是h到l的范围
keys he[h-l]
#三位长度,以he开头,?表示任意一位
keys he?
#keys命令一般不在生产环境中使用,生产环境key很多,时间复杂度为o(n),用scan命令
### 2-dbsize 计算key的总数
dbsize #redis内置了计数器,插入删除值该计数器会更改,所以可以在生产环境使用,时间复杂度是o(1)
### 3-exists key 时间复杂度o(1)
#设置a
set a b
#查看a是否存在
exists a
(integer) 1
#存在返回1 不存在返回0
###4-del key 时间复杂度o(1)
删除成功返回1,key不存在返回0
###5-expire key seconds 时间复杂度o(1)
expire name 3 #3s 过期
ttl name #查看name还有多长时间过期
persist name #去掉name的过期时间
###6-type key 时间复杂度o(1)
type name #查看name类型,返回string
### 7 其他
info命令:内存,cpu,主从相关
client list 正在连接的会话
client kill ip:端口
dbsize 总共有多少个key
flushall 清空所有
flushdb 只清空当前库
select 数字 选择某个库 总共16个库
monitor 记录操作日志,夯住
###1---hget,hset,hdel
hget key field #获取hash key对应的field的value 时间复杂度为 o(1)
hset key field value #设置hash key对应的field的value值 时间复杂度为 o(1)
hdel key field #删除hash key对应的field的值 时间复杂度为 o(1)
#测试
hset user:1:info age 23
hget user:1:info ag
hset user:1:info name lqz
hgetall user:1:info
hdel user:1:info age
###2---hexists,hlen
hexists key field #判断hash key 是否存在field 时间复杂度为 o(1)
hlen key #获取hash key field的数量 时间复杂度为 o(1)
hexists user:1:info name
hlen user:1:info #返回数量
###3---hmget,hmset
hmget key field1 field2 ...fieldN #批量获取hash key 的一批field对应的值 时间复杂度是o(n)
hmset key field1 value1 field2 value2 #批量设置hash key的一批field value 时间复杂度是o(n)
###4--hgetall,hvals,hkeys
hgetall key #返回hash key 对应的所有field和value 时间复杂度是o(n)
hvals key #返回hash key 对应的所有field的value 时间复杂度是o(n)
hkeys key #返回hash key对应的所有field 时间复杂度是o(n)
###小心使用hgetall
##1 计算网站每个用户主页的访问量
hincrby user:1:info pageview count
##2 缓存mysql的信息,直接设置hash格式
三、高级用法
# 慢查询相关
# pipeline与事务
- pipeline每次只能作用在一个redis的节点上,(如果做了集群,就没有pipeline了)
- 悲观锁和乐观锁
- redis只能实现乐观锁:https://www.cnblogs.com/liuqingzheng/p/9997092.html
模拟乐观锁
# 在开启事务之前,先watch
watch age
multi
decr age
exec
# 另一台机器
mutil
decr age
exec # 限制性,上面的执行就会失败(悲观锁,被watch的事务不会执行成功)
发布订阅
# Bitmap位图
# HypeLog:极小的空间完成独立数量统计
- pfadd key element # 增加(重复了不会增加)
- pfcount key # 统计个数
- 去重,独立用户统计,有错误率
# GEO(redis, es)
# 插入数据
geoadd cities:locations 106.14.60.93 beijing # 把北京地理信息天津到cites:location中
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
# 计算北京到天津的距离
geodist cities:locations beijing tianjing km
# 计算北京方圆150km内的城市
georadiusbymember cities:locations beijing 150 km
四、持久化
# 两种方案:
- rbd:缓存
- aof;对数据准确性要求高一点
rbd方案(三种触发方式)
# 手动 save
# 手动 bgsave
# 配置文件示例:
配置 seconds changes
save 900 1
save 300 10
save 60 10000
# 最佳配置
save 900 1
save 300 10
save 60 10000
dbfilename dump-3306.rdb # 以端口号作为文件名,一台机器上启动很多redis服务也不会乱
dir /bigdiskpath # 保存路径放到一个大硬盘位置目录
stop-writes-on-bgsave-error yes # 出现错误停止
rdbcompression yes # 压缩
rdbchecksum yes # 校验
AOF方案
# 原理:
客户端每写入一条命令,都记录一条日志,放到日志文件中,如果出现宕机,可以将数据完全恢复
# AOF重写 如何实现的?
本质上就是把过期的、无用的、重复的、可以优化的命令,来做优化
这样,可以减少磁盘的占用量,加速恢复速度
# aof的最佳配置
appendonly yes # 将该选项设置成yes,打开
appendfilename "appendonly-3396.aof" # 文件保存的名字
appendfsnyc everysec # 采用第二种策略
dir /data # 存放的路径
no-appendfsync-on-rewrite yes
五、主从复制原理与优化
# 手动配置
在6380上执行(去从配置,配置主库)
# 127.0.0.1 6379 主库
# 127.0.0.1 6380 从库
# 在从库上执行,就建立了主从
slaveeof 127.0.0.1
# 取消主从
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.rbd
dir /data
# 指定主库为10.0.101 6379
slaveof 10.0.0.101
# 从库只读
slave-read-only yes