本文旨在介绍一些 Redis 的高级用法。
互联网应用通常都需要应付大并发量,为了提高 QPS,通常会使用中央缓存 (例如 memcache) 和本地缓存的方式。请求先经过本地缓存,如果不命中,则请求穿透到中央缓存,如果还是不命中,则会直接查询数据库,并把查询到的数据刷新到中央缓存中。如果采用这种方式的话,必须要解决一个问题,如何刷新本地缓存的数据。
如何使用缓存,怎么才能更加合理?今天的话题,结合我之前的项目场景,讨论下使用缓存合理性问题。
本文是《Redis 内部数据结构详解》系列的第六篇。在本文中,我们围绕一个 Redis 的内部数据结构——skiplist 展开讨论。 Redis 里面使用 skiplist 是为了实现 sorted set 这种对外的数据结构。sorted set 提供的操作非常丰富,可以满足非常多的应用场景。…
目前实现分布式锁的方式主要有数据库、Redis和Zookeeper三种,本文主要阐述利用Redis的相关命令来实现分布式锁。
2011 年,当初选择 Redis 作为主要的内存数据存储,主要吸引我的是它提供多样的基础数据结构可以很方便的实现业务需求。另一方面又比较担心它的性能是否足以支撑,毕竟当时 Redis 还属于比较新的开源产品。但 Redis 官网宣称其是提供多数据结构的高性能存储,我们对其还是…
Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Redis是当今十分主流的分布式key-value型数据库,在web开发中,我们常用它来缓存数据库的查询结果。
既然 Redis 客户端已经这么丰富了,为什么还要尝试自己编写客户端?我的看法是,知己知彼,自己尝试制作 Redis 客户端,不仅可以加深对 Redis 的了解,而且可以通晓 Redis 客户端的原理,为今后的更好地使用、乃至定制改造 Redis 作好充分准备。
Redis 是一个复杂而又设计优良的系统,说它复杂是因为整个系统涉及到了很多方面的问题,比如:哈希存储、网络模型、集群特性等等。说它设计优良是因为这些问题它都提供了深思熟虑的解决方案。
我们花大量的时间学习一个技术,不仅为了能更好的使用它,同时希望学习它设计上的一些思路,这样在解决日常工作碰到的各种各样的问题的时候思路会更开阔。以下是对 Redis 一小部分内部机制的思考与总结。
Redis 作为目前最流行的 KV 内存数据库,也实现了自己的 LRU
(Latest Recently Used
)算法,在内存写满的时候,依据其进行数据的淘汰。但是,Redis
为了节省内存使用,和通常的 LRU 算法实现不太一样,Redis 使用了采样的方法来模拟一个 近似 LRU
算法。
QPS,每秒处理请求数。可以在一定程度上反映某个服务此时的压力情况。下面可以通过一个案例来分析下如何大致的估算一个服务的QPS。 背景:昨天上线的一个活动,会根据唱歌时间来进行送券行为,计算下此送券行为的QPS。 分析:每隔送券行为都会有一条日志进行记录,如下。 因此计算出每秒…
比较全的 Redis 的集群方案
如今,互联网业务的数据正以更快的速度在增长,数据类型越来越丰富,这对数据处理的速度和能力提出了更高要求。Redis 是一种开源的内存非关系型数据库,给开发人员带来的体验是颠覆性的。在自始至终的设计过程中,都充分考虑高性能,这使得 Redis 成为当今速度最快的 NoSQL 数据库。
当 redis 出现故障时,DBA 应在尽可能短时间内发现告警;如果故障对服务是有损的 (如大面积网络故障或程序 BUG),需立即通知 SRE 和 RD 启用故障预案 (如切换机房或启用 emergency switch)止损。
如果没完善监控告警; 假设由 RD 发现服务故障,再排查整体服务调用链去定位;甚于用户发现用问题,通过客服投诉,再排查到 redis 故障的问题;整个 redis 故障的发现、定位和解决时间被拉长,把一个原本的小故障被” 无限” 放大。利用多写 Redis 实现分布式锁原理与实现分析
从源码角度学习了解Redis的主从复制。为了提高性能和系统可用,Redis都会做主从复制,一来可以分担主库压力,二来在主库挂掉的时候从库依旧可以提供服务。Redis的主从复制是异步复制,返回结果给客户端和同步命令到从库是两回事,互不相干,主库也不关心从库的执行结果,对于同步命令执行的结果,从库会直接丢弃并不返回给主库。Redis的主从复制简单高效,但也不太算可靠。
Redis 服务器支持 LUA 脚本,通过如下命令行在服务器执行一段 lua 脚本:
redis-cli –eval exp.lua -h host_ip
Redis 服务端实现了 LUA 沙盒机制,屏蔽了 LUA 的 OS、文件操作等部分危险函数调用,但是未过滤 loadstring 函数,参考 Lua 虚拟机逃逸文档,即可实现 Redis 服务器内存读写操作,进而达成代码执行目的,本文操作测试环境 Ubuntu 14.04 x64 + Redis2.8.20
本篇博客主要介绍了 Lua 语言不一样的设计模型(相比于Java/C/C++、JS、PHP), 以及 Redis 对 Lua 的扩展, 最后结合 Lua 与 Redis 实现了一个支持过期时间的分布式锁. 我们希望这篇博客的读者朋友可以在读完这篇文字之后, 体会到 Lua 这门语言不一样的设计哲学, 以及 更加得心应手的使用/扩展 Redis.
摘要: 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。
如果我们决定要将 Redis 用作应用程序唯一的数据存储手段的话,那么就必须确保 Redis 不会丢失任何数据。跟提供了 ACID(原子性 atomicity,一致性 consistency,隔离性 isolation,耐久性 durability,如果一个数据库想要实现可靠的数据事务,那么它就必须保证 ACID 性质)保证的传统关系数据库不同,在使用 Redis 为后端构建应用程序的时候,我们需要多做一些工作才能保证数据的一致性。
当 Redis 被当做缓存来使用,当你新增数据时,让它自动地回收旧数据是件很方便的事情。这个行为在开发者社区非常有名,因为它是流行的 memcached 系统的默认行为。
LRU 是 Redis 唯一支持的回收方法。本页面包括一些常规话题,Redis 的 maxmemory 指令用于将可用内存限制成一个固定大小,还包括了 Redis 使用的 LRU 算法,这个实际上只是近似的 LRU。最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容进行简单的整理。 几种 I/O 模型 为什么 Redis 中要使用 I/O…
R2M 是京东金融线上大规模应用的分布式缓存系统,目前管理的机器总内存容量超过 60TB,近 600 个 Redis Cluster 集群,9200 多个 Redis 实例。
Redis 事务与关系型数据库事务有哪些区别?有哪些缺陷?如何解决?
该应用场景为 DMP 缓存存储需求,DMP 需要管理非常多的第三方 id 数据,其中包括各媒体 cookie 与自身 cookie(以下统称 supperid)的 mapping 关系,还包括了 supperid 的人口标签、移动端 id(主要是 idfa 和 imei)的人口标签,以及一些黑名单 id、ip 等数据。
redis是一个基于内存的K-V存储数据库。支持存储的类型有string,list,set,zset(sorted set),hash等。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。redis支持各种不同方…
一些内存数据结构比其他数据结构来得更高效;如果充分利用 Redis,Spark 运行起来速度更快。
在 redis 的 db 存在大量 key 或者 db 里头的某个 set、zset、hash 里头的元素非常多的话,用普通的 get all 操作很可能导致 redis 因为这个操作阻塞了,导致不能响应其他操作,特别是在高并发、海量数据的背景下,这个问题显得尤其严重。那么能不能像数据库那样有个分页的功能呢,答案就是 scan 操作。本文主要展示怎么在 redis-cli 以及 SpringDataRedis 中的使用。
一般会使用setnx来实现锁的功能,解决资源竞争、缓存风暴等问题。例如,在缓存风暴中,没有锁保护的情况下,缓存失效,会导致短时间内,多个请求透过缓存到达数据库,请求同一份数据,修改同一份缓存;如果使用了锁,可以让获得锁的请求到达数据库,请求数据后回写缓存,后续没有得到锁的就直接读取新的缓存数据,而不用请求数据库了。
随着业务发展和数据积累,你的 Redis 服务器变得越来越臃肿了,甚至内存爆满影响了业务,那么它是如何一步一步走到这个地步,又如何解决呢?希望本文能帮助到你。作为一个内存型数据库,Redis 经常会遇…
通过一个例子告诉你如何利用 Redis 黑进系统,虽然漏洞已经修复但是不妨碍我们围观。
最近对开源分布式缓存产品 redis 做了一些研究,于是决定整理一下该产品的特性及使用场景拿出来分享。
从几个方面进行两者的实现对比
缓存使用总结
Redis作为一款性能优异的内存数据库,在互联网公司有着多种应用场景,下面介绍下Redis在京东到家的订单列表中的使用场景。