Browsed by
标签:Redis

高性能短链设计

高性能短链设计

閱讀本文約花費: 17 (分鐘) 前言 今天,我们来谈谈如何设计一个高性能短链系统,短链系统设计看起来很简单,但每个点都能展开很多知识点,也是在面试中非常适合考察侯选人的一道设计题,本文将会结合我们生产上稳定运行两年之久的高性能短链系统给大家简单介绍下设计这套系统所涉及的一些思路,希望对大家能有一些帮助。 本文将会从以下几个方面来讲解,每个点包含的信息量都不少,相信大家看完肯定有收获 短链有啥好处,用长链不香吗短链跳转的基本原理短链生成的几种方法高性能短链的架构设计 注:里面涉及到不少布隆过滤器,snowflake 等技术,由于不是本文重点,所以建议大家看完后再自己去深入了解,不然展开讲篇幅会很长 短链有啥好处,用长链不香吗 来看下以下极客时间发我的营销短信,点击下方蓝色的链接(短链) 浏览器的地址栏上最终会显示一条如下的长链。 那么为啥要用短链表示,直接用长链不行吗,用短链的话有如下好外 1、链接变短,在对内容长度有限制的平台发文,可编辑的文字就变多了 最典型的就是微博,限定了只能发 140 个字,如果一串长链直接怼上去,其他可编辑的内容就所剩无几了,用短链的话,链接长度大大减少,自然可编辑的文字多了不少。 再比如一般短信发文有长度限度,如果用长链,一条短信很可能要拆分成两三条发,本来一条一毛的短信费变成了两三毛,何苦呢。另外用短链在内容排版上也更美观。 2、我们经常需要将链接转…

Read More Read More

Redis 分布式锁工具类

Redis 分布式锁工具类

閱讀本文約花費: 1 (分鐘) @Component public class RedisLock { private static final Long RELEASE_SUCCESS = 1L; private static final String LOCK_SUCCESS = “OK”; private static final String SET_IF_NOT_EXIST = “NX”; // 当前设置 过期时间单位, EX = seconds; PX = milliseconds private static final String SET_WITH_EXPIRE_TIME = “EX”; //lua private static final String RELEASE_LOCK_SCRIPT = “if redis.call(‘get’, KEYS[1]) == ARGV[1] then return redis.call(‘del’, KEYS[1]) else return 0 end”; @Autowired private StringRedisTemplate redisTemplate; /** 该加锁方法仅…

Read More Read More

Redis集群搭建详细与卡槽迁移遇到的坑

Redis集群搭建详细与卡槽迁移遇到的坑

閱讀本文約花費: 17 (分鐘) 前言 redis5.0.0之前操作 redis集群用的是 ruby写的脚本 redis-trib.rb,这样带来的弊端就是需要安装 ruby, gems环境,官方拉取的 docker镜像里是没有 redis-trib.rb等 ruby环境的,需要自己安装,在国内网络环境下还是比较费时复杂的,也不容易成功,而且最后制作的docker镜像也比较大。再者安装的 ruby、redis扩展版本不对,也会导致操作集群时,报各种各样的错误。 最重要的硬伤是 redis-trib.rb不能操作带密码的 redis集群,虽然 github上有人在 redis-trib.rb脚本基础上已经加了密码支持。但对于 move_slots的迁移卡槽相关的操作,我试了还是没加。可以查看以下的提交记录: Redis-Cluster: Add support to auth in redis-trib.rb #4288 redis5.0.0之后的 redis-cli可以直接操作 redis集群,可以支持带密码操作,可以说带来了很大的方便。但是在 redis4.0.7版本之前迁移卡槽本来就是不支持密码 auth参数的,以下命令中的 [AUTH password]是 redis4.0.7版本才支持。 MIGRATE host port key|”” destination-db tim…

Read More Read More

Linux运维需要知道的Redis经验

Linux运维需要知道的Redis经验

閱讀本文約花費: 8 (分鐘) Redis 在当前的技术社区里是非常热门的。从来自 Antirez 一个小小的个人项目到成为内存数据存储行业的标准,Redis已经走过了很长的一段路。随之而来的一系列最佳实践,使得大多数人可以正确地使用 Redis。 下面我们将探索正确使用 Redis 的10个经验。 1、停止使用 KEYS * Okay,以挑战这个命令开始这篇文章,或许并不是一个好的方式,但其确实可能是最重要的一点。很多时候当我们关注一个redis实例的统计数据,我们会快速地输入”KEYS *”命令,这样key的信息会很明显地展示出来。平心而论,从程序化的角度出发往往倾向于写出下面这样的伪代码: for key in’keys *’:doAllTheThings()  但是当你有1300万个key时,执行速度将会变慢。因为KEYS命令的时间复杂度是O(n),其中n是要返回的keys的个数,这样这个命令的复杂度就取决于数据库的大小了。并且在这个操作执行期间,其它任何命令在你的实例中都无法执行。 作为一个替代命令,看一下 SCAN 吧,其允许你以一种更友好的方式来执行… SCAN 通过增量迭代的方式来扫描数据库。这一操作基于游标的迭代器来完成的,因此只要你觉得合适,你可以随时停止或继续。 2、找出拖慢 Redis 的罪魁祸首 由于 Redis 没有非常详细的日志,要想知道在 Redis…

Read More Read More

Redis几个认识误区

Redis几个认识误区

閱讀本文約花費: 10 (分鐘) 转自:https://timyang.net/data/redis-misunderstanding/ Redis几个认识误区 Saturday, Dec 4th, 2010 by Tim | Tags: key value store, redis 前几天微博发生了一起大的系统故障,很多技术的朋友都比较关心,其中的原因不会超出James Hamilton在On Designing and Deploying Internet-Scale Service(1)概括的那几个范围,James第一条经验“Design for failure”是所有互联网架构成功的一个关键。互联网系统的工程理论其实非常简单,James paper中内容几乎称不上理论,而是多条实践经验分享,每个公司对这些经验的理解及执行力决定了架构成败。 题外话说完,最近又研究了Redis。去年曾做过一个MemcacheDB, Tokyo Tyrant, Redis performance test,到目前为止,这个benchmark结果依然有效。这1年我们经历了很多眼花缭乱的key value存储产品的诱惑,从Cassandra的淡出(Twitter暂停在主业务使用)到HBase的兴起(Facebook新的邮箱业务选用HBase(2)),当再回头再去看Redis,发现这个只有1万多行源代…

Read More Read More

The Little Redis Book in Chinese

The Little Redis Book in Chinese

閱讀本文約花費: 14 (分鐘) Wiki 数据库 Redis The Little Redis Book 中文版 基础知识 是什么使Redis显得这么特别?Redis具体能解决什么类型的问题?要实际应用Redis,开发者必须储备什么知识?在我们能回答这么一些问题之前,我们需要明白Redis到底是什么。 Redis通常被人们认为是一种持久化的存储器关键字-值型存储(in-memory persistent key-value store)。我认为这种对Redis的描述并不太准确。Redis的确是将所有的数据存放于存储器(更多是是按位存储),而且也确实通过将数据写入磁盘来实现持久化,但是Redis的实际意义比单纯的关键字-值型存储要来得深远。纠正脑海里的这种误解观点非常关键,否则你对于Redis之道以及其应用的洞察力就会变得越发狭义。 事实是,Redis引入了5种不同的数据结构,只有一个是典型的关键字-值型结构。理解Redis的关键就在于搞清楚这5种数据结构,其工作的原理都是如何,有什么关联方法以及你能怎样应用这些数据结构去构建模型。首先,让我们来弄明白这些数据结构的实际意义。 应用上面提及的数据结构概念到我们熟悉的关系型数据库里,我们可以认为其引入了一个单独的数据结构——表格。表格既复杂又灵活,基于表格的存储和管理,没有多少东西是你不能进行建模的。然而,这种通用性并不是没有缺点。具…

Read More Read More

Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

閱讀本文約花費: 13 (分鐘) 一、概念简介: Redis:   Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis,走了不少弯路,所以总结一条我认为不错的学习路径给大家:   1.《The Little Redis Book》 是一本开源PDF,只有29页的英文文档,看完后对Redis的基本概念应该差不多熟悉了,剩下的可以去Redis官网熟悉相关的命令。   2.《Redis设计与实现》 如果想继续深入,推荐这本书,现在已经出到第二版了,有纸质版书籍可以购买。上面详细介绍了Redis的一些设计理念,并且给出了一些内部实现方式,和数据结构的C语言定义,有一些基本C语言基础,就能看明白。   3.Redis 2.6源代码: 《Redis设计与实现》的作者发布在Github上的一个开源项目,有作者详细的注释。 https://github.com/huangz1990/annotated_redis_source Jedis:   Jedis是Redis官方推出的一款面向Java的客户端,提供了很多接口供Java语言调用。可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis、SRP等等,推荐使用Jedis。 Spring Data Redis …

Read More Read More

Redis-SCAN-功能

Redis-SCAN-功能

閱讀本文約花費: 2 (分鐘) 主要参考这两篇: http://blog.csdn.net/u011510825/article/details/51859656 http://redis.io/commands/scan 实验如下: $ redis-cli -h [host] -p 8379 > smembers myset 1) “one” 2) “two” > sscan myset o* (error) ERR invalid cursor > sscan myset 0 match o* 1) “0” 2) 1) “one” > sscan myset 0 match * 1) “0” 2) 1) “one” 2) “two” > sscan myset 0 match * count 1 1) “2” 2) 1) “one” > sscan myset1 0 match “{‘i’: ‘[1-9][0-9][0-9]*’}” 1) “0” 2) 1) “{‘i’: ‘990’, ‘i2’: ‘991’}” 上面有几点需要解释一下。 1. 获取set的命令需要使用 smember。更多的命令列表参考: http://www.runoob.com/redis/redis-sets.html Redis 集合命令 下表列出了 Redis 集…

Read More Read More

redis的scan操作

redis的scan操作

閱讀本文約花費: 2 (分鐘) redis系列 redis的发布订阅功能 redis消息队列 redis的pipeline redis的scan操作 序 在redis的db存在大量key或者db里头的某个set、zset、hash里头的元素非常多的话,用普通的get all操作很可能导致redis因为这个操作阻塞了,导致不能响应其他操作,特别是在高并发、海量数据的背景下,这个问题显得尤其严重。那么能不能像数据库那样有个分页的功能呢,答案就是scan操作。本文主要展示怎么在redis-cli以及SpringDataRedis中的使用。 scan语法 scan之后返回两部分,第一部分是下次scan的参数,第二部分就是scan出来的项 作用对象(db、set、zset、hash) db(key) 127.0.0.1:6379> scan 0 1)”120″ 2) 1)”articleMap:63″ 2)”articleMap:37″ 3)”counter:__rand_int__” 4)”articleMap:60″ 5)”tagSet:tag5″ 6)”articleMap:80″ 7)”messageCache~keys” 8)”mymap” 9)”articleMap:46″ 10)”articleMap:55″ 127.0.0.1:6379> scan 120 1)”…

Read More Read More