为了账号安全,请及时绑定邮箱和手机立即绑定

快速了解 Redis

标签:
Java

Redis 是什么

  • Redis 是一个基于 key - value 的高性能非关系型数据库,类似的还有 Memcached ,Redis 整个数据库是在内存中进行操作,定期通过异步操作把数据 flush 到硬盘上。因为是纯内存操作,性能非常出色,每秒可以处理超过 10 万次读写操作。此外 Redis 还支持事务

  • Redis 支持多种数据结构,单个 value 最大限制是 1GB,不像 Memcached 只能保存 1MB 数据,可以用他的 List 来做 FIFO(先进先出)的 双向链表,实现高性能队列服务

  • Redis 的缺点主要是容易受到物理内存的限制,不能做海量数据的高性能读写

Redis 使用案例

  1. 比如 A 网站首页一天有 100 万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗 100 万次数据库请求。使用 Redis 可以将这种热点数据存到 Redis(内存)中,要用的时候直接从内存取,极大的提高了速度和节约了服务器的开销

  2. Redis 也可用于消息队列,通过 List 类型来做 FIFO(先进先出),满足实时的高并发需求。而通常在一个电商类型的数据处理过程之中,有关商品,热销,推荐排序的队列,通常存放在 Redis 之中

  3. 可以使用 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 特别适合用于存储对象

  • 使用场景:存储用户信息的等

    image



    image



    image



    • 而 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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消