Cache Travel-09-从零手写 redis(零)为什么手写 redis
redis 的重要性
做 java 的,天天喊着高性能,高并发,高可用。
高性能之中,基本上都离不开 redis。
特别是在当今对于性能要求越来越高的时代,mysql 等传统数据库越来越需要与 redis 结合,这样才能更好的适应我们的业务。
以前手写过一次 hades,觉得不满意,就废弃了。
本次重新再写一次。
开源地址:
https://github.com/houb...
2018-09-01 04:24:42 |
Cache
Cache Travel-08-更好的使用缓存
基本概念
在合理应用缓存前,需要了解缓存领域里相关的几个常用术语:
1)缓存命中:表示数据能够从缓存中获取,不需要回源;
2)Cache miss:表示没有命中缓存,如果缓存内存中还有内存空间的话,会将数据加入到缓存中;
3)存储成本:当没有命中缓存时,回源获取后会将数据放置到存储中,整个将数据放置到存储空间所需要的时间以及空间称之为存储成本;
4)缓存失效:当源数据发生变更后,意...
2018-09-01 04:24:42 |
Cache
Cache Travel-07-如何正确的缓存
业务场景
本文讨论的是对于按需创建的数据库记录,如何实现缓存?
获取 id
例如,考察一个按需创建Account并返回其ID的函数:
@Transactional
public Long getAccount(Long userId, String currency) {
String key = buildCacheKey(userId, currency);
Lo...
2018-09-01 04:24:42 |
Cache
Cache Travel-06-Tair
Tair
Tair 是快速访问内存(MDB)/持久性(LDB)存储服务。
Tair采用高性能、高可用的分布式集群架构,可以满足业务对读写性能和可扩展容量的高要求。
项目结构
System architecture
Tair 集群具有三个必要的模块:ConfigServer、DataServer 和客户端。
一般来说,一个Tair集群包括两台ConfigServer和多台DataS...
2018-09-01 04:24:42 |
Cache
Cache Travel-05-LRUMAP
LRU
本文通过对 Apache Commons Collections 项目中 LRUMap 这个集合类的源代码进行详细解读,为帮助大家更好的了解这个集合类的实现原理以及使用如何该集合类。
算法简介
首先介绍一下LRU算法。
LRU 是由 Least Recently Used 的首字母组成,表示最近最少使用的含义,一般使用在对象淘汰算法上。也是比较常见的一种淘汰算法。
简单的实...
2018-09-01 04:24:42 |
Cache
Cache Travel-04-in action
优化方案
限额限次短期优化方案:
基础方案
(1)添加 merId 过滤条件,便于命中联合索引。 (索引)
(2)每一层统计,次数和金额并行执行(从概率上来说,拦截是低概率,压力还是会到 mongodb )
fixed(2) 固定线程数2(并行)
注意日志的 logId
(3)添加表为对应业务的分表。(分表,效果一般)
(4)降低存储量。专门为限额建立表(降低单条数据量)
全...
2018-09-01 04:24:42 |
Cache
Cache Travel-03-进程内缓存,服务间传递数据选择 mq 还是 cache?数据一致性问题
进程内缓存
概念
java应用缓存一般分两种,一是进程内缓存,就是使用java应用虚拟机内存的缓存;另一个是进程外缓存,现在我们常用的各种分布式缓存。相比较而言,进程内缓存比进程外缓存快很多,而且编码也简单;但是,进程内缓存的存储量有限,使用的是java应用虚拟机的内存,而且每个应用都要存储一份,有一定的资源浪费。进程外缓存相比进程内缓存,会慢些,但是,存储空间可以横向扩展,不受限制。
...
2018-09-01 04:24:42 |
Cache
Cache Travel-02-history
IQiyi 的缓存发展之路
数据同步加 redis
通过消息队列进行数据同步至redis,然后Java应用直接去取缓存
优点
由于是使用的分布式缓存,所以数据更新快。
缺点
缺点也比较明显:依赖Redis的稳定性,一旦redis挂了,整个缓存系统不可用,造成缓存雪崩,所有请求打到 DB。
JavaMap 到 Guava cache
这个阶段使用进程内缓存作为一...
2018-09-01 04:24:42 |
Java