Redis in Action

Ref: Redis in Action

Redis是我在大约3年前为了解决一个实际问题而创造出来的:简单来说,当时我在尝试做一件使用硬盘存储关系数据库(on-disk SQL Database)无法完成的事情——在一台我能够支付得起的小虚拟机上面处理大量写人负载。

Mac OS X Redis 简洁安装

Ref: Mac环境下安装Redis

以 redis-3.2.8.tar.gz 为例:

  1. 下载: https://redis.io/download
tar -zvxf redis-3.2.8.tar.gz
# 移动解压后的文件
cp ./redis-3.2.8 /usr/local/
  1. 测试&安装
cd /usr/local/redis-3.2.8
sudo make test
sudo make install
  • 配置
# 新建配置文件
cp /usr/local/redis-3.2.8/redis.conf /usr/local/redis-3.2.8/etc/redis.conf
# 修改配置文件
# By default Redis does not run as a daemon. Use 'yes' if you need it.
 # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes 
  • 启动 Redis Server
redis-server /usr/local/redis-3.2.8/etc/redis.conf
  • 启动 Redis Client
redis-cli

Ch 1 初识Redis

1.2 Redis 数据结构

数据类型 存储的值 读写能力
STRING 字符串,整数,浮点数
LIST 链表,字符串
SET 无序集合,字符串
HASH 散列表
ZSET 有序列表

1.2.1 STRING

命令 行为
GET 获取
SET 设置
DEL 删除

1.2.2 LIST

命令 行为
RPUSH 将给定值插入列表右端
LRANGE 获取列表在给定范围上的所有值
LINDEX 获取列表在给定位置上的单个元素
LPOP 从列表的左端弹出一个值,并返回被弹出元素

1.2.3 SET

命令 行为
SADD 添加
SMEMBERS 返回所有
SISMEMBER 是否存在, 1: 存在; 0: 不存在
SREM 删除

1.2.4 HASH

命令 行为
HSET key field value 添加,返回值:1: 成功;0:失败
HGET key field 查找
HGETALL 返回所有
HDEL 删除

1.2.5 有序集合

命令 行为
ZADD key score member 添加
ZRANGE key start stop [WITHSCORES] 根据元素位置查找
ZRANGBYSCORE * key min max [WITHSCORES] [LIMIT offset count]* 获取给定分值范围的所有元素
ZREM * key member [member ...]* 删除

Ch 2 使用Redis构建Web应用

2.1 登录和Cookie缓存

2.4 数据行缓存

具体做法:编写一个持续运行的守护进程函数,让这个函数将指定的数据行缓存到Redis里面,并不定期地对这这些缓存进行更新。

PART 2 核心概念

Ch 3 Redis 命令

3.6 发布与订阅

3.7.1 排序

3.7.2 基本的Redis事务

Ch 4 数据安全与性能保障

Redis 持久化方式:

  1. 快照 Snapshotting
  2. 只追加文件 Append only file

创建快照命令

命令 行为
BGSAVE 客户端向服务器发送,启用子进程创建快照
SAVE 让服务器在快照创建完成之前不再响应其他命令
BGSAVE 用户配置的save选项触发
SAVE Redis 通过SHUTDOWN命令接收到关闭服务器请求,或收到标准TERM信号
BGSAVE 向另一个服务器发送SYNC命令开始复制

4.1 持久化选项

AOF持久化

命令 行为
always 每个Redis写命令同步
everysec 每秒执行一次同步
no 让操作系统决定何时同步

4.2 复制 Replication

命令 行为
SLAVEOF host port 设置Redis的主服务器
SALVEOF NO ONE 取消设置Redis主服务器

4.4 Redis事务

命令 行为
MULTI 开启Redis事务,之后跟着用户传入的多个命令,最后以EXEC结束
WATCH 在用户使用WATCH命令对键进行监视之后,只到用户执行EXEC命令的这段时间里面,如果有其他客户端抢先对任何被监视的键进行了替换、更新或删除等操作,那么当用户尝试执行EXEC命令的时候,事务将失败并返回一个错误,只有用户可以选择重试事务或者放弃事务,是一种乐观锁,Optimistic Locking
UNWATCH 可以在WATCH命令执行之后,MULTI命令执行之前对连接进行重置;
DISCARD 取消WATCH命令,并清空所有的已入队的命令
EXEC 提交&执行已入队的命令
    public void addUpdateContact(Jedis conn, String user, String contact) {
        String acList = "recent:" + user;
        Transaction trans = conn.multi();
        trans.lrem(acList, 0, contact);
        trans.lpush(acList, contact);
        trans.ltrim(acList, 0, 99);
        trans.exec();
    }

Ch 5 使用Redis构建支持程序

5.4 服务的发现与配置

Ch 6 使用Redis构建应用程序组件

6.1 自动补全

使用有序集合直接在Redis内部完成自动补全的前缀计算工作。
原理:通过想有序集合添加元素来创建查找范围,并在取得范围内的元素之后移除之前添加的元素。

6.2 分布式锁

WATCH只会在数据被其他客户端抢先修改了情况才会通知执行了这个命令的客户端,而不会阻止其他客户端对其进行修改,所以这个命令被称为乐观锁。

在高负载的情况下,使用锁可以减少重试次数,降低延迟时间,提升性能并将加锁的粒度调整至合适的大小。

Dog Pile Effect
ref: Dogpile效应以及Solution
执行事务所需的时间越长,就会有越多待处理的事务互相重叠,这种重叠增加了执行单个事务所需的时间,并使得那些带有时间限制的事务失败的几率大幅度上升,最终导致所有事务执行失败的几率和进行重试的几率都大幅度上升。

6.3 计数信号量,Counting Semaphore

计数信号来量是一种锁,它可以让用户限制一项资源最多能够同时被多少个进程访问,通常用于限定能够同时使用的资源数量。

计数信号量和其他锁的区别

  • 客户端获取锁失败时,客户端通常会选择继续等待
  • 客户端获取技术信号来量失败时,客户通常会选择立即返回失败的结果。

6.4 任务队列

如果需要进一步减少定时任务的运行开销,那么可以在函数里面添加一个自适应方法(Adaptive Method),让函数在一段时间内都没有发现可执行的任务时,自动延长休眠时间,或者根据下一个任务的执行时间来决定休眠的时长,并将休眠时长的最大值限制为100ms,从而确保执行时间距离当前时间不远的任务可以及时被执行。

Ch 7 基于搜索的应用程序

Redis 特别适合用于解决基于搜索的问题,Search-based problem

基本搜索原理
数据预处理:建索引,Indexing,数据结构:反向索引,Inverted Indexes

  1. 从文档里面提取单词,语法分析,Parsing,标记化,Tokenization

Part 3 进阶内容

Ch 9 降低内存占用

Ch 10 扩展Redis

Ch 11 Redis 的Lua脚本编程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • motivation get familiar with python go over redis's comma...
    holysu阅读 1,017评论 0 2
  • 导读 这本书有点厉害,看完读懂了,就大致知道构建类微博的亿级社交平台的大部分秘密。 微博及Twitter这两大社交...
    cajan2阅读 665评论 0 1
  • 这本书涵盖Redis的使用。读者不要求了解Redis,但是必须有python(版本2.7)基础。 书中介绍的示例都...
    cajan2阅读 1,044评论 1 0
  • 周末阳光依旧艳,寒月梨园叶正红。 11月13日,忙完手头事,我于中午驱车前往兰州市皋兰县什川镇梨园一游,几只羊悠闲...
    宗林的李阅读 630评论 5 6
  • 总是, 在海棠花开的季节回家。 那满树的殷红啊, 浓稠得化都化不开, 将我的梦染了个通透。 母亲稍来几筐海棠果子,...
    海棠一一阅读 343评论 0 2