在应用 spring 框架进行开发时,我们常常用@Resource 和@Autowired 注解进行依赖注入

在开发过程中仿佛这两者应用起来并没有什么区别,但是其实这两个注解本质上就是不一样的

区别如下:

  • @Resource 是由 java 提供的注解,而@Autowired 是由 spring 提供的

  • @Resource 是 ByName,而@Autowired 是 ByType

  • @Autowire 注入时 ByType 如果要使用 ByName 需要配合@Qualifier

1
2
3
@Autowire
@Qualifier"orderService"
private OrderService orderService;
阅读全文 »

关于

在工作中遇到数据类型不同,需要采用不同的方式处理,常见的写法是根据条件进行判断,采用 if…else… 或者 switch 的方式

比如我最近在写的工单,不同类型工单需要的数据和处理逻辑各有区别

由于工单类型比较多,想到要写一堆 if…else…我就头大,这样的代码太丑,我不喜欢…

略一思考,用策略模式去实现,就清爽很多

阅读全文 »

公司的一个服务用了一个单台 redis 服务器,本来配置 redis 的 maxmemory 只有 512M,但是服务跑了几个月都没什么问题,说明是够用的。

但是最近不到一个月的时间的时间,这台服务器的 redis 报了两次内存不足,最开始是以为调用量慢慢上来了,所以只是单纯的修改 maxmemory 的值,修改到了 3g。

昨天观察了一下发现内存占用已经到了 2.3g 了,这马上又快满了,觉得不对劲,所以想要分析一下是哪些 key 占用的空间比较大,看看能不能相应的优化一下代码

环境

  • CentOS Linux release 7.2.1511

  • redis-5.0.4

  • python2.7

  • git

阅读全文 »

什么是缓存雪崩

缓存雪崩通常是指缓存大面积失效,或者 Redis 宕机,大量的请求直接去请求到了数据库,在并发大的情况下可能直接导致数据库宕机

出现缓存雪崩的原因

在将数据存入缓存的时间我们通常都需要为缓存设置过期时间,避免缓存长时间占用内存资源,当然也会配合 redis 的淘汰策略对缓存进行失效淘汰

假如缓存设置的过期时间是相同的并且刚好在同一时刻全部失效,或者 Redis 宕机,就会造成所谓的缓存雪崩

阅读全文 »

什么是缓存穿透和缓存击穿

缓存穿透和缓存击穿是存在区别的两种情况:

  • 缓存穿透

要查询的数据本来就不存在于缓存,也不存在于数据库。当各种请求进来查询的时候,先查缓存,没有查到就会去持久层查询数据库,依旧查不到。下一个请求再来查的时候还是相同的情况。

在这种情况下,缓存这一层相当于不存在,所有请求直接查询了数据库

阅读全文 »

为什么要用缓存

缓存主要是为了支持高性能/高并发的处理逻辑,以及缓解数据库的压力

不考虑持久化的情况,缓存中的数据基本上都是存在于内存中,相比于查询数据库,程序读取内存的速度要快的多

假设没有缓存,程序直接读取数据库,在高并发的情况下,很容易导致数据库宕机

什么是数据库缓存读写一致性

阅读全文 »

为什么要用分布式锁

在开发过程中,涉及到单服务多实例同时运行,某些操作例如定时任务跑批/更新数据等,为了避免多个实例同时对同一共享资源进行多次操作或者重复操作,我们需要分布式锁来进行并发协调

单 Redis 实例实现分布式锁

获取锁使用命令: SET resource_name my_random_value NX PX 30000

这个命令利用了 redis 2.6.12 版本以后提供的 set (ex nx px xx) 指令, 这个指令支持对 set 指令设置参数

阅读全文 »

Redis 支持 5 种基本数据类型: string(字符串) / hash(哈希) / list(列表) / set(无序集合) / zset(有序集合)

1.string

string 是 Redis 最基本的类型,string 类型是二进制安全的,string 类型可以包含任何数据,例如图片二进制流或者序列化之后的对象

string 类型最大能存储 512M 的内容

操作string

阅读全文 »