redis
下载安装
基本概念
redis是一个非关系型数据库,其使用的数据是存储在内存当中(也可以持久化数据到硬盘,防止重启丢失数据),所以使用时速度非常快,常用于缓存、消息队列、会话存储等应用场景。
redis默认有16个数据库,默认使用的是第0个,可以使用select num
切换所使用的数据库。
格式为key-value,value有着不同的数据类型,用来存储不同用途的数据。
key | value |
---|
为key命名时,可以使用:
表示层级关系,例如user:1
可以表示存储着用户id为1的信息。
在redis中,命令不区分大小写,参数和key区分。
常用类型及命令
通用命令
keys pattern
显示符合给定的pattern的key,为*
表示查找所有(当数据较多时慎用*
)。
exists key
查询给定的key是否存在。1表存在,0表示不存在。
del key [keys ...]
删除一个或多个键值对。返回所删除的键值对数量。
expire key second
给指定的key设置有效期,单位为秒。redis会自动删除过期的数据。
ttl key
查看指定key的有效期。返回剩余的秒数,-1表示永久有效,-2表示已经过期。
rename key newkey
给指定的key重命名。
String
是最简单的类型,其中根据所存的value不同,也会有不同的变化,存入整数和小数会转换为int和float,可以进行自增或自减的操作。
key | value |
---|---|
username | 张三 |
创建
set key value
创建或修改一个键值对,已存在就是修改。
get key
获取给定key中的值。
mset key value [key value ...]
设置一个或多个键值对。
查询
mget key [key ...]
获取一个或多个给定key的值。
setnx key value
(set if not exist)创建一个键值对,只有当键不存在时才能才会执行。1表示成功创建,0表示创建失败已经有指定的键值对了。
setex key second value
(set with expiration)设置键值对value的同时设置过期时间。
操作
incr key
让指定整数类型key的值加1。返回增加后的value。
incrby key increment
自定义增加数值,值为负表示减。返回操作后的value。
incrbyfloat key increment
可以自定义增加float类型的值,值为负表示减。返回操作后的value。
hash
hash类型的键值对的值可以存储包含多个字段的对象,且可以对对象中的字段进行单独的操作。操作hash的命令基本都有前缀h
。
key | value | |
field | value | |
user:1 | name | 张三 |
age | 18 |
创建
hset key field value [field value ...]
为指定的key设置字段和值,如果已经存在会修改旧的值。redis 4.0以上版本支持多字段。
hsetnx key field value [field value ...]
为指定的key设置字段和值,只有当键值对不存在时才能才会执行。1表示成功创建,0表示创建失败已经有指定的键值对了。
查询
hget key field
获取指定的key中的字段的值。
hmget key field [field ...]
获取指定的key中多个字段的值。
hkeys key
获取指定key中的所有字段。
hvals key
获取指定key中的所有字段的值。
hgetall key
查看指定的键中所有的字段和值。
hlen key
查看指定的key中的字段数量。
操作
hincrby key field increment
让指定的key中的字段值增加increment。
list
list类型的键值对的值是一个双端链表,有两个指针分别指向头部和尾部,可以从链表的左侧或右侧添加或移除元素,所以可以实现队列、栈的效果。
插入
lpush key value [value ...]
rpush key value [value ...]
把一个或多个值插入到列表的左侧/右侧,如果列表不存在,则会先创建列表。
移除
lpop key
rpop key
移除并返回列表的头部/尾部元素。列表为空时返回nil。
blpop key [key ...] timeout
brpop key [key ...] timeout
阻塞式的从头部/尾部移除多个元素,如果列表中没有元素,则会等待timeout时间,超时返回nil。
获取
llen key
获取列表的长度,如果不存在则返回0。
lrange key start stop
获取列表给定区间内的所有元素,索引从0开始,负数代表列表尾部,比如-2表示倒数第二个元素。
队列:rpush lpop / lpush rpop
栈:rpush rpop / lpush lpop
阻塞队列:rpush blpop / lpush brpop
set
set是Sring类型的无序且数据唯一的集合,通过hash表实现,可以进行集合的运算,实现查找共同数据等功能。
添加
sadd key member [member ...]
给set集合添加一个或多个值,如果添加的值已存在则忽略。
删除
srem key menber [member ...]
移除set集合中一个或多个元素。
查询
scard key
(set cardinality)获取集合中元素的数量。
sismember key member
判断指定的member是否在集合中。存在返回1,不存在返回0
smembers key
返回set集合中所有的元素。
运算
sunion key [key ...]
对set集合进行并集运算。
sinter key [key ...]
对set集合进行交集运算。
sdiff key [key ...]
对set集合进行差集运算。
sorted set
sorted set是有序且数据唯一的集合,底层是使用跳表和哈希表实现,每一个元素都有一个对应的score用来进行排序(从小到大)。
添加
zadd key score member [score member ...]
给集合添加一个或多个元素。如果元素存在则更新score值。
删除
zrem key member [member]
移除集合中一个或多个元素。
查询
分数
zscore key member
查询集合中指定元素的score值。
排名/下标
zrank key member
查询集合中指定元素的排名。从小到大排列,从0开始。
元素
zrange key start stop [WITHSCORES]
查询集合给定范围内的所有元素,索引从0开始,负数代表列表尾部,比如-2表示倒数第二个元素。
WITHSCORES
表示查询时附带分数。zrangebyscore key min max
查询集合给定的socre范围内的所有元素。
数量
zcard key
获取集合中的元素个数。
zcount key min max
获取集合中符合给定score范围的元素个数。
操作
zincrby key incrment menber
使集合中给定的元素增加incrment。
运算
zunion
zinter
zdiff
对sorted set集合进行交集、并集、差集运算。
持久化
持久化是把redis内存中的数据保存到磁盘中,以便在设备重启或发生故障时恢复数据。在redis中提供了两种持久化的方法,分别是RDB和AOF。开启持久化后当redis服务重启会寻找备份文件并自动恢复数据。
RDB(Redis DataBase)
把当前redis内存中所有的数据和状态快照保存到文件中,需要恢复时读取文件数据即可,默认的文件名是dump.rdb。
可以手动触发保存,也可以根据配置的规则自动保存。占用空间少恢复快,但rdb是手动或定时触发保存,可能会有数据的丢失问题。
手动保存
save
保存当前的redis快照,此命令会阻塞redis服务器进程,直到rdb文件创建完成,在此期间不能处理其他客户端请求。
bgsave
新建一个线程用来保存当前的redis快照。
自动保存
在redis的配置文件redis.conf
添加备份的规则。
bgsave 300 10 #在300秒之内有10个键被修改,则触发自动保存。
dbfilename drbname #自定义rdb文件名。
AOF(Append Only File)
把redis每次执行的改变数据的命令记录到一个文件中,需要恢复时读取文件并执行命令,默认文件名是appendonly.aof。数据丢失的概率减少了,不过占用的空间变多了。
在在redis的配置文件redis.conf
配置aof相关的参数。
appendonly yes #开启AOF持久化
#aof会把执行的命令添加到缓冲区,周期性的读取aof文件缓冲内核,最后根据策略选择同步时间。
appendfsync always #缓冲区有命令时立马执行同步,安全性最高但效率最慢。
appendfsync everysec #每秒同步一次。
appendfsync no #让系统选择最佳的同步时机。
aoffilename aifname #自定义aof文件名。
久而久之往文件中追加的命令变多了之后,文件就会很臃肿,有很多无用的命令,可以进行AOF重写,去除一些多余无用的命令达到精简文件大小的效果。
aof重写不是操作原aof文件,而是根据当前的内存数据和状态生成新的aof文件并替换原文件。比如往列表多次添加元素,可以简化为一次添加全部元素。
手动触发AOF重写:
bgrewriteaof #在后台异步重写aof。
配置redis自动触发:
auto-aof-rewrite-percentage 100 #比上次文件大小增长超过100%时,触发重写。
auto-aof-rewrite-min-size 64mb #当aof文件大于64mb时,触发重写。
混合持久化(Redis 4.0 及以上)
混合持久化保留了rdb和aof的优点,在进行aof重写时,redis会把当前内存中的数据以rdb格式保存到aof文件的头部,再将重写之后的写命令追加到aof文件的尾部,这样在redis恢复数据时,先读取rdb文件,再执行aof命令,既保证了恢复的速度也保证了数据的安全性。
在redis的配置文件redis.conf
开启混合持久化。
aof-use-rdb-preamble yes #开启混合持久化
事务
事务是一组命令的集合,这个集合中的命令按顺序执行,不会被其他命令打断。
multi #开启事务,之后的命令不会立马执行,而是加入一个队列之中,等待执行。
exec # 执行事务,按顺序执行队列的命令并返回执行结果。
discard #在开启事务后不想执行了,可以使用本命令取消事务,放弃队列中的所有命令。
#实现乐观锁
watch key1 key2 #可以监视一个或多个key,如果在事务执行前,监视的key被修改,则事务不会执行。
unwatch #取消watch对key的监视。
redis中的事务不支持回滚,当命令在执行过程中出错时,只有出错的命令不执行,其他命令正常执行直到完成。
当命令入队时出错,那么整个事务都不会执行,比如命令拼写错误。