Redis启动和常用命令
前言
Github:https://github.com/HealerJean
1、Redis启动和连接
安装
brew install redis
1.1、服务端启动
brew services start redis
redis-server ../redis.conf
1.2、客户端启动
也就是说可以远程连接其他的redis,-p 默认是6379 -h 默认是 127.0.0.1,密码登录 -a 12345
redis-cli -p
redis-cli -p 6379 -h 127.0.0.1
redis-cli -p 6379 -h 127.0.0.1 -a 123456
1.3、停止redis服务
redis-cli shutdown nosave|save 是否生成持久化文件
2、Redis特性
1、速度快
1.1、redis的所有数据都是存在在内存中的,Redis使用C语言实现的,C语言距离操作系统更近,因此速度回相对较快
1.2、Redis使用了单线程,预防了多线程可能产生的竞争问题
2、基于键值对的数据结构服务器
3、客户端语言多,有Java PHP C C++等
4、持久化:通常情况下降数据放到内存中是不持久的,一旦发送断点或者故障就完犊子了,因此有两种持久化方式RDB和AOP,这个持久化方式,后面解释喽
5、主从复制:Redis提供了复制功能,实现类多个相同数据的Redis脚本
6、高可用和分布式:高可用,Reidis Sentinel 哨兵,他能保证Redis节点的故障发现和故障自动转移,Redis从3.0版本正式出了分布式Redis Cluster,它是Redis真正的分布式实现。提供了高可用、读写和容量的扩展性
单线程为什么这么牛
1、纯内存访问:Redis将数据放到内存中,内存相应时间相当快
2、非阻塞I/O :i/o多路复用技术的实现
3、单线程,避免了多线程的切换和资源的竞争,但是单线程会有一个问题,那就是每个命令的执行时间是有要求的,如果某个命令执行时间过长,就会造成其他的命令的阻塞,对于redis这种来说是非常致命的。
3、常用命令
| 命令 | 说明 | 解释 |
|---|---|---|
keys * |
查看当前库的所有数据 | |
dbsize |
查看当前库有几个数据 | |
flushdb |
将当前库数据清除 | |
flushall |
清除所有库的信息 | |
select 0、1、...15 |
移动仓库(一共16个) | |
move keyName 2 |
将数据移动到其他库中,例如3库 | |
type keyName |
查看数据类型 | |
object encoding keyName |
查看内存编码 | |
ttl keyName |
查看过期时间 | -1永不过期 -2已经过期 |
expire keyName 10 |
设置k1过期时间,为10秒 | |
persist keyName |
将过期时间清除,永不过期 | |
exists keyName |
看看是否存在keyName | |
debug object keyName |
观察是什么数据结构 |
4、键管理
4.1、重命名
重命名期间会删除旧的key,然后再赋值,如果键的值比较大,会存在阻塞Redis的可能性,这点千万不能忽视
如果
healer也是一个存在的key,那么就会覆盖掉healer以前的值,为了防止被强行rename redis提供了renamenex,确保只有newkey不存在时候才覆盖
rename healejrean healer
4.2、键过期
1、设置键的过期时间
expire hello 10 10秒过期
expireat hello 1512552122 时间戳秒过期
pexpire hello 毫秒过期
pexpireat hell 时间戳毫秒过期
2、将过期时间清除
persist hello
4.3、迁移键
有的时候我们需要将一个redis迁移到两一个redis。redis提供了几种方法,但是使用场景有所区别
| 命令 | 作用域 | 原子性 | 支持多个键 |
|---|---|---|---|
| move | redis实例内部的库 | 是 | 否 |
| dump + restore | redis实例之间 | 否 | 否 |
| migrate | redis实例之间 | 是 | 是 |
4.3.1、move
只用于在Redis内部进行数据迁移,Redis内部可以邮多个数据库,但是在数据上不是共通的
move key db
4.3.2、dump+restore
实现在不同的redis实例之间进行数据迁移的功能,只要分为两步
1> 在源redis上dump命令将键值序列化,格式采用的是RDB格式,
2> 在目标Redis奖上面的序列化的值进行复原,其中ttl参数表示过期时间 ttl=0表示没有过期时间
原理探究:这个过程不是原子性质的,而是在通过两个客户端完成的的,一个dump,一个restore
dump key value
restore key ttl value
4.3.3、migrate (移动)
这个是相当于是进行了3个命令
dump+restore+del这个是原子性的目标redisip,端口,key、目标的索引库、迁移的超时时间
127.0.0.1:6380>migrate 127.0.0.1 6379 hello 0 1000
迁移多个key
127.0.0.1:6380>migrate 127.0.0.1 6379 "" 0 5000 keys key1 key2
5.4、数据库管理
redis具有16个数据库,正常情况下我们使用的只是0号数据库,例如Redis Cluester中只允许使用0号数据库,只不过为了向下兼容老版本的数据库功能,没有废弃掉罢了,那么为什么要废弃它呢
答案:
1、redis是单线程的,如果使用这些数据库,那么还是使用的同一个cpu,相互之间会有影响,如果分配不同的任务,加入有一个数据库太慢,那么其他的任务就会受到影响
2、完全可以在一台机器上部署多个redis,因为现在计算机都是有多个cpu的,这样保证了业务直接不会受到影响,又合理的利用了资源


