redis我爱编程

Redis 实践-工具改变人的思考方式

2017-09-06  本文已影响45人  志华_C

Redis 简介

Redis 简介

和memcache对比

阿里云 redis 标准版 的使用场景

持久化选项(两种方式)

两种方法可以都用也可以都不用很随意

bgsave的创建子进程速度非常快(几GB毫秒级,取决于剩余内存,就是有没有使用虚存),慢的是存到硬盘上
AOF的问题是AOF文件会比较大,所以需要执行BGREWRITEAOF来压缩AOF文件的体积,这个命令通过移除冗余命令来实现。

主从复制

从服务器在执行同步时,会清空自己的所有数据
Redis不支持主主复制(Redis cluster)

字符串处理

不常用但很有用的命令

  1. 字符串

SETNX、APPEND、GETRANGE、SETRANGE、GETBIT、SETBIT、BUTCOUNT、BITOP

  1. 链表

LINDEX、LRANGE、LTRIM

  1. 集合

SRANDOMMEMBER、SPOP、SMOVE

  1. 散列

HKEYS、HVALS

  1. 有序集合

有序集合并运算比较特殊可以用来解决一些权重问题:ZINTERSTORE、ZUNIONSTORE

  1. SORT

根据给定选项,对输入列表、集合或者有序集合进行排序,然后返回存储排序的结果

  1. KEY相关命令
命令 功能
PERSIST 移除键的过期时间
[P]TTL 查看还有多久过期
[P]EXPIRE 设置键的过期时间
[P]EXPIREAT 设置键的过期时间为指定时间戳

事务和流水线

为什么redis没有实现典型的悲观锁功能?
悲观锁持有锁的客户端运行越慢,等待解锁的客户端被阻塞的时间就越长。
reids的setnx命令配合lua脚本可以很方便的实现高性能的分布式悲观锁。

redis里就没有pipeline这个命令,只是各种redis客户端实现的一种方式(打个比方Yii2默认的reids客户端就没实现这个功能。)

典型实践

  1. 分布式锁:悲观锁,消除竞争条件
  2. 公平计数信号量:限制资源(API)的并发数量(通过计数器替换时间戳作为信号量分值)

计数器信号量和锁的区别在于客户端获取锁失败时一般会等待,而计数器信号量会选择直接返回错误

  1. 任务队列:
    • 优先级队列:blpop命令支持多个列表作为参数并按照顺序弹出数据,实现很简单(ResQueue)
    • 延迟任务队列(3种简单实现方式):
      1. 在任务信息中包含任务的额执行时间,如果时间没到呢,短暂等待把任务重新推入队列里面
      2. 使用等待列表记录需要在未来执行的任务,并在每次进行循环的时候,检查并执行已经到期的任务
      3. 把所有需要在未来执行的任务放有序集合里,并将执行时间设置为分值,扫描并移除合适的任务,并添加到合适的任务队列。

Redis优化

降低内存占用

降低redis内存的占用有助于减少创建快照和加载快照所需的时间、缩短从服务器进行同步所需要的时间(同步初始化那步的时间,主从同步靠的是发送命令也就是不能降低delay)

  1. 使用短结构来更高效的表示数据
  2. 使用分片技术将体积较大的结构分割为多个体积较小的结构(单机分片)
  3. 将固定长度的数据打包存储到字符串键里面,从而进一步降低内存占用

扩展Redis

前提:
确认合理使用了Redis提供的数据结构(比如:不把列表当集合使用;也不要获取整个散列然后在客户端里进行排序,而是直接使用有序集合);合理使用流水线和连接池;将大体积的对象缓存到Redis里面之前应该合理进行压缩(lz4、gzip、bzip2)
做完上述准备之后可以考虑架构上扩展读写性能了

  1. 扩展读性能
    • 扩展读性能的最简单方法就是添加只读从服务器
    • 使用从服务器树来解决重同步的问题
    • 使用Redis Sentinel 对下线的主服务器提供故障转移功能(RS还提供了转移通知的功能,可以在故障转移的时候调用用户脚本。)
    • 使用带压缩的隧道来减低从服务器的传送的数据量(如果使这个功能需要ssh自带的选项让ssh自动重连)

重同步:每当有从服务器尝试与主服务器建立连接的时候,主服务器就会为从服务器传建一个快照,如果在快照创建完毕之前,有多个服务器都尝试与主服务器进行连接,那么这些从服务器将会接收到同一个快照。从效率角度将这是合理的,但是这可能会将主服务器的带宽打满,导致主服务器的延迟变高甚至导致主服务器已经建立的链接被断开。

  1. 扩展写性能

前提:
1.进行功能拆分
2.在对redis写入之前,先尝试在本地内存中对将要写入的数据进行聚合计算
3.使用锁或者Lua脚本去替换redis事务段
在以上方法都试过后说明遇到了只使用一台机器带来的瓶颈,是时候将数据分片到多台机器上面了
数据分片的架构有很多种

  1. 可以使用分片来扩展复杂查询

Lua 脚本编程

Redis的Lua脚本编程的实现和典型应用

上一篇下一篇

猜你喜欢

热点阅读