如何给web项目添加redis服务 JAVA几种缓存技术 ehcache和redis哪个更好
2015-11-07 15:27
1701 查看
redis无论是存储、队列还是缓存,集群都有它的用武之地
所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。
缓存主要可分为二大类:
一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;
二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查.
redis缓存服务器笔记
redis是一个高性能的key-value存储系统,能够作为缓存框架和队列
但是由于他是一个内存内存系统,这些数据还是要存储到数据库中的
作为缓存框架:
create/updae/delete---同时存到redis和数据库
query--先从redis查,没有记录才从数据库查,并把从数据库查的结果也放一份到redis
java使用redis的客户端一般是:jedis
jedis的原生接口只支持基本数据类型和String、byte[]
既然要用,说明已经对redis是干什么的,特点是什么,对项目有什么好处,需要缓存什么东西等问题都了解过了,所以我们直接开搞:
我是在windows下用的,所以来说下:到从redis官网连接过去的redisServer下载redis-2.8.19.zip,解压之后运行redis-server.exe即可,然后打开redis-cli.exe就可以使用了。一般这个只是用来测试连接和查看monitor用的。
一般web应用中,我们还会用到spring,方便的地方在于spring本身也提供了对redis的支持--spring-data-redis,可以到官网查看文档,并有实例。
具体步骤:
1.引入pom依赖(如果没用maven的话,自行引入jar包吧)
同时将jedis也依赖上,因为spring-data-redis底层就是用的jedis:
2.在容器中配置RedisTemplate实例
注意:这是官网直接复制过来的,我这样直接放在xml中,会报错,即使是引入p的命名空间。然后我就尝试将p属性写成property后,就没有报错了,但是在后面用的时候会key和value会出现类似"\xac\xed\x00\x05t\x00\tb "这样的情况,查询得知这是因为spring-data-redis需要将数据存储到jedis中,这中间需要序列化,再由jedis存储到数据库,问题就出在序列化上了,它会将key和value的类型信息也序列化后带上,这显然不是我们想要的结果。
所以RedisTemplate提供了对key和value序列化类,于是我打算这样:
可是中间两个序列化类还是报错,没有无参构造器,所以就准备采用构造器注入的方式,但是要求注入的参数是一个Object.class类型,我也不知道怎么注入这种类型的,搞来搞去还是干脆就不要xml了,直接写配置类:
这下可算可以了(当然要注意扫描包)。
有了RedisTemplate之后,就可以写具体的实现业务类了,RedisTemplate基本支持所有redis操作,比如:
最后,启动redis-server.exe就可以了(这里要注意要先启动这个,再启动web项目,否则启动不了,原因未知),如果对redis比较熟悉的,可以自行配置redis.windows.conf文件。其实我也不太熟悉conf文件里面的配置,尤其是持久化到磁盘那个。所以在我的项目里,我是将数据以每天为单位保存到mysql中,并清空redis。
做了2年开发,一直没用过缓存技术。最近公司要求使用缓存,经过调研发现应该是redis比较流行,轻量级的nosql技术。我现在的疑问是,怎么在项目在使用的。缓存服务器器开启后,客户端请求数据后,把这次的SQL语句作为key存入redis,把result作为value存入redis,如果下一次同一条SQL语句的话,就从缓存取。那么同一条SQL数据,数据库里已经有数据更新了,怎么办?redis是怎么知道的。或者我这个想法本身就是不对的呢?
redis 负载均衡 集群配置 - ayanmw - 博客园
所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。
缓存主要可分为二大类:
一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;
二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查.
redis缓存服务器笔记
redis是一个高性能的key-value存储系统,能够作为缓存框架和队列
但是由于他是一个内存内存系统,这些数据还是要存储到数据库中的
作为缓存框架:
create/updae/delete---同时存到redis和数据库
query--先从redis查,没有记录才从数据库查,并把从数据库查的结果也放一份到redis
java使用redis的客户端一般是:jedis
jedis的原生接口只支持基本数据类型和String、byte[]
前言
这两天项目用到redis,而我自己也正准备看这个,所以就从头开始学习了一遍。既然要用,说明已经对redis是干什么的,特点是什么,对项目有什么好处,需要缓存什么东西等问题都了解过了,所以我们直接开搞:
怎么获取redis
安装redis,linux下wget到github的源码,然后直接make就行了,比较简单。我是在windows下用的,所以来说下:到从redis官网连接过去的redisServer下载redis-2.8.19.zip,解压之后运行redis-server.exe即可,然后打开redis-cli.exe就可以使用了。一般这个只是用来测试连接和查看monitor用的。
java端如何使用redis
在java项目中,redis提供了很多客户端库,我用的jedis,它封装了对redis数据库的所有操作。一般web应用中,我们还会用到spring,方便的地方在于spring本身也提供了对redis的支持--spring-data-redis,可以到官网查看文档,并有实例。
具体步骤:
1.引入pom依赖(如果没用maven的话,自行引入jar包吧)
<dependencies> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.5.0.RELEASE</version> </dependency> </dependencies>
同时将jedis也依赖上,因为spring-data-redis底层就是用的jedis:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.0</version> <type>jar</type> <scope>compile</scope> </dependency>
2.在容器中配置RedisTemplate实例
<bean id="jedisConnFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true"/> <!-- redis template definition --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnFactory"/>
注意:这是官网直接复制过来的,我这样直接放在xml中,会报错,即使是引入p的命名空间。然后我就尝试将p属性写成property后,就没有报错了,但是在后面用的时候会key和value会出现类似"\xac\xed\x00\x05t\x00\tb "这样的情况,查询得知这是因为spring-data-redis需要将数据存储到jedis中,这中间需要序列化,再由jedis存储到数据库,问题就出在序列化上了,它会将key和value的类型信息也序列化后带上,这显然不是我们想要的结果。
所以RedisTemplate提供了对key和value序列化类,于是我打算这样:
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisConnFactory"/> <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <property name="hashKeySerializer"> <bean class="org.springframework.data.redis.serializer.GenericToStringSerializer"/> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.GenericToStringSerializer"/> </property> <property name="hashValueSerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> </bean>
可是中间两个序列化类还是报错,没有无参构造器,所以就准备采用构造器注入的方式,但是要求注入的参数是一个Object.class类型,我也不知道怎么注入这种类型的,搞来搞去还是干脆就不要xml了,直接写配置类:
@Configuration public class RedisConfig { @Bean JedisConnectionFactory jedisConnectionFactory() { return new JedisConnectionFactory(); } @Bean RedisTemplate<String, Object> redisTemplate() { final RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(jedisConnectionFactory()); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new GenericToStringSerializer<>(Object.class)); template.setValueSerializer(new GenericToStringSerializer<>(Object.class)); return template; } }
这下可算可以了(当然要注意扫描包)。
有了RedisTemplate之后,就可以写具体的实现业务类了,RedisTemplate基本支持所有redis操作,比如:
@Component public class SpringRedisClientImpl implements SpringRedisClient { @Autowired private RedisTemplate<String, Object> template; @Autowired private JedisConnectionFactory jedisConnectionFactory; @Override public void setKey(String key, String value) { template.opsForValue().set(key, value); } @Override public Object getKey(String key) { return template.opsForValue().get(key); } @Override public void incr(String key) { template.opsForValue().increment(key, 1); } @Override public void lPush(String key, String value) { template.opsForList().leftPush(key, value); } @Override public boolean checkKey(String key) { return template.hasKey(key); } @Override public Object lIndex(String key) { return template.opsForList().index(key, 0); } @Override public Long llength(String key) { return template.opsForList().size(key); } @Override public String lpop(String key) { return (String) template.opsForList().leftPop(key); } @Override public Set<String> getKeys(String pattern) { return template.keys(pattern); } @Override public void flushAll() { Jedis jedis = jedisConnectionFactory.getShardInfo().createResource(); jedis.flushAll(); jedis.close(); } }
最后,启动redis-server.exe就可以了(这里要注意要先启动这个,再启动web项目,否则启动不了,原因未知),如果对redis比较熟悉的,可以自行配置redis.windows.conf文件。其实我也不太熟悉conf文件里面的配置,尤其是持久化到磁盘那个。所以在我的项目里,我是将数据以每天为单位保存到mysql中,并清空redis。
做了2年开发,一直没用过缓存技术。最近公司要求使用缓存,经过调研发现应该是redis比较流行,轻量级的nosql技术。我现在的疑问是,怎么在项目在使用的。缓存服务器器开启后,客户端请求数据后,把这次的SQL语句作为key存入redis,把result作为value存入redis,如果下一次同一条SQL语句的话,就从缓存取。那么同一条SQL数据,数据库里已经有数据更新了,怎么办?redis是怎么知道的。或者我这个想法本身就是不对的呢?
redis 负载均衡 集群配置 - ayanmw - 博客园
相关文章推荐
- json4s+rediscala实现kafka到spark streaming到redis
- Redis系统管理
- redis命令String
- Redis数据类型
- 安装redis
- redis 绑定任意ip
- Redis简介与安装【实验楼学习笔记】
- Quartz 定时任务(含Redis)
- redis命令学习笔记
- elk+redis centos6.6安装与配置
- spring集成jedis支持redis3.0集群
- NodeJS+Redis实现分布式Session方案
- redis3.0集群状态监控for zabbix 需要python2.7
- redis3.0集群状态监控脚本用于zabbix监控需要python2.6
- redis常用命令
- java对redis各种数据类型的基本操作
- redis集群实战
- 使用HAProxy、PHP、Redis和MySQL支撑10亿请求每周架构细节
- Ubuntu下安装redis及php扩展
- ubuntu 安装redis