Redis基础
什么是Redis
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
- Redis支持数据的备份,即master-slave模式的数据备份
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
Redis连接
远程连接redis客户端: redis-cli -h host -p port -a password
设置redis密码 config set requirepass password
命令 | 描述 |
---|---|
auth password | 验证密码是否正确 |
echo message | 打印字符串 |
ping | 查看服务是否运行 |
quit | 关闭当前连接 |
select index | 切换到指定的数据库 |
Redis keys 命令
命令 | 描述 |
---|---|
del key | 在key存在时删除key |
dump key | 用于序列化给定 key ,并返回被序列化的值 |
exists key | 检测key是否存在 存在则返回1不存在则返回0 |
expire key seconds | 为给定 key 设置过期时间 |
expireat key timestamp | 左右和expirel类似,不同 的是expireat设置的参数是时间戳 |
pexpire key milliseconds | 为给定 key 设置过期时间 设置的参数是毫秒 |
pexpireat key milliseconds-timestamp | 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
key pattern | 用于查找所有符合给定模式 pattern 的 key |
move key db | 将当前数据库的key转移到另一个数据库 |
persist key | 移除 key 的过期时间,key 将持久保持 |
ttl key | 以秒为单位,返回给定 key 的剩余生存时间 |
pttl | 以毫秒为单位返回 key 的剩余的过期时间 |
randomkey | 从当前数据库中随机返回一个 key |
rename key newkey | 修改 key 的名称 |
renamenx key newkey | 仅当 newkey 不存在时,将 key 改名为 newkey |
type key | 返回key值的数据类型 |
Redis 字符串(String)
命令 | 描述 |
---|---|
set key value | 设置指定 key 的值 |
get key | 获取对应key的值 |
getrange key start end | 获取key指定偏移量的值 |
getset key value | 设定指定key的值并返回该key之前的值 |
setnx key value | 仅当key不存在时设置其值 |
setex key second value | 设置key的值和过期时间 |
setrange key offset value | 将key的值从偏移量为offset的位置覆盖为value |
strlen key | 返回指定key值的长度 |
mset [key value...] | 设置一个或多个 key-value 对 |
msetnx [key value...] | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 |
incr key | 将key的数值自增1 |
incrby key increment | 将 key 所储存的值加上给定的增量值(increment) |
incrbyfloat key increment | 将 key 所储存的值加上给定的浮点增量值(increment) |
decr key | 将key值自减1 |
decrby key increment | key 所储存的值减去给定的减量值(decrement) |
append key value | 如果 key 已经存在并且是一个字符串, APPEND 命令将 指定value 追加到改 key 原来的值(value)的末尾 |
Redis 哈希(Hash)
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
命令 | 描述 |
---|---|
hset key field value | 为哈希表中的字段赋值 |
hget key filed | 返回哈希表指定字段的值 |
hgetall | 返回哈希表中,所有的字段和值 |
hexists key field | 查看哈希表 key 中,指定的字段是否存在 |
hdel key [field...] | 删除指定哈希表指定字段 |
hincrby key field increment | 为哈希表 key 中的指定字段的整数值加上增量 increment |
hincrbyfloat key field increment | 为哈希表 key 中的指定字段的浮点数值加上增量 increment |
hkeys key | 返回哈希表所有字段 |
hlen key | 返回哈希表字段的数量 |
hmget key [field...] | 获取哈希表多个字段的值 |
hmset key[key value...] | 同时设置哈希表多个字段值 |
hsetnx key [key value...] | 仅当哈希表字段不存在值设置多个字段值 |
hvals key | 返回哈希表所有值 |
Redis 列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
命令 | 描述 |
---|---|
lpush key [value...] | 将一个或多个值插入到列表头部 |
lpushx key [value...] | 将一个值插入到已存在的列表头部 |
lrange key start end | 回列表中指定区间内的元素,区间以偏移量 START 和 END 指定 |
llen key | 返回列表长度 |
lpop key | 移出并获取列表的第一个元素 |
lrem key count value | 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素 |
lset key index value | 通过索引来设置元素的值 |
ltrim key start end | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 |
lindex key | 通过索引获取列表中的元素 |
linsert key before or after private value | 在指定元素的前或者后面插入元素 |
blpop key timeout | 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
brpop key timeout | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
brpoplpush source destination timeout | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
rpush key value | 在列表中添加一个或多个值(尾部) |
rpop | 移除并获取列表最后一个元素 |
rpoplpush source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
rpushx key value | 为已存在的列表添加值 |
Redis 集合(Set)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
命令 | 描述 |
---|---|
sadd key [value...] | 将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略 |
scard key | 获取集合的成员数 |
sdiff key1[key2] | 返回给定所有集合的差集 |
sdiffstore destination key1[key2] | 返回给定所有集合的差集并存储在 destination 中 |
sinter key1[key2] | 返回给定所有集合的交集 |
sinterstore destination key1[key2] | 返回给定所有集合的交集并存储在 destination 中 |
sismember key value | 判断 member 元素是否是集合 key 的成员 |
smembers key | 返回集合中的所有成员 |
smove source destination value | 将 member 元素从 source 集合移动到 destination 集合 |
spop key | 移除并返回集合中的一个随机元素 |
srandmember key [count] | 返回集合中一个或多个随机数 |
screm key [value...] | 移除集合中一个或多个成员 |
sunion key1[key2] | 返回所有给定集合的并集 |
sunionstore destination key1[key2] | 所有给定集合的并集存储在 destination 集合中 |
SSCAN key cursor [MATCH pattern] | 迭代集合中的元素 |
Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
命令 | 描述 |
---|---|
zadd key score1 member1[score2 member2] | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
zscard key | 获取有序集合的成员数 |
zcount key min max | 计算在有序集合中指定区间分数的成员数 |
zincrby key increment member | 有序集合中对指定成员的分数加上增量 increment |
Redis 发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
image.png
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
image.png
命令 | 描述 |
---|---|
PSUBSCRIBE pattern [pattern ...] | 订阅一个或多个符合给定模式的频道。 |
PUBSUB subcommand [argument [argument ...]] | 查看订阅与发布系统状态。 |
PUBLISH channel message | 将信息发送到指定的频道 |
PUNSUBSCRIBE [pattern [pattern ...]] | 退订所有给定模式的频道 |
[SUBSCRIBE channel [channel ...] | 订阅给定的一个或多个频道的信息 |
UNSUBSCRIBE [channel [channel ...]] | 指退订给定的频道 |
Redis 事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中
一个事务从开始到执行会经历以下三个阶段:
- 开始事务
- 命令入队
- 执行事务
命令 | 描述 |
---|---|
multi | 开启事物 |
exec | 提交事物 |
discard | 取消事物 |
watch [key...] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 |
unwatch | 取消 WATCH 命令对所有 key 的监视 |