Redis经典入门

安装

///解压,编译源码:
tar -zxf  redis-5.0.7.tar.gz
cd redis-5.0.7
make
///把源码安装到/usr/local/bin,方便直接命令调用
cd src
make install

//正常情况已经可以使用了  
//测试验证 make test
//不改配置,默认端口6379,默认无密码
 
//启动
redis-server
//ping测试
redis-cli
ping
//停止
redis-cli shudown 
  • 也可用docker方式,这里暂不讨论。

配置

//查看说明文档
cd redis-5.0.7
less README.md
//可看到 redis-server /path/to/redis.conf,即配置模板文件
//copy到自己喜欢的目录,一般为 /usr/local/bin/redis 下,直接用也ok
//编辑redis.conf可配置 端口号/持久化/日志级别/密码设置/远程连接/ip绑定等
//启动
redis-server /usr/local/bin/redis/redis.conf

基础

//基础
//返回值说明: 1)状态回复PONG  2)错误恢复 (error)开头  3)整数回复(integer) 
// 4)字符串回复 “1”  5) 空 (nill)   6)多行字符串 【1)“value1”   2)“value2”  】
//key命名规则:  对象类型:对象ID:对象属性   如  user:1:user.view

//字符串类型
//字符串即键值对,很好理解,是所有类型基础
//显示所有键,数据量都时候【生产环境】不建议直接使用
keys *
exists key1  //是否存在key
del key1     
type key1  //返回类型  
set key1 value1
incr num //不存在默认0,执行后为1,如果使用在字符型的则会报错
decr num
incrby key 3 //指定增加3
decrby key 2
incrbyfloat key 2.1 //指定增加浮点数2.1
append key " world!" //有空格时候要双引号,返回的是总长度
strlen key //统计字符串长度
mget key1 key2 //同时获取多个key
mset key1 value1 key2 value2 //同时设置多个key

//散列类型
//一个key有多个field
hset key field value
hget key field
hmset key field1 value1 field2 value2
hmget key field1 field2
hgetall key
hexists key field
hsetnx key file value //已存在,则不改变值
hincrby key field 3  //增加指定字段的指定值
hdel key field //删除字段
hkeys key //key的所有字段
hvals key //key的所有字段值
hlen key //字段数量

//列表类型
lpush key value //左增加
rpush key value
lpop key //左弹出
rpop key 
llen key  //列表个数
lrange key 0 2 //获得索引 0 到2 的列表 
lrange key -2 -1 //负数表示从右边,-1为右边第一个元素
lrem key cout value // 删除前count个值为value的元素, count为负数则从右边开始删
lindex key index //根据索引获得队列对应值
lset key index value //根据索引值进行赋值
ltrim key 0 n //删除指定索引范围外的元素
linsert key before value0 value1   //往value0值的前面加入value1
linsert key after value0 value1    //往value0值的后面加入value1
rpoplpush key1 key2 //key1列表转到key2,一次执行一个元素

//集合类型
sadd key value  //增加
srem key value  //删除
smembers key  //列出所有元素
sismember key value  //是否存在
sdiff key1 key2  //集合 A-B
sinter key1 key2 //集合 A∩B
sunion key1 key2 //集合 A∪B
scard key //集合个数
sdiffstore key3 key1 key2 //把key1和key2不一样的存入key3,inter和union一样
srandmember key count //随机获得集合key中的元素个数,count为正时不会重复,负数时可能重复
spop key //随机弹出与i个元素

//有序集合
zdd key score member   //支持浮点数
zdd key +inf member    //+inf 正无穷  -inf负无穷
zscore key member     //获取元素分数
zrange key start stop   //同lrange,顺序默认从小到大
zrange key start stop withscores //同时获取分数
zrangebyscore key 80 100 //获取分数80到100的,不包含用 (100
zrangebyscore key (80 +inf limit 0 3 //获取分数从80开始(不包括80),到无穷大的,取3个
zrevrangebyscore key 100 0 limit 0 3 //获取从100开始,到0的,取3个,注意分数也是逆序
zincrby key score member //增加元素的分数,可增加负数
zcard key //有序集合个数
zcount key min max //获取指定分数个数
zrem key member //删除元素
zremrangebyrank key start stop // 按排名范围删除元素
zremrangebyscore key min max // 按分数范围删除元素
zrank key member //获得元素排名
zrevrank key member //获得反向排名
zinterstore key3 2 key1 key2 //key1 和 key2 两个有序集合元素sum后存储到key3,即默认aggregate为sum
zinterstore key3 2 key1 key2 aggregate min //key1 和 key2 两个有序集合元素min后存储到key3,还有max
zinterstore key3 2 key1 key2 weights 1 0.1 //计算时进行权重的乘算即 key1*1和key2*0.1进行默认sum

进阶

//事务
//一次简单事务
multi   //开启多个命令事务
sadd key1 a
sadd key1 b
exec

//有错误命令的事务,全部回滚
multi             //开启事务
set key1 a        //不会执行
set key           //此为错误命令1
errorcommand key  //此为错误命令2
exec

//有运行时错误的事务,不回滚,错误不执行,正确依次执行
multi
set key1 a
sadd key1 b    //因为类型是字符串,此处用集合类型,导致运行时报错
set key1 c
exec

//watch监控键,配合multi,当该键被另一个事务修改后,此事务后的事务就不会执行,执行exec返回nill
//监控持续到exec,可配合unwatch取消监控
set key1 a
watch key1  //开启
set key1 b  //模拟一个事务执行
multi       //配合multi
set key1 c
exec      //返回nill,同时释放watch
get key1 //最后为b

//expire 过期时间
set key1 a
expire key1 10  //默认单位是秒(pexpire 为毫秒),成功返回1,键不存在则为0
ttl key1 //查看还剩时间 //-1表示永久,-2表示不存在已删除,>0表示还剩时间

//sort 排序,对列表类型,集合类型,有序集合类型进行排序
sort key1  //对数字型的,进行排序,key1类型可以为列表,集合,有序集合(忽略分数,只对实际值)
sort key1 desc // 倒序
sort key1 desc limit 1,2 //limit offset count 跳过 offset个元素,获取count元素
sort key1 alpha //对字符型的,要加上alpha,则根据alpha进行排序
//by参数, 根据字符串类型键或者散列类型键的某个字段进行排序,找不到对应值则默认排序
//根据字符串类型键排序
lpush list1 2 1 3
set key1:2 100
set key1:1 50
set key1:3 -10
sort list1 by key1:* 
//根据散列类型键的字段进行排序 *->
hset key2:2 prop 100 
hset key2:1 prop 50
hset key2:3 prop -10
sort list1 by key2:*->prop
//get 参数 ,结合sort排序,返回参数指定值(可字符串类型,也可散列类型字段)
//可多个get,本身值为#
hset key2:2 name name2
hset key2:1 name name1
hset key2:3 name name3
sort list1 by key2:*->prop get key2:*->name get #
//store参数,保存结果到指定键中,指定键为列表类型
sort list1 by key2:*->prop get key2:*->name get # store sort.result

// 队列,基于列表类型
//brpop blpop 开启一个阻塞队列,直到有新元素加入,返回元素值则暂停
clientA> brpop queue 0  //进入阻塞,第二个参数表示超时时间,0表示永不超时,
clientB> lpush queue abc //可看到clientA输出abc
//优先级队列,同时定义两个阻塞队列,前面的优先级高
lpush queue1 abc
lpush queue2 def
brpop queue1 queue2 0 //返回的是queue1 abc

//发布订阅模式
clientA> subscribe channel.1 //订阅频道channel.1
clientB> publish channel.1 hi//向频道channel.1发布消息,可看到clientA收到消息
//按规则订阅
clientA> psubscribe channel.? channel.?* //按规则订阅,并可重复订阅

持久化

//rdb方式: 按条件,定时保存数据到 rdb文件中,即快照,目录默认为当前进程的工作目录
//conf配置文件中配置
文件中> save 300 10   //表示300秒内至少有10个键修改则进行快照
文件中>  dir /usr/local/bin      //默认
文件中> dbfilename dump.rdb      //默认   
save   //手动执行备份,备份中会中断客户端请求,不建议生产环境使用。
bgsave //同save,但不会中断客户端请求
lastsave //查看上一次备份时间,为unix时间戳
flushall //清除数据库中所有数据,只要自动快照条件不为空,就会执行一次快照

//aof方式:把执行的命令写入硬盘,默认不开启
//conf配置文件中配置
文件中> appendonly yes   //开启aof持久化
文件中> appendfilename appendonly.aof //默认
文件中> auto-aof-rewrite-percentage 100   //当前aof文件大小超过上一次重写文件大小时候,再次重写
文件中> auto-aof-rewrite-min-size 64mb    //允许重写的最小aof文件大小
文件中> appendfsync everysec  //每秒把硬盘缓存写入硬盘
文件中> #appendfsync always   //总把写缓存写入硬盘
文件中> #appendfsync no       //默认30秒把缓存写入硬盘


备份

//主从复制
//从数据库配置【slaveof 主数据库地址 主数据端口】(默认从数据库为只读,不建议可写)
文件中>slaveof 192.168.0.1 6739
//也可从数据库中直接命令
slaveof 192.168.0.1 6739
//查看具体信息
info replication
//主库宕机后,手工恢复需要两步,先进入从数据库
slaveof no one             //1 将从数据库提升为主数据库
slaveof 192.168.0.1 6739   //2 将原主数据库重新设置为新主数据库的从数据库
//无硬盘复制,提高性能,配置文件中
文件中>repl-diskless-sync yes

//哨兵 
//主库宕机后,可自动选从库为主库,外加监控功能
//查看信息
info replication  
//在主机中,新建立一个配置文件sentinel.conf,用于哨兵启动
//名字mymaster可以替换,主机ip地址,最后数字表示最低通过票数
//另可以配置多个,监控多台主机,也可以多个主机配置哨兵监控一台主机
文件中>sentinel monitor mymaster 127.0.0.1 6379 3
文件中>sentinel monitor othermaster 192.168.1.3 6379 4
//默认每隔一秒哨兵ping一次检查,配置小于1秒的会按一秒
文件中>sentinel down-after-milliseconds othermaster 600 //每隔600ms
//启动哨兵
//输出信息后表示启动成功
redis-sentinel /usr/local/bin/redis/sentinel.conf  
//尝试停掉主机,哨兵会根据内部算法以及最低通过票数进行自动选从库到主库
//建议每个节点部署一个哨兵,并且部署位置要与监控主机的网络环境保持一致
//哨兵数为N个,则最低通过票数建议设置成 N/2+1

//集群
//redis集群与广义的集群有所不同,有点类似分片的概念,主要解决主从模式中单机的瓶颈问题,即:分片+主从+哨兵
//插槽的概念:总共16384个插槽,每个键会根据算法自动对应到相应插槽,每个主机节点管理指定插槽,插槽分配后可移动
//至少需要3个主数据库
//配置文件中配置
文件中>cluster-enabled yes
文件中>cluster-config-fille nodes.conf   //集群状态会存储到文件中,每个节点需要不同的文件
文件中>cluster-require-full-coverage no  //一个有负责插槽的主机宕机后,仍能工作
info cluster //查看状态
//使用redis-trib.rb进行初始化集群,replicas表示每个主库拥有多少个从库,执行后,需要输入yes确认
redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
cluster nodes //查看所有节点信息,获取节点id
cluster slots //查看插槽分配情况
//节点增加
cluster meet 127.0.0.1:6380 //新增节点中执行,ip和端口为集群内任一节点
//迁移插槽
redis-trib.rb reshared 127.0.0.1:6380 //reshared表示重新分片,ip地址任一一个节点都可,根据提示输入插槽数和节点id
//如果键在不是对应插槽的主机执行set等动作,会提示重定向,使用 -c
redis-cli -c -p 6380 //-c 集群模式,支持自动重定向

雪崩/穿透/击穿

  • 雪崩 redis意外宕机后,大量请求通过db查询,导致宕机
  • 穿透 主要指空或者不存在的key大量恶意请求,导致宕机
  • 击穿 主要指热点key过期,导致大量请求到db,导致宕机

Java和Redis(待续…)

参考:
https://www.jianshu.com/p/0fa4c100e9a9
https://segmentfault.com/a/1190000018883478
https://www.cnblogs.com/zeng1994/p/03303c805731afc9aa9c60dbbd32a323.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值