Skip to content

redis

下载安装

基本概念

redis是一个非关系型数据库,其使用的数据是存储在内存当中(也可以持久化数据到硬盘,防止重启丢失数据),所以使用时速度非常快,常用于缓存、消息队列、会话存储等应用场景。

redis默认有16个数据库,默认使用的是第0个,可以使用select num切换所使用的数据库。

格式为key-value,value有着不同的数据类型,用来存储不同用途的数据。

keyvalue

为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,可以进行自增或自减的操作。

keyvalue
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

keyvalue
fieldvalue
user:1name张三
age18
创建

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添加备份的规则。

yaml
bgsave 300 10 #在300秒之内有10个键被修改,则触发自动保存。
dbfilename drbname #自定义rdb文件名。

AOF(Append Only File)

把redis每次执行的改变数据的命令记录到一个文件中,需要恢复时读取文件并执行命令,默认文件名是appendonly.aof。数据丢失的概率减少了,不过占用的空间变多了。

在在redis的配置文件redis.conf配置aof相关的参数。

yaml
appendonly yes #开启AOF持久化

#aof会把执行的命令添加到缓冲区,周期性的读取aof文件缓冲内核,最后根据策略选择同步时间。
appendfsync always #缓冲区有命令时立马执行同步,安全性最高但效率最慢。
appendfsync everysec #每秒同步一次。
appendfsync no #让系统选择最佳的同步时机。

aoffilename aifname #自定义aof文件名。

久而久之往文件中追加的命令变多了之后,文件就会很臃肿,有很多无用的命令,可以进行AOF重写,去除一些多余无用的命令达到精简文件大小的效果。

aof重写不是操作原aof文件,而是根据当前的内存数据和状态生成新的aof文件并替换原文件。比如往列表多次添加元素,可以简化为一次添加全部元素。

手动触发AOF重写:

yaml
bgrewriteaof #在后台异步重写aof。

配置redis自动触发:

yaml
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开启混合持久化。

yaml
aof-use-rdb-preamble yes #开启混合持久化

事务

事务是一组命令的集合,这个集合中的命令按顺序执行,不会被其他命令打断。

yaml
multi #开启事务,之后的命令不会立马执行,而是加入一个队列之中,等待执行。
exec # 执行事务,按顺序执行队列的命令并返回执行结果。

discard #在开启事务后不想执行了,可以使用本命令取消事务,放弃队列中的所有命令。

#实现乐观锁
watch key1 key2 #可以监视一个或多个key,如果在事务执行前,监视的key被修改,则事务不会执行。

unwatch #取消watch对key的监视。

redis中的事务不支持回滚,当命令在执行过程中出错时,只有出错的命令不执行,其他命令正常执行直到完成。

当命令入队时出错,那么整个事务都不会执行,比如命令拼写错误。