Redis 是由意大利程序员 Salvatore Sanfilippo(昵称:antirez)开发的一款内存高速缓存数据库。Redis 全称为 Remote Dictionary Server(远程数据服务),使用 C 语言编写,是一个 key-value 存储系统,支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash等。
Redis 以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库,在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。
Redis 的应用非常广泛,可谓服务器中的一件利器,现在我们就来一步步学习 Redis 吧。
Redis 安装
Redis,一个开源的 key-value,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)。>
Redis 使用C语言开发,支持的客户端语言也非常丰富,如C、C#、C++、Object-C、PHP、Python、 Java、Perl、Lua等。Redis 支持 master-slave(主-从)模式应用,支持数据的持久化,可以将内存中的数据村春在硬盘中,重启、断电的时候并不会丢失数据。
下面列出11种Web应用场景,在这些场景下可以充分的利用Redis的特性,大大提高效率。
在主页中显示最新的项目列表
删除和过滤
排行榜及相关问题
按照用户投票和时间排序
过期项目处理
计数
特定时间内的特定项目
实时分析正在发生的情况,用于数据统计与防止垃圾邮件等
Pub/Sub
队列
缓存
一、Redis的安装
二、Redis的启动与基本操作
三、Redis的持久化方案
四、Redis集群的搭建
五、使用Java操作Redis
Redis 入门
Redis安装
服务管理
更改配置
基本操作
支持的数据类型
开启通知
开启远程登录连接
提供的原生监控
配置说明
Redis的使用难吗?不难,Redis用好容易吗?不容易。Redis的使用虽然不难,但与业务结合的应用场景特别多、特别紧,用好并不容易。我们希望通过一篇文章及Demo,即可轻松、快速入门并学会应用。
这篇 redis 学习笔记主要介绍 redis 的数据结构和数据类型,并讨论数据结构的选择以及应用场景的优化。
一、全局命令
二、针对key的操作
三、 Hash操作
四、列表List操作
五、Set操作(不可重复)
六、ZADD操作(有序集合)
七、pub/sub(发布、订阅)
八、Transaction(事务)
九、Connection(连接)
十、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本身会极大的节省储存空间。
Redis 应用
在构建一个系统时,我们常常需要记录当前发生的事情,以及记录特定消息出现的频率,根据出现频率的高低来决定消息的排列信息,帮助我们找到重要的信息。
常见记录日志的方法有两种:
将日志记录在文件中。随时时间流逝将日志行不断添加到文件里面,并在一段时间后创建新的日志文件。这种方式为每个不同的服务创建不同的日志,由于服务轮换日志的机制不同,也缺少一种能够方便地聚合所有日志并对其进行处理的常见方法。
syslog服务。这种服务几乎运行在Linux服务器和Unix服务器的514号TCP端口和UDP端口上。syslog接受其他程序发来的日志消息,并将这个消息路由至存储在硬盘上的各个日志文件,并且负责旧日志的轮换和删除工作。甚至还可以将日志消息转发给其他服务来做进一步的处理。
Redis的发布订阅功能由 PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。
通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道从而成为这些频道的订阅者(subscriber),当有其它客户端向被订阅的频道发送消息时,频道的所有订阅者都能收到这条消息。
需求:
(1)登录和cookie缓存
(2)使用redis实现购物车
(3)网页缓存
(4)数据行缓存
(5)网页分析
一个严格的排行榜,必须要满足每个人的排序都是有实际意义的,简单来说就是即使两个人的分数一样,那么也要分出先后来。
活动周期在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 微信服务号,获取最新讲堂及优惠信息。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。