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