Redis 是什么
Redis 是一个基于 key - value 的高性能非关系型数据库,类似的还有 Memcached ,Redis 整个数据库是在内存中进行操作,定期通过异步操作把数据 flush 到硬盘上。因为是纯内存操作,性能非常出色,每秒可以处理超过 10 万次读写操作。此外 Redis 还支持事务
Redis 支持多种数据结构,单个 value 最大限制是 1GB,不像 Memcached 只能保存 1MB 数据,可以用他的 List 来做 FIFO(先进先出)的 双向链表,实现高性能队列服务
Redis 的缺点主要是容易受到物理内存的限制,不能做海量数据的高性能读写
Redis 使用案例
比如 A 网站首页一天有 100 万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗 100 万次数据库请求。使用 Redis 可以将这种热点数据存到 Redis(内存)中,要用的时候直接从内存取,极大的提高了速度和节约了服务器的开销
Redis 也可用于消息队列,通过 List 类型来做 FIFO(先进先出),满足实时的高并发需求。而通常在一个电商类型的数据处理过程之中,有关商品,热销,推荐排序的队列,通常存放在 Redis 之中
可以使用 Redis 来做计数器,对于网站的用户其个人的粉丝数等统计,如果每次请求用户主页都要从数据库中去统计其粉丝数,则会非常影响请求速度,可以将用户的粉丝计数保存在 Redis 里面,要用的时候直接从内存取,极大的提高了速度和节约了服务器的开销
Redis 安装与操作
关于 Redis 更详细的操作,可查看菜鸟教程上的 Redis 教程:http://www.runoob.com/redis/redis-tutorial.html
因本机是 Mac 系统,所以我使用 Homebrew 安装,Window 下安装直接解压缩包即可
homebrew install redis
运行下面命令启动 redis-server,可指定使用的配置文件,若省略则会启动默认的
redis-server redis.windows.conf
打开另一个终端窗口,启动一个 redis-client 连接到 redis-server
redis-cli.exe -h 127.0.0.1 -p 6379
设置键值对与取出键值对
set myKey abc get myKey
Redis 数据类型描述
string(字符串)
String 是最常用的一种数据类型,一个键最大可以存储 512M 大小的数据
使用场景:常规的 key-value 缓存应用,常规计数:微博数、粉丝数
hash(哈希)
每个 hash 可以存储 2 的 32 次方 -1 个 key-value,hash 特别适合用于存储对象
使用场景:存储用户信息的等
而 Redis 提供的 hash 很好的解决了这个问题,Key 仍然是用户 ID,value 是一个 Map,这个 Map 的 key 是成员的属性名,value 是属性值。也就是通过 key (用户ID) + field (属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题
上面方式将用户 ID 作为查找 key,把其它信息封装成一个对象以序列化方式存储,这种方式的缺点是增加了序列化的开销,并且再需要其中某一项信息时需要把整个对象取回,在修改时需要对并发进行保护。下面方式使用用户 ID + 对应属性名称作为唯一标识,省去了序列化开销和并发的问题,但用户 ID 为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的
比如我们要存储一个用户信息对象数据,用户 ID 为查找的 Key,存储的 value 用户对象包含姓名、年龄、生日,如果用普通的 key-value 结构来存储,则为:
list(列表)
最多可以存储 2 的 32 次方 -1 个元素,按照插入顺序排序,可以将对象添加到头部或尾部
使用场景:消息队列
list 的使用场景很多,例如 twitter 的关注列表,粉丝列表都可以使用 Redis 的 list 来实现缓存
list 的另一个应用就是消息队列,可将任务存在 list 中,然后工作线程再用 pop 操作将任务取出进行执行,使用 sorted set 甚至可以构成有优先级的队列系统
set(集合)
集合最大成员数量为 2 的 32 次方 -1
使用场景:共同关注、共同喜好、共同好友等功能
与 list 功能类似,但不同之处在于 set 是可以自动重排的,当你需要一个列表数据,又不希望出现重复数据时 set 是一个很好的选择
在微博应用中,可以将一个用户所有关注人存在一个集合中,将其所有粉丝存在一个集合中,通过 Redis 为 set 提供的交集、并集、差集等操作可以非常方便的实现如:共同关注、共同喜好、共同好友等功能
sorted set(有序集合)
zset 与 set 一样,不同的是每个元素都会关联一个 double 类型的分数,redis 通过分数来为集合中的成员进行排序
使用场景:按时间、分数等排序集合列表,权重队列等
它与 set 的区别是,set 不是自动有序的,而 sorted set 可以可以通过提供一个优先级(score)的参数来为成员排序,并且插入是有序的,即自动排序
当你需要一个有序且不重复的集合列表时可以选择 sorted set 数据结构,比如按时间排序集合列表
HyperLogLog
HyperLogLog 是用来做计算统计算法,它只需花费 12kb 内存就可以计算 2 的 64 次方不同的数据
基数为不重复的数值,如数据集 {1,3,5,5} 的基数为 {1,3,5} 3个
Redis 事务
Redis 事务可以一次执行多个命令:
批量操作在发送 EXEC 命令前被放入队列缓存
收到 EXEC 命令之后会进入事务执行,执行中任意命令失败,其余的命令依然被执行
事务执行过程,其它客户端提交的命令请求不会插入到事务执行命令序列中
一个事务从开始到执行会经历以下三个阶段:
开始事务
命令入队
执行事务
比如下面命令,如果 set b bbb 处失败,set a 已经成功不会回滚,set c 还会继续执行
redis 127.0.0.1:7000> multiOKredis 127.0.0.1:7000> set a aaaQUEUEDredis 127.0.0.1:7000> set b bbbQUEUEDredis 127.0.0.1:7000> set c cccQUEUEDredis 127.0.0.1:7000> exec1) OK2) OK3) OK
Redis 事务可以保证单个客户端的多个操作都是原子性的
相关问题
redis为什么把数据放到内存中?
为了达到最快速的读写数据到内存中,磁盘 I/O 速度太盘
Redis 与 虚拟内存
虚拟内存是一种内存管理技术,它使得程序认为它拥有一块连续的内存空间,然而这块虚假的空间是很多块拆分的内存碎片,有些甚至存储在硬盘上,在需要用时才进行数据交换
当 key 很小而 value 很大时,使用 VM 的效果比较好,因为这样可以节约内存
Redis 主从复制
redis 支持主从复制,Slave 在启动时会连接到 Master 同步数据,可以实现读写分离,从 Master 插入数据,从 Slave 查询数据
redis 与 memcached 区别
memcached 的值均为简单字符串,redis 支持丰富的数据类型
redis 速度比 memcached 快
redis 可以持久化数据
redis 最大可以达到 1GB,而 memcache 只有 1MB
redis回收策略
volatile-lru:从设置的过期时间中挑选最近最少使用的数据
volatile-ttl:从设置的过期时间中挑选最近要过期的数据
volatile-random:从设置的过期时间中挑选任意数据淘汰
allkeys-lru:从数据集中挑选最少使用的数据
allkeys-random:从数据集中挑选任意数据淘汰
redis持久化的两种方式
文件快照(filesnapshotting):默认 redis 以异步线程快照形式将数据持久化到磁盘中(二进制文件dump.rdb),可以手动配置在 N 秒内,redis 发送 M 次快照到磁盘,也可以手动执行 save
AOF(append-only):快照方法在异常时,最近的数据就会丢失(丢失的数据根据save策略的配置),而 AOF 可以做到数据不丢失,但损失了性能,AOF 是全程持久化,redis 每执行一个修改数据的命令都会把数据写入到 aof 文件里面
Redis 适合的场景
缓存
排行榜/计数器
消息队列
作者:林塬
链接:https://www.jianshu.com/p/4b800a23ddb0