目录
Windows 下载安装
查看默认安装目录:usr/local/bin
redis 键(key) --(常用命令介绍)
redis 字符串(string) --(常用命令介绍)
redis 列表(List) --(常用命令介绍)
redis 集合(Set) --(常用命令介绍)
redis 哈希(Hash) --(常用命令介绍)
redis 有序集合Zset(sorted set) --(常用命令介绍)
redis的持久化保存策略
1. RDB ( Redis DataBase ) 持久方式
2. AOF ( APPEND ONLY MODE ) 持久方式
Windows 下载安装
下载地址:https://github.com/tporadowski/redis/releases
查看默认安装目录:usr/local/bin
- redis-benchmark:服务启动起来后执行性能测试工具
- redis-check-aof:修复有问题的aof文件;
- redis-check-dump:修复有问题的dump.rdb文件;
- redis-cli:客户端,操作入口;
- redis-sentinel:redis集群使用;
- redis-server:Redis服务器启动命令;
redis 键(key) --(常用命令介绍)
- keys *:查看所有key;
127.0.0.1:6379> keys *
1) "name"
- exists key:判断某个key是否存在;
127.0.0.1:6379> exists name
(integer) 1
- move key dbID(0-15): 移除输入id的库;
- 只能是已经存在的key值;
#给name设定过期时间为一百秒
127.0.0.1:6379> expire name 100
(integer) 1
#ttl命令查看name的过期时间
127.0.0.1:6379> ttl name
(integer) 86
- ttl key: 查看还有多少秒过期,-1表示永不过期,-2表示已过期;
# -2表示已过期
127.0.0.1:6379> ttl name
(integer) -2
#设置age
127.0.0.1:6379> set age 20
OK
# -1表示永不过期
127.0.0.1:6379> ttl age
(integer) -1
- type key: 查看key的类型;
127.0.0.1:6379> type age
string
redis 字符串(string) --(常用命令介绍)
- setex:设置带过期时间的key,动态设置 : setex 键 秒值 真实值
127.0.0.1:6379> setex name 60 cyx
OK
127.0.0.1:6379> ttl name
(integer) 45
127.0.0.1:6379> get name
"cyx"
- setnx:只有在 key 不存在时设置 key 的值:setnx 键 值
#age已存在所以设置失败
127.0.0.1:6379> setnx age 99
(integer) 0
#不存在class则设置成功
127.0.0.1:6379> setnx class ruanjiangongcheng
(integer) 1
- mset:同时设置一个或多个 key-value 对。
127.0.0.1:6379> mset name cyx sex 1 address 22
OK
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "address"
4) "class"
5) "name"
- mget:获取所有(一个或多个)给定 key 的值。
127.0.0.1:6379> mget name sex address
1) "cyx"
2) "1"
3) "22"
- msetnx:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在(如果存在key,则都不会操作,因为msetnx是原子性型操作)。
#输入的key都不存在时,插入成功
127.0.0.1:6379> msetnx aa 1 bb 2 cc 3
(integer) 1
#输入的key有任意一个存在,则插入失败
127.0.0.1:6379> msetnx dd 4 ee 5 aa 2
(integer) 0
127.0.0.1:6379> keys *
1) "sex"
2) "cc"
3) "age"
4) "aa"
5) "address"
6) "bb"
7) "class"
8) "name"
- getset:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。简单一句话,先get然后立即set。
127.0.0.1:6379> getset name chenyunxin
"cyx"
127.0.0.1:6379> get name
"chenyunxin"
- append:追加字符到指定key上。
#追加字符并返回追加后字符串长度
127.0.0.1:6379> append name isagoodman
(integer) 20
127.0.0.1:6379> get name
"chenyunxinisagoodman"
- strlen:返回字符串的长度。
127.0.0.1:6379> strlen name
(integer) 20
- incr: 自增 。(自增与自减都只能对数字进行操作)
127.0.0.1:6379> set int 10
OK
127.0.0.1:6379> incr int
(integer) 11
# incrby 可以设置自增步长
127.0.0.1:6379> incrby int 5
(integer) 16
- decr:自减。
127.0.0.1:6379> decr int
(integer) 15
# decrby可以设置自减步长
127.0.0.1:6379> decrby int 5
(integer) 10
- getrange:截取字符串。
127.0.0.1:6379> get name
"chenyunxinisagoodman."
#字符串下标从0开始
127.0.0.1:6379> getrange name 0 7
"chenyunx"
#只截取结果,不改变key值
127.0.0.1:6379> get name
"chenyunxinisagoodman."
- setrange:替换字符串。
127.0.0.1:6379> get name
"chenyunxinisagoodman."
#从下标为10的字符开始往后替换,返回字符长度
127.0.0.1:6379> setrange name 10 change
(integer) 21
#会改变key值
127.0.0.1:6379> get name
"chenyunxinchangedman."
redis 列表(List) --(常用命令介绍)
- lpush:从list左侧加入元素
127.0.0.1:6379> lpush people cyx yjl
(integer) 2
127.0.0.1:6379> lrange people 0 1
1) "yjl"
2) "cyx"
- rpush:从list右侧加入元素
127.0.0.1:6379> rpush people xiaoming
(integer) 3
127.0.0.1:6379> lrange people 0 2
1) "yjl"
2) "cyx"
3) "xiaoming"
- lrange:从左侧开始查看list元素
127.0.0.1:6379> lrange people 0 2
1) "yjl"
2) "cyx"
3) "xiaoming"
- linsert:在list中的某个元素的前后添加新元素
127.0.0.1:6379> linsert people before cyx xiaogang
(integer) 4
127.0.0.1:6379> lrange people 0 3
1) "yjl"
2) "xiaogang"
3) "cyx"
4) "xiaoming"
127.0.0.1:6379> linsert people after cyx xiaohong
(integer) 5
127.0.0.1:6379> lrange people 0 4
1) "yjl"
2) "xiaogang"
3) "cyx"
4) "xiaohong"
5) "xiaoming"
- lset:设置list指定下标的value值
127.0.0.1:6379> lrange people 0 4
1) "yjl"
2) "xiaogang"
3) "cyx"
4) "xiaohong"
5) "xiaoming"
127.0.0.1:6379> lset people 1 change
OK
127.0.0.1:6379> lrange people 0 4
1) "yjl"
2) "change"
3) "cyx"
4) "xiaohong"
5) "xiaoming"
- llen:返回list长度
127.0.0.1:6379> llen people
(integer) 5
- lpop(移除最左)、rpop(移除最右):移除list元素,并返回被移除的元素
127.0.0.1:6379> lpush people test test
(integer) 7
127.0.0.1:6379> rpush people test test
(integer) 9
127.0.0.1:6379> lrange people 0 8
1) "test"
2) "test"
3) "yjl"
4) "change"
5) "cyx"
6) "xiaohong"
7) "xiaoming"
8) "test"
9) "test"
127.0.0.1:6379> lpop people
"test"
127.0.0.1:6379> rpop people
"test"
127.0.0.1:6379> lrange people 0 6
1) "test"
2) "yjl"
3) "change"
4) "cyx"
5) "xiaohong"
6) "xiaoming"
7) "test"
- lindex:获取指定下标的元素
127.0.0.1:6379> lrange people 0 6
1) "test"
2) "yjl"
3) "change"
4) "cyx"
5) "xiaohong"
6) "xiaoming"
7) "test"
127.0.0.1:6379> lindex people 1
"yjl"
- sort:获取排序后的list
127.0.0.1:6379> lpush num 10 30 20 40
(integer) 4
#升序
127.0.0.1:6379> sort num
1) "10"
2) "20"
3) "30"
4) "40"
#降序
127.0.0.1:6379> sort num desc
1) "40"
2) "30"
3) "20"
4) "10"
#英文排序
127.0.0.1:6379> sort people alpha
1) "change"
2) "cyx"
3) "test"
4) "test"
5) "xiaohong"
6) "xiaoming"
7) "yjl"
#sort排序不会改变原list
127.0.0.1:6379> lrange people 0 6
1) "test"
2) "yjl"
3) "change"
4) "cyx"
5) "xiaohong"
6) "xiaoming"
7) "test"
- ltrim:截取list
127.0.0.1:6379> lrange num 0 4
1) "40"
2) "20"
3) "30"
4) "10"
#截取下标0-2的元素,会改变list
127.0.0.1:6379> ltrim num 0 2
OK
127.0.0.1:6379> lrange num 0 2
1) "40"
2) "20"
3) "30"
redis 集合(Set) --(常用命令介绍)
- sadd:添加
# 添加 sadd
127.0.0.1:6379> sadd code java
(integer) 1
127.0.0.1:6379> sadd code python switch
(integer) 2
- smembers:查看
# 查看 smembers,这里就可以看出,set集合是无序的
127.0.0.1:6379> smembers code
1) "python"
2) "java"
3) "switch"
- srem:删除
# 删除
127.0.0.1:6379> srem code switch
(integer) 1
- scard:查看set长度
127.0.0.1:6379> scard code
(integer) 3
- sismenber:查看set集合中是否包含指定值
#检查 set 集合中是否包含指定的值 sismember,存在返回 1,不存在返回 0
127.0.0.1:6379> sismember code java
(integer) 1
- sdiff:取出两个集合中不同的元素(差集)
# 以第一个key为主,依次与每个key取差集
127.0.0.1:6379> sdiff key1 key2
1) "1"
2) "2"
127.0.0.1:6379> sdiff key1 key2 key3
1) "2"
127.0.0.1:6379> sdiff key2 key1 key3
1) "5"
- sinter:取出两个集合中相同的元素(交集)
# 以第一个key为主,依次与每个key取交集
127.0.0.1:6379> sinter key1 key2
1) "3"
2) "4"
127.0.0.1:6379> sinter key1 key3
1) "1"
127.0.0.1:6379> sinter key1 key2 key3
(empty list or set)
- sunion:取出两个集合中所有的元素(并集)
# 以第一个key为主,依次与每个key取并集
127.0.0.1:6379> sunion key1 key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> sunion key1 key2 key3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
redis 哈希(Hash) --(常用命令介绍)
- hset、hmset:设置,批量设置
127.0.0.1:6379> hset user name cyx
(integer) 1
127.0.0.1:6379> hmset user sex nan age 21
OK
- hget、hmget:获取,批量获取
# 通过key获取value
127.0.0.1:6379> hget user name
"cyx"
127.0.0.1:6379> hmget user name sex age
1) "cyx"
2) "nan"
3) "21"
- hkeys、hvals、hgetall:获取key与value
# 获取所有key
127.0.0.1:6379> hkeys user
1) "name"
2) "sex"
3) "age"
# 获取所有value
127.0.0.1:6379> hvals user
1) "cyx"
2) "nan"
3) "21"
# 获取所有key和value
127.0.0.1:6379> hgetall user
1) "name"
2) "cyx"
3) "sex"
4) "nan"
5) "age"
6) "21"
- hexists:查看是否存在
#存在则返回1,不存在则返回0
127.0.0.1:6379> hexists user name
(integer) 1
- hdel:删除
127.0.0.1:6379> hdel user name
(integer) 1
#返回删除数
127.0.0.1:6379> hdel user sex age
(integer) 2
redis 有序集合Zset(sorted set) --(常用命令介绍)
zset 有序集合和 set 集合类似,都是不允许重复的值出现,只不过相比于 set 集合,zset 多了一个排序的功能,在添加值得时候需要关联一个 double 类型的分数(score),分数可以重复但value
不允许重复,默认按照分数(score)从小到大排序
- zadd:添加元素,第一个是分值,第二个是 value
127.0.0.1:6379> zadd zset 1 cyx
(integer) 1
127.0.0.1:6379> zadd zset 2 yjl 3 zjl
(integer) 2
- zrem:删除元素
127.0.0.1:6379> zrem zset cyx
(integer) 1
#查看所有元素
127.0.0.1:6379> zrange zset 0 -1
1) "redis"
2) "yjl"
3) "zjl"
#查看集合元素
127.0.0.1:6379> zrange zset 0 -1
1) "redis"
2) "yjl"
3) "zjl"
#查看倒序集合
127.0.0.1:6379> zrevrange zset 0 -1
1) "zjl"
2) "yjl"
3) "redis"
#查看带有分值的集合
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "redis"
2) "1"
3) "yjl"
4) "2"
5) "zjl"
6) "3"
- zcard:获取集合中元素个数
127.0.0.1:6379> zcard zset
(integer) 3
redis的持久化保存策略
我们都知道redis是一个NoSQL数据库,并且存取速度很快,而它存取速度快的原因,就是因为它是直接对内存中的数据进行读写操作,省略了从io读取数据的过程,速度就大大的提升了,那么,既然他的数据都是在内存中的,当断电后,内存数据就会被清空,为什么redis还能被称为数据库呢?这就是因为redis带有他自己的持久化保存策略,redis的持久化保存策略有两种,分别为 RDB
和 AOF
两种方式只能同时使用一种,redis 使用的 默认持久化方式为 RDB。
1. RDB ( Redis DataBase ) 持久方式
会单起一条线程,在指定的时间间隔内将内存中的数据以二进制形式写入、临时文件中,写入成功后默认存放到 redis 的安装目录下的 dump.rdb
文件中,如果你使用自己的配置启动的 redis,那么 dump.rdb
会和你的配置文件同级。RDB 的持久化有两种触发机制,一种是手动命令持久化,一种是自动持久化。
- 手动持久化
- SAVE:命令会阻塞当前 redis 服务器,期间不能正常提供服务,直至数据保存完毕后恢复。
- BGSAVE:会执行 fork 子进程负责持久化操作,redis服务器可以正常执行命令。(最好使用BGSAVE)
flushall
,shutdown
等等。
- 自动持久化
配置文件中的 SNAPSHOTTING 模块就是用来做 RDB 持久化的,里面有这样几句配置命令:
################################ SNAPSHOTTING ################################
# save 时间/s 数据修改次数
# 当数据在九百秒内有1次修改时,保存
save 900 1
# 当数据在三百秒内有10次修改时,保存
save 300 10
# 当数据在60秒内有10000次修改时,保存
save 60 10000
# 当RDB最后一次保存失败后,是否停止接受数据,默认yes (否则没人知道它坏了)
stop-writes-on-bgsave-error yes
# 是否以压缩形式保存,默认为yes
rdbcompression yes
# 是否效验数据完整性,默认为yes
rdbchecksum yes
# 持久化保存文件名
dbfilename dump.rdb
# 持久化文件保存路径
dir ./
2. AOF ( APPEND ONLY MODE ) 持久方式
AOF 的原理是将所有曾经使用过的存入操作的命令都记录下来,存放到 appendonly.aof
文件中。
############################## APPEND ONLY MODE ###############################
# 是否开启AOF,默认为n
appendonly no
# 指定更新条件,可以选择三个值:
# no:每次修改都同步,数据完整性强,性能偏低
# always:每秒同步一次,数据完整性较好
# everysec:让操作系统自己同步数据,消耗资源最低
appendfsync everysec
# 百分比,如果数据文件大小占据了指定百分比,会触发重写。
auto-aof-rewrite-percentage 100
# 必须满足最小大小才可以重写
auto-aof-rewrite-min-size 64mb
AOF持久化效率更高,RDB更适合灾难性恢复。