自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

冷炎嗄的博客

慢爬的蜗牛

  • 博客(39)
  • 收藏
  • 关注

转载 独立功能的实现----------02慢查询日志和监视器

Redis的慢查询日志(先进先出的定长队列)用于记录执行超过给定时长的命令请求,服务器配置有两个和慢查询日志相关的选项:slowlog-log-slower-tan 指定超过多少秒会被记录到日志上 slowlog-max-len 指定服务器最多保存多少条 客户端发送MONITOR命令让普通客户端成为监视器...

2018-08-31 15:07:03 117

转载 独立功能的实现----------01排序

1.SORT:SORT <key> [ASC ,DESC,ALPHA,LIMIT,STORE,BY,GET]SORT对值进行排序redis>RPUSH number 3 1 2(integer) 3redis>SORT number1) "1"2) "2"3) "3"使用ALPHA选项,SORT <key> ALPHA 对对字符串的..

2018-08-31 14:57:38 97

转载 多机数据库的实现----------03集群

通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。Redis是一个很好的Cache工具。大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿。由于内存大小的限制,使用一台 Redis 实例显然无法满足需求,这时就需要使用 多台 Redis (集群)作为缓存数据库。才能在用户请求时快速的进行响应。 Redis集群是Redis提供的分布式数据库...

2018-08-31 14:35:13 306

转载 多机数据库的实现----------02Sentinel(哨兵)

Sentinel是Redis的高可用性的解决方案:有一个或多个Sentinel实例组成的系统可以监视任意多个主服务器和下属从服务器,当主服务器下线时(超过设置的时间),会自动选中一个从服务器变成主服务器,当原先的主服务器上线时,变成现在主服务器的从服务器Sentinel本质上就是运行在特殊环境下的Redis服务器,没有RDB和AOFSentinel会默认以10秒一次的频率向主服...

2018-08-31 13:54:16 246

转载 多机数据库的实现----------01复制(主从服务器)

redis的复制功能包括:同步和命令传播同步:是将从服务器的数据库状态更新与主服务器当前所处的数据库状态 命令传播:当主服务器的数据库状态被修改,导致主从不一致,让主从重新一致同步:当客户端向服务器发送slaveof命令,(假设现在有127.0.0.1:12345和127.0.0.1:6379两个服务器)127.0.0.1:12345>SLAVEOF 127.0.0.1 63...

2018-08-31 11:51:07 176

转载 单机数据库的实现----------04事件

1.文件事件:使用i/o多路复用假设一个redis客户端发起连接,那么监听嵌套字将产生AE_READABLE事件,触发应答处理器,处理器对客户端的连接请求进行应答,然后创建客户端嵌套字及客户端状态,并将嵌套字的AE_READABLE事件与命令请求处理器关联,然后客户端向服务器发送命令请求(嵌套字) 当客户端尝试读取命令回复时,触发命令回复处理器,当命令客户端嵌套字的AE_WRITABLE...

2018-08-31 10:59:24 625

转载 单机数据库的实现----------03AOF

与RDB通过记录数据库的键值对来记录数据库状态不同,AOP持久化是通过保存Redis服务器执行的命令AOP持久化的实现分为命令追加(append),文件写入,文件同步三个步骤服务器执行往一个命令后,会追加到aop_buf缓冲区的末尾在现代操作系统中,当用户调用write函数将数据写入文件中,通常会保存在内存缓冲区中,等到缓冲区满,或超过指定时间才真正写入磁盘数据库只要重启的时候...

2018-08-31 09:06:34 206 1

转载 单机数据库的实现----------02RDB持久化

redis是内存型数据库,如果不将数据库的存储在磁盘中,一旦服务器退出,则所有数据丢失Redis使用SAVE和BGSAVE生成RDB文件区别save会阻塞reids服务器进程,直到RDB文件创建完毕,服务器不能处理任何命令 gbsave会派出子进程进行处理(因此会有个缓冲区,记录开始bgsave后的所有操作,等复制完毕后,再根据这些命令修改RDB文件)服务器启动时,会自动检测是否有...

2018-08-31 09:06:29 458

转载 单机数据库的实现----------01数据库

可以使用select +数值来切换数据库redis>select 1OK数据库使用过期字典来记录过期时间和对象过期的删除策略1.定时删除:在设置过期的时候,创建一个定时器(浪费cpu时间)2.惰性删除,过期时间不管,每次取键时,判断是否过期(浪费内存,如果有大量的key过期但是没有被访问到,会导致内存泄漏)3.定期删除,每个一段时间,程序自动检测red...

2018-08-31 09:06:24 1257

转载 01----------I/O多路复用

前言当我们要编写一个echo服务器程序的时候,需要对用户从标准输入键入的交互命令做出响应。在这种情况下,服务器必须响应两个相互独立的I/O事件:1)网络客户端发起网络连接请求,2)用户在键盘上键入命令行。我们先等待哪个事件呢?没有哪个选择是理想的。如果在acceptor中等待一个连接请求,我们就不能响应输入的命令。类似地,如果在read中等待一个输入命令,我们就不能响应任何连接请求。针对这种困...

2018-08-31 09:06:00 111

转载 数据结构和对象----------07对象

redis使用前面的数据结构构建了5中对象(redis5.0以前),字符串对象,列表对象,哈希对象,集合对象,有序集合对象对象的定义对象的类型对象的命令输出对象的编码5种对象的命名实现   重点总结:redis的每个键值对的键和值都是对象 reid总共有5种类型的对象,每种类型的对象至少有两种或以上的编码方式(即实现...

2018-08-30 15:59:04 165

转载 数据结构与对象----------06压缩列表

zlbytes:占4个字节,记录整个压缩列表占用的内存字节数。 zltail_offset:占4个字节,记录压缩列表尾节点entryN距离压缩列表的起始地址的字节数。 zllength:占2个字节,记录了压缩列表的节点数量。 entry[1-N]:长度不定,保存数据。 zlend:占1个字节,保存一个常数255(0xFF),标记压缩列表的末端。假设这是一个压缩列表的头两个节点,因此:...

2018-08-30 15:32:38 109

转载 数据结构与对象----------05整数集合

整数集合是只包含整数值的集合

2018-08-30 15:03:22 94

转载 数据结构与对象----------04跳跃表

跳跃表:redis只在两个地方用到了跳跃表,一个式有序集合键,另一个是在集群节点用作内部数据结构下面给出跳跃表的图:redis中的跳跃表 实际上没什么大的区别,只是为了方便,保存了一些信息header:指向跳跃表的表头节点tail:指向跳跃表的表尾节点level。记录跳跃表最大的那个节点的层数(redis中最高有64层,那么实际上要找到一个数,只需要从当前记录的...

2018-08-30 14:55:41 117

转载 数据结构与对象----------03字典

也就是说字典用hash实现,在正常的hash的数组中,每个数对应的hash值,存放的就是一条链表而字典在数组和链表中存储了一个dictEntry,相当于在计算出hash值后,还要计算出索引值,才能往对应的链表中插入数据注意:插入的时候总是插入在链表的最前面,这样就不用遍历链表字典注意被应用在数据库和哈希键redis中每个字典带有两个哈希表,一个平时使用,一个仅在rehash(渐...

2018-08-30 14:23:23 118

转载 数据结构与对象----------02链表

 链表在Redis中应用非常广泛,比如列表键的底层实现之一就是链表,还有发布订阅,慢查询,监视器等也用到了链表  

2018-08-30 13:47:55 117

转载 数据结构与对象---------01字符串

再Redis中,字符串是由SDS实现的例如:redis>SET msg "hello world"OK那么Redis将再数据库中创建一个新的键值对,其中:键值对的键是一个字符串的对象,底层实现的保存着字符串“msg”的SDS键值对的值也是一个字符串对象,底层实现的保存着字符串“hello world”的SDSSDN的定义:对比C字符串,SDS具有以下优点:...

2018-08-30 11:50:27 116

转载 08----------懒惰删除

一直以来我们认为 Redis 是单线程的,单线程为 Redis 带来了代码的简洁性和丰富多样的数据结构。不过Redis内部实际上并不是只有一个主线程,它还有几个异步线程专门用来处理一些耗时的操作。Redis 为什么要懒惰删除(lazy free)?删除指令 del 会直接释放对象的内存,大部分情况下,这个指令非常快,没有明显延迟。不过如果删除的 key 是一个非常大的对象,比如一个包含了千...

2018-08-30 10:27:39 765

转载 07----------过期策略

Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除。1.定期检查:edis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key2.惰性策略:在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除定时删除是集中处理,惰性删除是零散处理。Redis 默认会每秒进行十次过期扫描...

2018-08-30 10:12:37 154

转载 06----------再谈分布式锁(使用Redlock算法)

分布式锁的原理,它的使用非常简单,一条指令就可以完成加锁操作。不过在集群环境下,这种方式是有缺陷的,它不是绝对安全的。比如在 Sentinel 集群中,主节点挂掉时,从节点会取而代之,客户端上却并没有明显感知。原先第一个客户端在主节点中申请成功了一把锁,但是这把锁还没有来得及同步到从节点,主节点突然挂掉了。然后从节点变成了主节点,这个新的节点内部没有这个锁,所以当另一个客户端过来请求加锁时,立...

2018-08-30 10:06:10 2518

转载 05----------PubSub 发布订阅(消息多播,但由于自己的缺点,并未被使用)

PubSub 缺点:PubSub 的生产者传递过来一个消息,Redis 会直接找到相应的消费者传递过去。如果一个消费者都没有,那么消息直接丢弃。如果开始有三个消费者,一个消费者突然挂掉了,生产者会继续发送消息,另外两个消费者可以持续收到消息。但是挂掉的消费者重新连上的时候,这断连期间生产者发送的消息,对于这个消费者来说就是彻底丢失了。 如果 Redis 停机重启,PubSub 的消息是不会持久...

2018-08-29 20:54:05 1666

原创 04----------redis事务

首先说明,redis事务只满足了隔离性,隔离性中的串行化——当前执行的事务有着不被其它事务打断的权利。1. 命令无法排队(外表错误;): 命令参数数量错误,或者命令不存在等,导致无法排队。2.6.5 之前版本会导致其余有效命令正常执行,2.6.5之后的版本一旦遇到无法排队错误,会拒绝执行整个事务的所有语句;2. 调用Esec后发现的错误(执行期间错误): 一般由于对错误的Key或Val执行...

2018-08-29 20:37:41 136

原创 03---------- Redis常见性能问题和解决方案:

 Redis常见性能问题和解决方案:(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件;(Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照;AOF文件过大会影响Master重启的恢复速度)(2) 如果数据比较重要,某个Slave开启...

2018-08-29 20:12:54 695

转载 02----------为什么说redis是单线程

1.首先说明并发和并行的区别:通俗点说 并发就是不同线程同时干一件事情并行就是不同线程同时干不同的事情2.Redis不存在线程安全问题? Redis采用了线程封闭的方式,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有...

2018-08-29 20:12:28 137

转载 01----------Redis分布式锁的正确实现方式(Java版)

 前言分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。可靠性首先,为了确保分布式锁可用,我们至少要确...

2018-08-29 14:55:21 73

原创 09----------数学公式验证码

1.添加生成验证码的接口2.在获取路径时,验证验证码3.ScrptEngine使用(jdk1.6以上可用)1.生成类似3-4*6的验证码//使用画板,验证码生成图片,放入redis后返回public BufferedImage createVerifyCode(MiaoshaUser user, long goodsId) { if(user == null || good...

2018-08-29 09:34:54 698

原创 08----------"秒杀"接口优化

1.Redis预减库存减少服务器访问2.内存标记减少Redis访问3.请求先入队缓冲,异步下单,增强用户体验4.RabbitMQ安装与SpringBoot集成5.Nginx水平拓展6.数据库分库分表(mycat)1.解决超卖问题   1)数据库加唯一索引,防止秒杀期间用户重复购买    2)sql加库存数量判断,防止库存变为负数减少数据库访问:    1)系...

2018-08-29 09:13:21 149

原创 09---------RabbitMq的四种交换机模式

首先要导入依赖<!-- 添加rabbitmq依赖 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-amqp</artifactI...

2018-08-28 19:29:22 549

原创 07----------优化访问速率(页面缓存)

1.页面缓存+URL缓存+对象缓存2.页面静态化,前后端分离3.静态资源优化4.cdn优化一.SpringBoot实现页面缓存 @ResponseBody @RequestMapping(value="/to_list",produces="text/html") public String list(HttpServletRequest request,HttpServ...

2018-08-27 20:24:28 375

原创 在myeclipse中使用maven打包springboot项目,并防止于tomcat运行

1.在pom.xml加入配置文件,其中的1.8为自己的jdk版本<!--因配置外部TOMCAT 而配置 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot...

2018-08-27 16:25:55 1766

原创 05----------高并发下的数据库表或者大多数情况下,不再使用外键

在学校时,我们经常使用外键来关联表格,这样可以保证数据的一致性,但实际上,在很多场景下,我们并不太需要保证数据的一致性,而是需要效率,而且现在随着分布式的流行,很多情况下一个数据库已经不再适合使用,因此外键也就不再使用例如:商品表goodspublic class Goods { private Long id; //商品ID private Stri...

2018-08-27 10:20:53 1269

原创 04----------HandlerMethodArgumentResolver自定义参数转换器

有时候,我们在controller的方法中,会发现有一些方法都是在获取相同的参数,然后进行一些相同的操作,此时,我们就可以对这些操作进行处理1.继承HandlerMethodArgumentResolver,UserArgumentResolverpackage MiaoSha.config;import javax.servlet.http.Cookie;import javax...

2018-08-26 22:12:21 174

原创 03----------JSR303参数校验,自定义参数校验器和全局的异常处理器

一,参数校验1,引入相关的依赖<!-- 参数校验 -->    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-validation</artifactId>  ...

2018-08-26 15:44:35 467

原创 02----------封装redis

1.定义读取redis配置文件的配置类RedisConfigpackage MiaoSha.redis;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;/** * Redis的配置文件...

2018-08-26 11:23:50 120

原创 01----------统一封装返回信息{code,msg,data}

在实际开发过程中,我们经常要返回数据给前台,这时候就需要定义返回的code1.封装result,作为返回的对象public class Result<T> {        private int code;    private String msg;    private T data;        /**     *  成功时候的调用     * */...

2018-08-26 11:06:37 21282

原创 myeclipse下创建maven项目问题记录(创建时没有src/main/java,src/main/resources解决办法)

1:在创建一个maven项目时可能会出现没有src/main/java,src/main/resources的问题。项目右键properties进行build path,选择右侧的Source,点击Add Folder ,此时可以看到src下的main下只有Java,点击下方的Create New Folder,输入resource点击Apply,再点击Ok即可...

2018-08-25 09:24:56 1816

原创 算法练习bat----------03小和问题

小和问题:在一个数组中,每一个数左边比右边的数小的数累加起来,叫做这个数组的小和例子:[1,3,4,2,5]1左边比1小的数,没有:3左边比3小的数,1;4左边比4小的数,1,3;2左边比2小的数,1;5左边比5小的数,1,3,4,2;所以小和为1+1+3+1+1+3+4+2=16;1.常规求解:两个for循环,每次取出对应的值,遍历比较,O(n^2)...

2018-08-24 20:22:01 247

原创 算法练习bat----------02归并排序

归并排序一个重要的思想是递归,每次划分成两份,直到不能划分public static void mergeSort(int[] arr) {        if (arr == null || arr.length < 2) {//数组至少有长度为2            return;        }        mergeSort(arr, 0, arr.length - ...

2018-08-24 19:53:17 107

原创 算法练习bat----------01插入排序

默认从第一位开始从后往前比较,例如第一次比较从a[1]和a[0]位比较插入,第二次从a[2]到a[0]开始比较插入,一直到从最后一位往前比较插入public static void insertionSort(int[] arr) {        if (arr == null || arr.length < 2) {            return;        }  ...

2018-08-24 19:23:27 151

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除