Redis 是由意大利程序员 Salvatore Sanfilippo(昵称:antirez)开发的一款内存高速缓存数据库。Redis 全称为 Remote Dictionary Server(远程数据服务),使用 C 语言编写,是一个 key-value 存储系统,支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash等。前端
Redis 之内存做为数据存储介质,因此读写数据的效率极高,远远超过数据库,在服务器中经常使用来存储一些须要频繁调取的数据,这样能够大大节省系统直接读取磁盘来得到数据的I/O开销,更重要的是能够极大提高速度。node
Redis 的应用很是普遍,可谓服务器中的一件利器,如今咱们就来一步步学习 Redis 吧。nginx
Redis,一个开源的 key-value,内存中的数据结构存储系统,它能够用做数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)。>redis
Redis 使用C语言开发,支持的客户端语言也很是丰富,如C、C#、C++、Object-C、PHP、Python、 Java、Perl、Lua等。Redis 支持 master-slave(主-从)模式应用,支持数据的持久化,能够将内存中的数据村春在硬盘中,重启、断电的时候并不会丢失数据。sql
下面列出11种Web应用场景,在这些场景下能够充分的利用Redis的特性,大大提升效率。编程
在主页中显示最新的项目列表segmentfault
删除和过滤浏览器
排行榜及相关问题
按照用户投票和时间排序
过时项目处理
计数
特定时间内的特定项目
实时分析正在发生的状况,用于数据统计与防止垃圾邮件等
Pub/Sub
队列
缓存
1、Redis的安装
2、Redis的启动与基本操做
3、Redis的持久化方案
4、Redis集群的搭建
5、使用Java操做Redis
Redis安装
服务管理
更改配置
基本操做
支持的数据类型
开启通知
开启远程登陆链接
提供的原生监控
配置说明
Redis的使用难吗?不难,Redis用好容易吗?不容易。Redis的使用虽然不难,但与业务结合的应用场景特别多、特别紧,用好并不容易。咱们但愿经过一篇文章及Demo,便可轻松、快速入门并学会应用。
这篇 redis 学习笔记主要介绍 redis 的数据结构和数据类型,并讨论数据结构的选择以及应用场景的优化。
1、全局命令
2、针对key的操做
3、 Hash操做
4、列表List操做
5、Set操做(不可重复)
6、ZADD操做(有序集合)
7、pub/sub(发布、订阅)
8、Transaction(事务)
9、Connection(链接)
10、Server(服务器)
配置文件
redis持久化
主从复制
sentinel 主从切换
场景说明:
用于处理比较耗时的请求,例如批量发送邮件,若是直接在网页触发执行发送,程序会出现超时
高并发场景,当某个时刻请求瞬间增长时,能够把请求写入到队列,后台在去处理这些请求
抢购场景,先入先出的模式
redis在年初发布了3.0.0,官方支持了redis cluster,也就是集群。redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每一个节点都是平等的关系,都是对等的,每一个节点都保存各自的数据和整个集群的状态。每一个节点都和其余全部节点链接,并且这些链接保持活跃,这样就保证了咱们只须要链接集群中的任意一个节点,就能够获取到其余节点的数据。
这篇文章主要介绍了Redis中5种数据结构的使用场景介绍,本文对Redis中的5种数据类型String、Hash、List、Set、Sorted Set作了讲解,须要的朋友能够参考下。
经过详细地阅读sds的源码,不只学习到sds的实现细节,还学习到了一些经常使用字符串操做函数的实现。若是只是仅仅看看数据结构的定义也能够初步了解,可是要深刻了解的话仍是须要详细的阅读具体函数的实现代码。仍是那句,写代码的,须要阅读更多代码来加强灵感。
Redis做为一个内存型数据库,一样支持传统数据库的事务特性。这篇文章会从源代码角度来分析Redis中事务的实现原理。
What
How
Why
Other
几乎全部的主流编程语言都有Redis的客户端(http://redis.io/clients),不考虑Redis很是流行的缘由,若是站在技术的角度看缘由还有两个:
客户端与服务端之间的通讯协议是在 TCP 协议之上构建的。
客户端和服务器经过 TCP 链接来进行数据交互, 服务器默认的端口号为 6379 。
客户端和服务器发送的命令或数据一概以 rn (CRLF)结尾。
Redis制定了 RESP(REdis Serialization Protocol,Redis序列化协议)实现客户端与服务端的正常交互,这种协议简单高效,既可以被机器解析,又容易被人类识别。
Redis提供了redis-cli、redis-server、redis-benchmark等Shell工具。它们虽然比较简单,可是麻雀虽小五脏俱全,有时能够很巧妙地解决一些问题。
查看客户端列表
获取/设置名称
客户端限制
关闭客户端
阻塞客户端
客户端回复设定
监控
其余配置
源码查看
INFO
做为一款开源的 Redis 图形化监控工具,RedisLive 提供对 Redis 实例的内存使用状况,接收的客户端命令,接收的请求数量以及键进行监控。RedisLive 的工做原理基于 Redis 的 INFO 和 MONITOR 命令,经过向 Redis 实例发送 INFO 和 MONITOR 命令来获取 Redis 实例当前的运行数据。
缓存
会话缓存
时效性
访问频率
计数器
社交列表
记录用户断定信息
交集、并集和差集
热门列表与排行榜
最新动态
消息队列
redis等nosql简单高效的解决了高并发场景下的一系列问题,并很大程度的解放了持久化DB的业务压力。
实现:
基于redis字符串string类型的简单缓存实现
基于redis列表list类型的简单队列实现
基于redis字符串setnx的悲观锁实现
基于redis事务的乐观锁实现
基于redis的发布订阅实现
你是否也困在redis,知其然不知其因此然~~ 项目中,到底怎么用?? 一个简单的实例,使用消息队列实现下yii异步发送邮件。
准备工做
同步与异步
邮件发送
涉及抢购、秒杀、抽奖、抢票等活动时,为了不超卖,那么库存数量是有限的,可是若是同时下单人数超过了库存数量,就会致使商品超卖问题。那么咱们怎么来解决这个问题呢?
获取最新插入的100记录
最近几天拜读了Josiah L. Carlson的《Redis in Action》,对Redis有了更深刻的理解。不禁感叹它真是应了”重剑无锋,大巧不工“。几种简单的数据结构,不一样的组合与运用,居然能够优雅的解决各类项目中常见的需求,甚至独立的支持不少应用的存储与业务逻辑。
这是接下来要写的一系列Redis文章的第一篇,介绍基本数据结构、持久化与事务,以及关于Redis性能的测试。
原子性是数据库的事务中的特性。在数据库事务的情景下,原子性指的是:一个事务(transaction)中的全部操做,要么所有完成,要么所有不完成,不会结束在中间某个环节。【维基百科】
对于Redis而言,命令的原子性指的是:一个操做的不能够再分,操做要么执行,要么不执行。
配置 Redis
安装 ruby
安装 rubygems
安装配置集群管理
[ERR] Sorry, can't connect to node 127.0.0.1:6370
测试
Java Jedis 访问
许多存储系统(如:MySQL)提供慢查询日志帮助开发与运维人员定位系统存在的慢操做.所谓慢查询日志就是系统在命令执行先后计算每条命令的执行时间,当超过预设阈值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录到慢查询日志中,Redis也提供了相似的功能.
搭建Tomcat集群&经过Redis缓存共享session的一种流行方案
若是有一个Tomcat集群都能访问的公共session存取区就行了,基于这个概念,咱们想到了使用Redis来作这个session公共存取区,这样子的话就有一个统一管理回话的地方了。
持久化Tomcat Session到Redis中
nginx反向代理的负载均衡
基于sentinel的redis集群搭建
如何实现从 Redis 中订阅消息转发到 WebSocket 客户端
PHP 的redis扩展是阻塞式 IO ,使用订阅/发布模式时,会致使整个进程进入阻塞。所以必须使用SwooleRedis异步客户端来实现。
首先要明确session和cookie的区别。浏览器端存的是cookie每次浏览器发请求到服务端是http 报文头是会自动加上你的cookie信息的。服务端拿着用户的cookie做为key去存储里找对应的value(session).
同一域名下的网站的cookie都是同样的。因此不管几台服务器,不管请求分配到哪一台服务器上同一用户的cookie是不变的。也就是说cookie对应的session也是惟一的。
因此,这里只要保证多台业务服务器访问同一个redis服务器(或集群)就好了。
缓存能够说是无处不在,好比 PC 电脑中的内存、CPU 中的二级缓存、HTTP 协议中的缓存控制、CDN 加速技术都是使用了缓存的思想来解决性能问题。
缓存是用于解决高并发场景下系统的性能及稳定性问题的银弹。
本文主要是讨论咱们常用的分布式缓存 Redis 在开发过程当中的相关思考。
做为目前做为流行的cash,redis除了支持丰富的数据类型以外,还支持对内存中u数据的持久化,这样一来即可以防止由于一些崩溃状况(忽然间断电、内存吃满)形成的整个内存数据的丢失,这对咱们来讲无疑是巨大的帮助。这里咱们简单的了解一下redis持久化的策略。
redis实现数据持久化的两种策略:
rdb(redis database)-- 快照持久化
aof(append only file ) -- 只追加文件持久化
Redis集群是一个distribute、fault-tolerant的Redis实现,主要设计目标是达到线性可扩展性、可用性、数据一致性。
在Redis中咱们常常用到set,get等命令,细心的你有没有发现,还有几个类似的命令叫setbit,getbit,它们是用来干吗的?
BitMap是什么?就是经过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素自己。咱们知道8个bit能够组成一个Byte,因此bitmap自己会极大的节省储存空间。
在构建一个系统时,咱们经常须要记录当前发生的事情,以及记录特定消息出现的频率,根据出现频率的高低来决定消息的排列信息,帮助咱们找到重要的信息。
常见记录日志的方法有两种:
将日志记录在文件中。随时时间流逝将日志行不断添加到文件里面,并在一段时间后建立新的日志文件。这种方式为每一个不一样的服务建立不一样的日志,因为服务轮换日志的机制不一样,也缺乏一种可以方便地聚合全部日志并对其进行处理的常见方法。
syslog服务。这种服务几乎运行在Linux服务器和Unix服务器的514号TCP端口和UDP端口上。syslog接受其余程序发来的日志消息,并将这个消息路由至存储在硬盘上的各个日志文件,而且负责旧日志的轮换和删除工做。甚至还能够将日志消息转发给其余服务来作进一步的处理。
Redis的发布订阅功能由 PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。
经过执行SUBSCRIBE命令,客户端能够订阅一个或多个频道从而成为这些频道的订阅者(subscriber),当有其它客户端向被订阅的频道发送消息时,频道的全部订阅者都能收到这条消息。
需求:
(1)登陆和cookie缓存
(2)使用redis实现购物车
(3)网页缓存
(4)数据行缓存
(5)网页分析
使用Redis Zset来处理活动经常使用排行榜(精确排行)
一个严格的排行榜,必需要知足每一个人的排序都是有实际意义的,简单来讲就是即便两我的的分数同样,那么也要分出前后来。
活动周期在92天之内的话,那么咱们就可使用200w加活动结束时间做为数字A来保证排行榜的顺序正确。
废话很少说,首先分享一个业务场景-抢购。一个典型的高并发问题,所需的最关键字段就是库存,在高并发的状况下每次都去数据库查询显然是不合适的,所以把库存信息存入Redis中,利用redis的锁机制来控制并发访问,是一个不错的解决方案。
这是某购物网站的搜索条件:搜索总共分为6大类,每大类中又分了各个子类。这中间,各大类条件之间是取的交集,各子类中有单选、多选、以及自定义的状况,最终输出符合条件的结果集。
若是让你实现这样的一个搜索接口,你会如何实现?
Redis当然很赞,切记当你手上有一把锤子的时候,看全部的东西都是钉子,理解他,用好他。
运营研发-场景:
武器一览
CMS页面缓存
API限速器
性能分析
API状态统计
CMS智能提醒-异常线路
Redis做为一款性能优异的内存数据库,在互联网公司有着多种应用场景,下面介绍下Redis在京东到家的订单列表中的使用场景。主要从如下几个方面来介绍:
订单列表在Redis中的存储结构
Redis和DB数据一致性保证
Redis中的分布式锁
缓存防穿透和雪崩
本文翻译整理自 Andy Grunwald 发布的一篇文章,写的是做者所在公司使用 Redis 时遇到的问题,以及处理过程,在不断解决调整中积累了不少 Redis 的使用经验。
问题描述:
用户量快速增加,访问量在短期内翻倍,因为前期容量规划作得比较好,硬件资源能够支撑,但是软件系统方面出现了大问题:
40% 的请求都会返回 HTTP 500: Internal Server Error
经过查看日志,发现错误是在 PHP <-> Redis 的链接处理上
使用 阿里巴巴 Canal 增量订阅&消费组件 同步 MySQL 数据到 Redis
早期,阿里巴巴B2B公司由于存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变动,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变动进行同步,由此衍生出了增量订阅&消费的业务,今后开启了一段新纪元。
业务的基本说明
运营评估最高的并发会达到 10W(根据推广的力度,以及以往的经验)
业务现有的服务器架构 反向代理 4台,前端机 8台, db 2台(主从),redis 2台(主从)。
本期完
:)
欢迎关注 SegmentFault 微信服务号,获取最新讲堂及优惠信息。