数据类型
String
List
Set
Hash
Zset
使用场景
计数器
缓存
查找表
消息队列
会话缓存
分布式锁实现
其它
数据淘汰策略
持久化
RDB 持久化
AOF 持久化
经常使用命令
简介
Redis是开源的内存数据库,它能够用做数据库、缓存和消息中间件。数据库
Redis与其余key-value 缓存产品有如下三个特色
Redis支持数据的持久化,能够将内存中的数据保存在磁盘中,重启的时候能够再次加载进行使用。
Redis不只仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。缓存
数据类型
数据类型 | 能够存储的值 | 操做 |
---|---|---|
STRING | 字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操做对整数和浮点数执行自增或者自减操做 |
LIST | 列表 | 从两端压入或者弹出元素 对单个或者多个元素进行修剪,只保留一个范围内的元素 |
SET | 无序集合 | 添加、获取、移除单个元素 检查一个元素是否存在于集合中计算交集、并集、差集从集合里面随机获取元素 |
HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对获取全部键值对检查某个键是否存在 |
ZSET | 有序集合 | 添加、获取、删除元素 |
String
> set hello world OK > get hello "world" > del hello (integer) 1 > get hello (nil)
List
> rpush list-key item (integer) 1 > rpush list-key item2 (integer) 2 > rpush list-key item (integer) 3 > lrange list-key 0 -1 1) "item" 2) "item2" 3) "item" > lindex list-key 1 "item2" > lpop list-key "item" > lrange list-key 0 -1 1) "item2" 2) "item"
Set
> sadd set-key item (integer) 1 > sadd set-key item2 (integer) 1 > sadd set-key item3 (integer) 1 > sadd set-key item (integer) 0 > smembers set-key 1) "item" 2) "item2" 3) "item3" > sismember set-key item4 (integer) 0 > sismember set-key item (integer) 1 > srem set-key item2 (integer) 1 > srem set-key item2 (integer) 0 > smembers set-key 1) "item" 2) "item3"
Hash
> hset hash-key sub-key1 value1 (integer) 1 > hset hash-key sub-key2 value2 (integer) 1 > hset hash-key sub-key1 value1 (integer) 0 > hgetall hash-key 1) "sub-key1" 2) "value1" 3) "sub-key2" 4) "value2" > hdel hash-key sub-key2 (integer) 1 > hdel hash-key sub-key2 (integer) 0 > hget hash-key sub-key1 "value1" > hgetall hash-key 1) "sub-key1" 2) "value1"
Zset
> zadd zset-key 728 member1 (integer) 1 > zadd zset-key 982 member0 (integer) 1 > zadd zset-key 982 member0 (integer) 0 > zrange zset-key 0 -1 withscores 1) "member1" 2) "728" 3) "member0" 4) "982" > zrangebyscore zset-key 0 800 withscores 1) "member1" 2) "728" > zrem zset-key member1 (integer) 1 > zrem zset-key member1 (integer) 0 > zrange zset-key 0 -1 withscores 1) "member0" 2) "982"
使用场景
计数器
能够对 String 进行自增自减运算,从而实现计数器功能。
Redis 这种内存型数据库的读写性能很是高,很适合存储频繁读写的计数量。服务器
缓存
将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。数据结构
查找表
例如 DNS 记录就很适合使用 Redis 进行存储。
查找表和缓存相似,也是利用了 Redis 快速的查找特性。可是查找表的内容不能失效,而缓存的内容能够失效,由于缓存不做为可靠的数据来源。dom
消息队列
List 是一个双向链表,能够经过 lpush 和 rpop 写入和读取消息
不过最好使用 Kafka、RabbitMQ 等消息中间件。分布式
会话缓存
可使用 Redis 来统一存储多台应用服务器的会话信息。
当应用服务器再也不存储用户的会话信息,也就再也不具备状态,一个用户能够请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。性能
分布式锁实现
在分布式场景下,没法使用单机环境下的锁来对多个节点上的进程进行同步。
可使用 Redis 自带的 SETNX 命令实现分布式锁,除此以外,还可使用官方提供的 RedLock 分布式锁实现。spa
其它
Set 能够实现交集、并集等操做,从而实现共同好友等功能。
ZSet 能够实现有序性操做,从而实现排行榜等功能。操作系统
数据淘汰策略
策略 | 描述 |
---|---|
volatile-lru | 从已设置过时时间的数据集中挑选最近最少使用的数据淘汰 |
volatile-ttl | 从已设置过时时间的数据集中挑选将要过时的数据淘汰 |
volatile-random | 从已设置过时时间的数据集中任意选择数据淘汰 |
allkeys-lru | 从全部数据集中挑选最近最少使用的数据淘汰 |
allkeys-random | 从全部数据集中任意选择数据进行淘汰 |
noeviction | 禁止驱逐数据 |
持久化
RDB 持久化
将某个时间点的全部数据都存放到硬盘上。
能够将快照复制到其它服务器从而建立具备相同数据的服务器副本。
若是系统发生故障,将会丢失最后一次建立快照以后的数据。
若是数据量很大,保存快照的时间会很长。code
AOF 持久化
将写命令添加到 AOF 文件(Append Only File)的末尾。
使用 AOF 持久化须要设置同步选项,从而确保写命令同步到磁盘文件上的时机。这是由于对文件进行写入并不会立刻将内容同步到磁盘上,而是先存储到缓冲区,而后由操做系统决定何时同步到磁盘。有如下同步选项:
选项 | 同步频率 |
---|---|
always | 每一个写命令都同步 |
everysec | 每秒同步一次 |
no | 让操做系统来决定什么时候同步 |
always | 选项会严重减低服务器的性能; |
everysec | 选项比较合适,能够保证系统崩溃时只会丢失一秒左右的数据,而且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响; |
no | 选项并不能给服务器性能带来多大的提高,并且也会增长系统崩溃时数据丢失的数量。 |
随着服务器写请求的增多,AOF 文件会愈来愈大。Redis 提供了一种将 AOF 重写的特性,可以去除 AOF 文件中的冗余写命令。
经常使用命令
#ttl Redis TTL 命令以秒为单位返回 key 的剩余过时时间。 #expire Redis Expire 命令用于设置 key 的过时时间。key 过时后将再也不可用。每次从新获取过时时间都会重置。 #PERSIST Redis PERSIST 命令用于移除给定 key 的过时时间,使得 key 永不过时。 #Pttl Redis Pttl 命令以毫秒为单位返回 key 的剩余过时时间。