缓存机制 ehcache、redis
本文主要记录ehcache和redis实现缓存(redis版本号:5.0.3)
一、ehcache
1.ehcache:用来管理Java中缓存的轻量级工具,其核心通过CacheManager使用,一般使用于单机版,可以部署集群,但是不推荐,一般使用redis或者其他框架来实现分布式缓存。
2.缓存过期策略:FIFO(先进先出原则)、LRU(最近最少使用,即目前最久未被使用的优先淘汰)、LFU(最近不常用[算法类似于JVM中垃圾回收器的s0和s1区],在一段时间中使用次数最少)
3.使用场景:一般用做一级缓存[单机版],redis做二级缓存[集群版]
4.示列代码(给出核心部分)
二、redis(单机版)(以下给出核心代码,需要完整代码在GitHub上获取(链接在首页))
注意事项:1.在阿里云上购买的服务器,需要在阿里云的安全策略中开启redis的端口,默认是6379。
2.安装时需要将 bind 127.0.0.1 改成 bind 0.0.0.0表示外网访问。网上说注释掉 我用版本5.0.3 不行。
3.daemonize no 改成daemonize yes 表示后台开启。
4.requirepass 123 表示设置访问密码。
5.修改pidfile文件路径 pidfile /home/pro_install/redis/stand_alone/pid/redis_6379.pid
6.修改log路径 logfile /home/pro_install/redis/stand_alone/log/redis.log redis.log文件由redis自己建立
7.修改缓存数据路径 dir /home/pro_install/redis/stand_alone/cache_data
8.需要关闭防火墙。systemctl stop firewalld 表示临时关闭。
9.启动、停止、重启 比较简单这里不再赘述了。
授权对象:0.0.0.0/0 表示任何ip都可以访问。
三、redis(主从复制)
同步原理:
1:当一个从数据库启动时,会向主数据库发送sync命令。
2:主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来。
3:当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。
4:从数据库收到后,会载入快照文件并执行收到的缓存的命令。
搭建:环境为阿里云服务器,搭建一主两备一哨兵,其中端口:6380为master、6385和6386为slave、26379为哨兵监控(由于投票选举策略,搭建哨兵的数量最好为奇数)。
注意事项:1.在丛服务器中 masterauth + 主服务器的密码。
2.redis3.2版本之前采用 slaveof 指向主服务器ip,在之后用 eplicaof 指向主机的ip和端口 。
3.哨兵中sentinel monitor <master-name> <ip> <redis-port> <quorum> 即可,参数依次为: 哨兵名字,主服务器ip,主端口,投票选举数量(eg:2表示,做集群后当主服务宕机后需要几个哨兵选举丛服务器后才能竞选为主服务)。
4.其他配置项都比较简单,这里不再赘述。
四、redis(集群版) 3主3从
由于redis版本升级的问题,按照网上其他教程,可能安装不了,在这里记录下安装过,本文采用redis版本是目前最新的5.0.3。
1.集群版先不要设置密码,否者在安装卡槽时会出错。
2.安装ruby:yum install ruby
3.安装gem:gem update --system 如果报错则按下面方式安装
报错:gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDBInstalling RVM to /usr/local/rvm
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3(这个来源于某博客,忘记名字了,补充一下)
按照图示刷新配置 source /etc/profile.d/rvm.sh
4.yum install rubygems 和 gem install redis
以上是环境转变,下面搭建redis
分别建立6个保存redis数据文件夹data和6个保存pid的文件夹,如果采用端口来区分的话,可以建立6个redis.config的文件
修改redis_6390.conf
开启集群 使用rdb或者aof看个人配置了
创建集群:老版本用的是另一个启动,在目前的redis中是移除了
./redis/src/redis-cli --cluster create 127.0.0.1:6390 127.0.0.1:6391 127.0.0.1:6392 127.0.0.1:6393 127.0.0.1:6394 127.0.0.1:6395 --cluster-replicas 1
以上就搭建成功了。
注意:若先设置了密码会报一下错误
======================================
一、缓存Map(ehcache)
@Component
public class EhcacheMap<K, V> { private Map<K, V> echcache = new ConcurrentHashMap<>(); public void put(K key, V value) {
echcache.put(key, value);
} public V get(K key) {
return echcache.get(key);
} public void remove(K key) {
echcache.remove(key);
}
}
ehcache.xml(ehcache)
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <diskStore path="java.io.tmpdir/ehcache-rmi-4000" /> <!-- 多台机器配置 rmiUrls=//192.168.8.32:400002/demoCache|//192.168.5.231:400003/demoCache -->
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,rmiUrls=//127.0.0.1:5000/userCache">
</cacheManagerPeerProviderFactory>
<!-- 配置 rmi 集群模式 -->
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=127.0.0.1,port=4000,socketTimeoutMillis=120000" /> <!-- 多播方式配置 搜索某个网段上的缓存 timeToLive 0是限制在同一个服务器 1是限制在同一个子网 32是限制在同一个网站 64是限制在同一个region
128是限制在同一个大洲 255是不限制 <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic, multicastGroupAddress=224.1.1.1, multicastGroupPort=40000,
timeToLive=32" /> --> <!-- 默认缓存 -->
<defaultCache maxElementsInMemory="1000" eternal="true"
timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
diskPersistent="true" diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
<!-- name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
maxElementsInMemory:在内存中缓存的element的最大数目。
maxElementsOnDisk:在磁盘上缓存的element的最大数目,默认值为0,表示不限制。
eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。
overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上。
-->
<cache name="userCache" maxElementsInMemory="1000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
<!-- 用于在初始化缓存,以及自动设置 -->
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />
</cache>
</ehcache>
controller(ehcache)
@RestController
public class EhcacheSingleVersionController { @Autowired
private UserService userService; @Autowired
private CacheManager cacheManager; @Autowired
private EhcacheMap<String, String> ehcacheMap; @RequestMapping("/clear")
public String clear() { cacheManager.getCache("userCache").clear(); return "success";
} @RequestMapping("/getUser")
public List<User> getUser(Long id) { return userService.getUser(id);
} @RequestMapping("/save")
public String save(String name, Long id) { ehcacheMap.put(id.toString(), name); return "success";
}
}
dao(ehcache)
@CacheConfig(cacheNames = "userCache")
public interface UserMapper { @Select("SELECT ID ,NAME,AGE FROM user where id=#{id}")
@Cacheable
List<User> getUser(@Param("id") Long id); }
手动修改数据库值(ehcache)
二、redis单机版
1.yml配置文件
spring:
datasource:
url: jdbc:mysql://localhost:3306/mytest?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
test-while-idle: true
test-on-borrow: true
validation-query: SELECT 1 FROM DUAL
time-between-eviction-runs-millis: 300000
min-evictable-idle-time-millis: 1800000
# 缓存配置
cache:
type: ehcache
ehcache:
config: classpath:ehcache.xml
# redis
redis:
database: 0
host: xxx
port: 6379
password: xxx
jedis:
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
timeout: 10000
2.redisUtil
@Component
public class RedisUtil { @Autowired
private StringRedisTemplate stringRedisTemplate; public void set(String key, Object obj, Long timeout) {
if(obj instanceof String) {
setString(key, obj);
} else if(obj instanceof Set) {
setSet(key, obj);
}
// 设置有效期
if(timeout != null) {
stringRedisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}
} private void setSet(String key, Object obj) { @SuppressWarnings("unchecked")
Set<String> value = (Set<String>) obj;
for (String str : value) {
stringRedisTemplate.opsForSet().add(key, str);
}
} private void setString(String key, Object obj) { String value = (String)obj; stringRedisTemplate.opsForValue().set(key, value);;
} }
3.Controller
@RestController
public class RedisSingleVersionController { @Autowired
private RedisUtil redisUtil; @RequestMapping("/setStr")
public String setStr(String key, String value) { String result = "success"; try {
redisUtil.set(key, value, null);
} catch (Exception e) {
e.printStackTrace();
result = "error";
} return result;
} @RequestMapping("/set")
public String set(String key) { String result = "success"; try {
Set<String> value = new HashSet<String>();
value.add("t1");
value.add("t2");
value.add("t3");
redisUtil.set(key, value, null);
} catch (Exception e) {
e.printStackTrace();
result = "error";
} return result;
}
}
4.运行
缓存机制 ehcache、redis的更多相关文章
- Spring(五)Spring缓存机制与Redis的结合
一.Redis和数据库的结合 使用Redis可以优化性能,但是存在Redis的数据和数据库同步的问题. 例如,T1时刻以将 key1 保存数据到 Redis,T2时刻刷新进入数据库,但是T3时刻发生了 ...
- Spring控制Hibernate的缓存机制ehcache
首先在spring.xml中进入bean <prop key="hibernate.cache.use_second_level_cache">true</pro ...
- 缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)
一.JVM内置缓存(值存放在JVM缓存中) 我们可以先了解一下Cookie,Session,和Cache Cookie:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cooki ...
- MyBatis加强(1)~缓存机制(一级缓存、二级缓存、第三方缓存技术redis、ehcache)
一.缓存机制 使用缓存可以使应用更快地获取数据,避免频繁的数据库交互操作,尤其是在查询越多,缓存命中率越高 的情况下,缓存的作用就越明显. 1.缓存原理:Map ■ 查询时,先从缓存区查询:找到,返回 ...
- EhCache+Redis实现分布式缓存
Ehcache集群模式 由于 EhCache 是进程中的缓存系统,一旦将应用部署在集群环境中,每一个节点维护各自的缓存数据,当某个节点对缓存数据进行更新,这些更新的数据无法在其它节点中共享,这不仅会降 ...
- (37)Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] 写后感:博主写这么一系列文章也不容易啊,请评论支持下. 如果看过我之前(35)的文章这一篇的文章就会很简单,没有什么挑战性了. 那么我们先说说这一篇文 ...
- (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] 本文章牵涉到的技术点比较多:Spring Data JPA.Redis.Spring MVC,Spirng Cache,所以在看这篇文章的时候,需要对 ...
- Spring Boot集成EHCache实现缓存机制
SpringBoot 缓存(EhCache 2.x 篇) SpringBoot 缓存 在 Spring Boot中,通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManag ...
- SpringBoot缓存篇Ⅱ --- 整合Redis以及序列化机制
一.Redis环境搭建 系统默认是使用ConcurrentMapCacheManager,然后获取和创建ConcurrentMapCache类型的缓存组件,再将数据保存在ConcurrentMap中 ...
随机推荐
- SpringMVC+Spring+Hibernate整合开发
最近突然想认真研究下java web常用框架,虽然现在一直在用,但实现的整体流程不是很了解,就在网上搜索资料,尝试自己搭建,以下是自己的搭建及测试过程. 一.准备工作: 1/安装并配置java运行环境 ...
- vs查找功能不显示查找结果
今天打开vs,查找的时候发现查找结果窗口不出现了,导致看不到查找结果. 网上各种搜索,甚至看到不少说什么要重装vs的解决方案,我也是醉了...... 其实解决办法很简单啊 vs--窗口--重置窗口布局 ...
- 使用CompletionService结合ExecutorService批处理调用存储过程任务实例
此实例为java多线程并发调用存储过程实例,只做代码记载,不做详细描述 1.线程池构造初始化类CommonExecutorService.java package com.pupeiyuan.go; ...
- 20165328 实验四《Andriid应用开发》实验报告
一.实验一:Andriod Stuidio的安装测试: 实验要求: 参考 ...
- Spring设置定时任务时,关于执行时间的规则设置
been需要在xml文件中进行配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE bean ...
- 期货大赛项目|八,ueditor的应用
百度开发的富文本编辑器还是很不错的,可以已经不维护了 下载ueditor1_4_3_3-utf8-net放到项目中 找到net文件夹下config.json 修改以下两行 "imageUrl ...
- maya cmds pymel undoInfo chunk 撤销束
maya cmds pymel undoInfo chunk 撤销束 cmds.undoInfo(openChunk = 1) # your code cmds.undoInfo(closeChunk ...
- Imcash解读:哪些行业的“饭碗”最容易受区块链的影响?
或许,你已经听到很多人说,区块链是本世纪一项伟大的革命性技术,在未来“前途无量”. 但是,很少有人能真正接地气地举例说清楚:区块链到底怎么革命,革谁的命,怎么产生价值,将会颠覆哪些行业. 今天,我们就 ...
- 微信小程序--家庭记账本开发--07
最终展示以及相关代码 1.最终效果展示 最终效果展示已经根据最初要求使用视频拍摄在抖音上,下面是相关页面展示图片: 2.相关代码 本次开发主要页面则是首页界面以及记账界面以及实现页面跳转,以及记账内容 ...
- 取消layUI中日期选择控件默认填充日期
input标签中使用日期选择控件填写,加载时默认填充当前日期, 标签设置了placeholder="请选择" autocomplete="off",但是并没有效 ...