此篇文章仅从理论上介绍几种Redis高级数据类型,有关各类型的具体操作,可见Redis常用命令总结更多Redis入门系列文章,参见Redis入门-大纲
Bitmapbitmap是一种伪数据类型,是基于String实现的。因为redis的key和value本身就支持二进制的存储方式,所以bitmaps只是一个独特的扩展。因为是面向字节操作,所以他的最大长度就是512M,最适合设置成2^32个不同字节。
一般的使用场景都是单一的统计,效率较高。比如签到,点击等。例如为了统计今日登录的用户数,我们建立了一个bitmap,每一位标识一个用户ID。当某个用户访问我们的网页或执行了某个操作,就在bi...
更多Redis入门系列文章,参见Redis入门-大纲
持久化方式RDB镜像全量持久化 与AOF增量持久化。
RDB:在指定的时间间隔内生成数据集的时间点快照(snapshot),执行bgsave命令后台异步保存数据到硬盘;
AOF(append-only file):持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
Redis支持同时使用AOF和RDB持久化。在这种情况下,当Redis重启时,它会优先使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整.
RDB持久化手动触发和自动触发RDB持久化是把当前进程...
更多Redis入门系列文章,参见Redis入门-大纲
过期策略定期删除定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。
惰性删除惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。
为什么不用定时删除策略?定时删除,用一个定时器来负责监视key,过期则自...
更多Redis入门系列文章,参见Redis入门-大纲
PipelineRedis提供了批量操作命令(例如mget,mset等),有效的节约RTT。但大部分命令是不支持批量操作的,例如要执行n次hgetall命令,并没有mhgetall存在,需要消耗n次RTT。Redis的客户端和服务端可能不是在不同的机器上。例如客户端在北京,Redis服务端在上海,两地直线距离为1300公里,那么1次RTT时间=1300×2/(300000×2/3)=13毫秒(这里假设光纤的速度为光速的2/3),那么客户端在1秒内大约只能执行80次左右的命令,这个和Redis的高并发高吞吐背道而驰。
Pipeline(...
Bean的生命周期(1)当调用者调用getBean(beanName)向容器请求某一个Bean时,如果容器注册了InstantiationAwareBeanPostProcessor接口,则在实例化Bean之前,将调用接口的postProcessBeforeInstantiation()方法。(2)根据配置情况调用Bean的构造函数或工厂方法实例化Bean。(3)如果容器注册了InstantiationAwareBeanPostProcessor接口,在实例化Bean之后,调用该接口的postProcessBeforeInstantiation()方法,对实例化的对象进行一些初始化设置。...
资料性内容,请善用Ctrl+F
bean注解开启注解创建bean<context:component-scan base-package=”cn.java.*“/>
@Controller:注册一个bean到spring(一般用于Controller层)@Service:注册一个bean到spring(一般用于service层)@Repository:注册一个bean到spring(一般用于dao层)@Component (不推荐使用):注册一个bean到spring,一般使用前三个来指示不同层的bean这四个表示作用一致,其区别是区分创建的层次,暂时没有功能上的意义。Bea...
本文章着重分析AOP实现中的方法链调用。阅读本文章时,强烈建议打开IDE自己跟着方法调用一层层走。建议从ProxyFactoryBean类中的getObject()方法入手。
spring与AOP有关的模块有2个,一个是spring-aop, 这是spring自己的aop实现,另一个是spring-aspect,这是利用 aspectJ的aop实现。这两者最大的区别在于Spring中AOP是基于JDK动态代理,而AspectJ是基于字节码操作。这篇文章主要介绍基于JDK动态代理的实现。
先回顾一下代理模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。代理对象可以...
本文章着重分析DI发生时的方法链调用。阅读本文章时,强烈建议打开IDE自己跟着方法调用一层层走。建议从BeanFactory类中的getBean()方法入手。
IoC容器的初始化过程仅仅是建立了BeanDefinition的数据映射。但Bean的依赖关系尚未建立。 依赖注入的触发时机有可以分为两类。对于懒加载的对象,依赖注入发生在用户第一次调用getBean()向容器索要bean时。对于非懒加载对象则是发生在容器初始化时。
doGetBean()我们先从第一类谈起。getBean()方法是依赖注入发生的地方,他的实现从AbstractBeanFactory类看起。可以看到,实际获取bea...
本文章着重分析IOC容器的初始化时的方法链调用。阅读本文章时,强烈建议打开IDE自己跟着方法调用一层层走。建议从AbstractApplicationContext类中的refresh()方法入手。
IoC容器的初始化是由refresh()方法来完成的。这个方法标志着Ioc容器的正式启动。这个方法主要执行三个功能。也就是BeanDefinition的定位、载入和注册。事实上,这个方法实际上应用了模板方法的设计模式,定义了一系列功能,具体的功能实现由子类完成。
定位定位分两步,第一步是获取Resource。AbstractApplicationContext由于继承了DefaultReso...
BeanFactory首先谈谈BeanFactory。BeanFactory是IoC容器最顶端的接口,它定义了IoC容器的基本形式与规范。例如,接口中设计了getBean()方法。这个方法是IoC容器的API的主要方法,用来取得容器中管理的bean。另外还定义了一些bean类型相关的方法,例如isSingleton(), isPrototype(),getType()等。
BeanFactory接口下面主要有两条设计线路。
DefaultListableBeanFactory第一条线路的核心是DefaultListableBeanFactory这个类。在spring中,这个类是作为一个默...