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的,这样保证了业务直接不会受到影响,又合理的利用了资源